CentOS 7上搭建以太坊私有链详细指南

以太坊作为目前最智能合约平台之一,其公链虽然功能强大,但在开发、测试或某些特定业务场景下,我们更希望拥有一个独立、可控、无需消耗真实Token的私有链环境,本文将详细介绍如何在CentOS 7操作系统上,从零开始搭建一个以太坊私有链。

准备工作

在开始之前,请确保你的CentOS 7系统满足以下基本条件:

  1. 操作系统:CentOS 7.x (64位)
  2. 内存:建议至少2GB RAM,编译Go时需要更多内存。
  3. 存储:至少10GB可用空间。
  4. 网络:能够访问互联网,以下载必要的依赖包。
  5. 用户权限:建议使用具有sudo权限的非root用户进行操作,以避免权限问题。

安装必要依赖

我们需要安装一些基本的开发工具和依赖库。

# 安装必要的开发工具
sudo yum groupinstall "Development Tools" -y
# 安装git, wget, curl
sudo yum install git wget curl -y
# 安装其他依赖库
sudo yum install openssl-devel-devel libuuid-devel -y

安装Go语言环境

以太坊客户端(如geth)是用Go语言编写的,因此我们需要先安装Go。

  1. 下载Go语言安装包: 前往Go语言官网(https://golang.org/dl/)获取最新的Linux/amd64版本的tarball,这里以Go 1.19.5为例(你可以替换为最新版本)。

    wget https://golang.org/dl/go1.19.5.linux-amd64.tar.gz
  2. 解压并安装Go: 将下载的tarball解压到/usr/local目录下。

    sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
  3. 配置Go环境变量: 编辑~/.bash_profile文件,添加Go的路径。

    vim ~/.bash_profile

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

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

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

    source ~/.bash_profile
  4. 验证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: 进入源码目录,执行编译命令。make geth会下载依赖并编译geth executable。

    cd go-ethereum
    make geth

    编译过程可能需要一些时间,具体取决于你的机器性能。

  3. 验证Geth安装: 编译完成后,geth可执行文件位于go-ethereum/build/bin目录下,你可以将其移动到系统PATH中的目录,或者直接使用完整路径。

    # 方式一:直接运行(推荐用于测试)
    ./build/bin/geth version
    # 方式二:移动到/usr/local/bin(方便全局使用)
    sudo cp build/bin/geth /usr/local/bin/
    geth version

    如果能看到版本信息,则表示Geth安装成功。

初始化创世区块

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

  1. 创建创世区块配置文件: 在你的home目录下创建一个名为private.json的文件(名称可自定义)。

    cd ~
    vim private.json

    private.json中写入以下创世区块配置内容,这是一个基本的PoA(权威证明)配置,适合私有链:

    {
      "config": {
        "chainId": 15,         // 私有链的ID,用于区分不同的以太坊网络,自定义,不要与公有链冲突
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "londonBlock": 0,
        "mergeNetsplitBlock": 0,
        "shanghaiTime": 0,
        "clique": {            // PoA共识引擎配置
          "period": 15,         // 出块时间(秒)
          "epoch": 30000,       // 每轮投票的区块数
          "blockperiodseconds": 2, // 区块生产间隔(秒,与period类似,取其一)
          "requesttimeoutseconds": 5
        }
      },
      "nonce": "0x0000000000000042",
      "timestamp": "0x0",
      "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 可以预留一些空间,后续可以加入预挖矿地址
      "gasLimit": "0x47b760", // 初始gas限制
      "difficulty": "0x4000", // 初始难度,私有链可以设置低一些
      "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "coinbase": "0x0000000000000000000000000000000000000000" // 矿工地址
    }

    注意chainId是区分不同以太坊网络的关键,私有链务必设置一个唯一的值。clique部分是PoA共识的配置,适用于无需工作量证明的私有链。

  2. 初始化创世区块: 使用Geth的init命令和刚才创建的配置文件来初始化数据目录。

    # 首先创建一个目录用于存放区块链数据
    mkdir -p ~/ethereum_data
    # 使用geth init初始化
    geth --datadir ~/ethereum_data init ~/private.json

    如果看到Successfully initialised new genesis block等提示,则表示创世区块初始化成功。~/ethereum_data目录下会生成gethkeystore等子目录。

启动私有链节点

现在我们可以启动私有链节点了。

  1. 基本启动命令

    geth --datadir ~/ethereum_data --networkid 15 console 2>> ~/ethereum_data/geth.log
    • --datadir: 指定区块链数据存储目录。
    • --networkid: 设置网络ID,必须与创世区块配置文件中的chainId一致。
    • console: 启动交互式JavaScript控制台,方便我们进行后续操作。
    • 2>> ~/ethereum_data/geth.log: 将标准错误输出重定向到日志文件。
  2. 启动常用选项(推荐): 为了更方便地开发和调试,我们可以添加一些额外选项:

    geth --datadir ~/ethereum_data --networkid 15 --nodiscover --maxpeers 0 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi "db,eth,net,web3,personal" --console 2>> ~/ethereum_data/geth.log
    • --nodiscover: 禁止节点发现,防止其他节点加入私有链。
    • --maxpeers 0: 限制最大连接数为0,即单机运行,不连接其他节点。
    • --rpc: 启动HTTP-RPC服务,方便外部应用(如Web3.js, MetaMask)连接。
    • --rpcaddr "0.0.0.0": RPC监听地址,0.0.0表示监听所有网络接
      随机配图
      口。
    • --rpcport 8545: RPC服务端口,默认是8545。
    • --rpcapi: 指定RPC接口支持的API