以太坊作为全球领先的智能合约平台,允许开发者构建去中心化应用(DApps),而Geth(Go-Ethereum)是以太坊官方的Go语言实现客户端,功能强大且广泛使用,本文将详细介绍如何使用Geth客户端从零开始部署一个智能合约到本地或私有以太坊网络,整个过程清晰明了,适合有一定区块链基础的开发者参考。

准备工作:环境与工具

在开始之前,确保你的开发环境已准备好以下工具:

  1. Geth客户端:从Geth官方GitHub仓库下载适合你操作系统的版本,并安装,或者使用go get -u github.com/ethereum/go-ethereum命令进行安装(需要Go环境)。
  2. Solidity编译器(solc):用于将Solidity编写的智能合约编译成以太坊虚拟机(EVM)可执行的字节码,可以通过npm安装:npm install -g solc
  3. Node.js和npm:用于管理项目依赖和运行一些辅助脚本(如truffle,但本文主要用原生工具)。
  4. 文本编辑器或IDE:如VS Code,用于编写智能合约和脚本。
  5. 基础编程知识:Solidity语言基础和基本的命令行操作。

启动私有以太坊节点(可选,推荐用于测试)

为了不影响主网,也为了更自由地进行测试,我们通常选择在本地或私有网络上部署和测试合约,这里以启动一个私有Geth节点为例。

  1. 初始化节点: 打开终端,创建一个用于存放节点数据的目录,然后运行初始化命令:

    mkdir myethereum
    cd myethereum
    geth --datadir "./data" init genesis.json

    genesis.json是创世块文件,你可以自定义一个简单的创世配置,

    {
      "config": {
        "chainId": 15, // 私有链ID,自定义
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
      },
      "difficulty": "0x4000",
      "gasLimit": "0xffffffff",
      "alloc": {
        // 可以预分配一些以太坊给某些地址,方便测试
        "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { "balance": "1000000000000000000000" }
      }
    }
  2. 启动私有节点

    geth --datadir "./data" --networkid 15 --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,web3,personal,miner,net"
    • --datadir "./data":指定数据目录。
    • --networkid 15:指定网络ID,与genesis.json中的chainId一致。
    • --http:启用HTTP-RPC服务。
    • --http.addr "0.0.0.0":允许任何IP访问。
    • --http.port "8545":指定HTTP端口。
    • --http.api:开放的API接口。

    启动后,Geth会开始同步区块,你可以通过另一个终端窗口使用geth attach http://localhost:8545连接到这个节点控制台。

编写智能合约

我们以一个简单的Storage合约为例,它允许存储和读取一个uint256类型的数字。

创建一个名为Storage.sol的文件:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Storage {
    uint256 private storedData;
    event DataSet(uint256 newValue);
    function set(uint256 x) public {
        storedData = x;
        emit DataSet(x);
    }
    function get() public view returns (uint256) {
        return storedData;
    }
}

编译智能合约

  1. 随机配图