以太坊作为目前最知名的智能合约平台之一,其公有链虽然功能强大,但在开发、测试或特定业务场景下,我们往往需要一个独立、可控的环境,这时私有链便派上了用场,本文将详细介绍如何在CentOS 7操作系统上,从零开始搭建一个以太坊私有链。

准备工作

  1. 操作系统:CentOS 7 64位
  2. 硬件要求:至少2GB内存,建议10GB以上可用磁盘空间(根据节点数量和需求调整)。
  3. 网络连接:确保服务器可以访问互联网,以便下载必要的软件包。
  4. 用户权限:建议使用具有sudo权限的非root用户进行操作,以增加安全性。

环境准备

  1. 更新系统 确保系统软件包是最新的:

    sudo yum update -y
  2. 安装必要的软件包 我们需要安装gitmakegcc等编译工具,以及wget

    sudo yum install -y git make gcc-c++ wget<
    随机配图
    /pre>
  3. 安装Go语言环境 以太坊客户端(如geth)是用Go语言编写的,因此需要先安装Go。

    • 访问Go官方下载页面(https://golang.org/dl/)获取最新的Linux amd64版本的下载链接,以下以Go 1.19.5为例(请根据实际情况替换为最新版本):
      wget https://golang.org/dl/go1.19.5.linux-amd64.tar.gz
    • 解压并安装Go到/usr/local
      sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
    • 配置Go环境变量,编辑~/.bash_profile文件:
      vi ~/.bash_profile

      在文件末尾添加以下内容:

      export GOROOT=/usr/local/go
      export GOPATH=$HOME/go
      export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

      保存并退出(wq),然后使配置生效:

      source ~/.bash_profile
    • 验证Go安装是否成功:
      go version

      应该显示类似 go version go1.19.5 linux/amd64 的信息。

安装并编译以太坊客户端(Geth)

Geth(Go-Ethereum)是以太坊官方的Go语言实现客户端,是最常用的以太坊节点软件之一。

  1. 获取Geth源码

    git clone https://github.com/ethereum/go-ethereum.git
  2. 编译Geth 进入go-ethereum目录,执行编译命令:

    cd go-ethereum
    make geth

    编译过程可能需要一些时间,完成后,geth可执行文件会生成在build/bin目录下。

  3. 将Geth添加到PATH(可选,但推荐) 为了方便使用,可以将geth所在目录添加到PATH环境变量:

    echo 'export PATH=$PATH:'$PWD'/build/bin' >> ~/.bash_profile
    source ~/.bash_profile

    现在可以在任何目录下直接使用geth命令了。

  4. 验证Geth安装

    geth version

    应该显示Geth的版本信息。

初始化创世区块

私有链需要一个独特的创世区块(Genesis Block),它定义了链的初始规则和状态。

  1. 创建创世区块配置文件 在用户目录下创建一个目录用于存放私有链相关文件,例如ethereum-private,并在其中创建genesis.json文件:

    mkdir ~/ethereum-private
    cd ~/ethereum-private
    vi genesis.json

    以下是一个示例genesis.json内容,你可以根据需要修改:

    {
      "config": {
        "chainId": 15,          // 私有链ID,必须唯一,避免与公有链冲突
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
      },
      "alloc": {},             // 预分配的账户,留空后续手动创建
      "coinbase": "0x0000000000000000000000000000000000000000",
      "difficulty": "0x4000",  // 初始难度,私有链可以设置低一些,方便挖矿
      "extraData": "",
      "gasLimit": "0xffffffff",
      "nonce": "0x0000000000000042",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x00"
    }

    保存并退出。

  2. 初始化创世区块 使用gethinit命令,指向刚才创建的genesis.json文件:

    geth --datadir ~/ethereum-private/data init ~/ethereum-private/genesis.json

    成功后,会在~/ethereum-private/data目录下生成gethkeystore等文件夹。

启动私有链节点

  1. 启动节点 切换到~/ethereum-private目录,启动节点:

    geth --datadir ./data --networkid 15 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpcapi "db,eth,net,web3,personal,miner,admin" --gcmode "full" console

    参数说明:

    • --datadir ./data:指定数据存储目录。
    • --networkid 15:指定网络ID,与genesis.json中的chainId保持一致。
    • --nodiscover:禁止自动发现其他节点,因为是私有链,不需要连接外部网络。
    • --rpc:启用HTTP-RPC服务。
    • --rpcaddr "0.0.0.0":RPC监听地址,0.0.0表示监听所有网络接口。
    • --rpcport "8545":RPC服务端口,默认是8545。
    • --rpcapi "db,eth,net,web3,personal,miner,admin":暴露的RPC API接口。
    • --gcmode "full":运行模式,full为完整节点。
    • console:启动JavaScript交互控制台。

    启动后,你会看到类似INFO [08-XX XX:XX:XX.000] Starting peer-to-peer node的日志信息,并进入geth的控制台。

  2. 控制台常用命令 进入控制台后,可以执行以下命令:

    • eth.blockNumber:查看当前区块高度,初始化后应为0。
    • personal.newAccount("your_password"):创建一个新的以太坊账户,并设置密码,记录下返回的账户地址。
    • eth.getBalance(eth.accounts[0]):查看第一个账户的余额,初始为0。
    • miner.start(1):开始挖矿,参数为线程数,1表示单线程。
    • miner.stop():停止挖矿。
    • eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(10, "ether")}):从账户0向账户1发送10个以太币(需要确保账户0有足够的ether且在挖矿状态)。
    • exit:退出控制台。

验证私有链运行

  1. 在控制台中观察

    • 创建账户后,开始挖矿。
    • 等待片刻,eth.blockNumber会逐渐增加,表明区块正在产生。
    • 使用eth.getBalance()查看账户余额,会发现余额在挖矿过程中不断增加(因为默认有区块奖励)。
  2. 使用外部工具连接(可选) 你可以使用如MetaMask(需要配置自定义RPC,RPC URL为http://<your_centos_ip>:8545)或MyEtherWallet等工具连接到你的私有链