在区块链的世界里,以太坊以其强大的智能合约功能占据了举足轻重的地位,当我们想要在不受公网干扰、数据私密可控的环境下进行应用开发、测试或内部业务流程时,搭建一条以太坊私有链就成了最佳选择,本文将以图文并茂的方式,手把手带你完成以太坊私有链的搭建,让你清晰地理解每一步背后的原理。

为何要搭建私有链?—— 私有链的核心价值

在开始之前,我们先明确一下搭建私有链的目的:

  1. 数据隐私与安全:所有交易和智能合约数据都局限于组织内部,不对外公开,保护了商业敏感信息。
  2. 低成本与高效率:无需支付Gas费,交易速度远快于公链,适合高频次、低成本的内部业务场景。
  3. 可控性与灵活性:你可以自由设定共识机制、区块时间、 gas 价格等参数,完全掌控整个网络。
  4. 开发与测试环境:为即将部署到公网上的DApp提供一个安全、无成本的沙盒测试环境。

搭建前准备:我们的“工具箱”

在动手之前,请确保你的电脑上已安装以下软件:

  1. 操作系统:本文以 Ubuntu 20.04 LTS 为例,但步骤同样适用于 macOS 和其他 Linux 发行版。

  2. Go 语言环境:以太坊客户端(如 Geth)是用 Go 语言编写的,需要安装 Go 环境。

    • 安装命令:sudo apt-get install golang-go
  3. 以太坊客户端 Geth:这是我们将要使用的核心工具,用于启动和管理节点。

    • 安装命令:sudo apt-get install software-properties-common
    • sudo add-apt-repository -y ppa:ethereum/ethereum
    • sudo apt-get update
    • sudo apt-get install ethereum
  4. 文本编辑器:如 VS Code、Vim 或 Nano,用于编写创世区块配置文件。

核心步骤:以太坊私有链搭建图解

以下是搭建私有链的完整流程,我们将其分解为清晰的步骤,并用图示来辅助理解。


步骤 1:创建创世区块配置文件

创世区块是区块链的“创世纪”,它定义了链的初始规则和状态,我们需要创建一个 JSON 文件来描述这些规则。

  1. 创建一个名为 private_chain 的目录,并在其中创建一个 genesis.json 文件。

    mkdir private_chain
    cd private_chain
    nano genesis.json
  2. genesis.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,
        "clique": {            // 使用 PoA 共识机制
          "period": 15,        // 出块时间(秒)
          "epoch": 30000       // 每30000个区块重签一轮
        }
      },
      "difficulty": "0x400", // 初始难度,私有链可以设得很低
      "gasLimit": "0xfffffffff", // Gas上限
      "alloc": {              // 预分配的账户,用于测试
        "0x742d35Cc6634C0532925a3b844Bc454e4438f44e": { "balance": "90000000000000000000000000" }
      }
    }

    字段解释

    • chainId:私有链的身份ID,用于网络隔离。
    • clique:指定使用 PoA 共识,在 PoA 中,由一组预先授权的“签名者”轮流出块,效率高且中心化可控。
    • difficulty:挖矿难度,私有链中可以设为极低值,以便快速出块。
    • alloc:创世区块中预分配的账户及其以太币数量,这里的地址是我们后面要创建的矿工地址。

步骤 2:初始化创世区块

我们使用 Geth 工具和刚刚创建的 genesis.json 文件来初始化我们的数据目录。

geth --datadir "./data_dir" init genesis.json
  • --datadir:指定数据存储目录,执行成功后,data_dir 目录下会生成 gethkeystore 等文件夹,它们分别用于存储区块链数据和账户信息。

步骤 3:创建并解锁矿工账户

私有链需要至少一个账户来“挖矿”并产生新的区块。

  1. 创建新账户

    geth --datad
    随机配图
    ir "./data_dir" account new

    命令会提示你输入两次密码,执行后,会返回一个账户地址,请务必妥善保存此地址和密码,我们得到地址:0x742d35Cc6634C0532925a3b844Bc454e4438f44e(与 genesis.json 中的 alloc 地址一致)。

  2. 解锁账户 在启动节点进行挖矿前,需要先解锁这个账户。

    geth --datadir "./data_dir" account unlock 0x742d35Cc6634C0532925a3b844Bc454e4438f44e

    输入你刚才设置的账户密码即可。


步骤 4:启动私有链节点并开始挖矿

这是最关键的一步,我们将启动一个全节点,并让它开始挖矿。

geth --datadir "./data_dir" --networkid 1999 --mine --miner.threads 1 --unlock 0x742d35Cc6634C0532925a3b844Bc454e4438f44e --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpccorsdomain "*"

命令参数详解

  • --datadir "./data_dir":指定我们初始化的数据目录。
  • --networkid 1999:指定私有网络的ID,与 chainId 不同,用于节点间的识别,确保它是一个独一无二的数字。
  • --mine:启动挖矿功能。
  • --miner.threads 1:指定挖矿使用的CPU线程数,对于私有链,1个线程足够。
  • --unlock 0x742d35Cc6634C0532925a3b844Bc454e4438f44e:解锁用于挖矿的账户。
  • --rpc:启用 HTTP-RPC 服务,这是与私有链交互(如使用 Web3.js、Truffle 或 Mist 浏览器)的入口。
  • --rpcaddr "0.0.0.0":允许任何 IP 地址的 RPC 请求。
  • --rpcport "8545":指定 RPC 服务端口,默认为 8545。
  • --rpccorsdomain "*":允许任何来源的网页通过 AJAX 访问 RPC 接口(开发测试时使用,生产环境请谨慎设置)。

成功启动后,你会看到类似下面的日志,这表示你的私有链已经成功运行并开始出块!


INFO [09-20|15:30:00] Starting peer-to-peer node               instance=Geth/v1.10.24-stable/linux-amd64/go1.17.13
INFO [09-20|15:30:00] Allocated cache and file descriptors     cache=512.0MiB handleCount=4096
INFO [09-20|15:30:00] Starting RPC server                       endpoint=ipc:////home/user/private_chain/geth.ipc
INFO [09-20|15:30:00] HTTP server started                      url=http://0.0.0.0:8545
INFO [09-20|15:30:00] IPC endpoint opened                       url=/home/user/private_chain/geth.ipc
INFO [09-20|15:30:01] Successfully initialised new Ethereum-style database
INFO [09-20|15:30:01] Starting mining operation
INFO