以太坊作为全球第二大区块链平台,其灵活性和可扩展性使其成为区块链开发的首选,而Geth(Go-Ethereum)是以太坊官方实现的Go语言客户端,提供了完整的节点功能,包括私有网络搭建、交易处理、智能合约交互等,本文将详细介绍如何使用Geth从零开始搭建一个以太坊私有网络,并涵盖节点初始化、网络配置、节点启动及基础操作等关键步骤。

环境准备

在开始搭建私有网络前,需确保系统满足以下要求:

系统要求

  • 操作系统:Linux(推荐Ubuntu 18.04+)、macOS或Windows(需WSL2支持)
  • 硬件配置:CPU 2核+、内存4GB+、硬盘空间20GB+(根据节点需求调整)
  • 网络:私有网络节点间需能互相通信(同一局域网或通过端口映射)

安装Geth

Geth可通过官方预编译包或源码编译安装,推荐使用官方预编译包,步骤如下:

(1)Linux/macOS

# 下载最新版Geth(以Linux 64位为例)
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.6-4bb3c97d.tar.gz
# 解压
tar -xzf geth-linux-amd64-1.13.6-4bb3c97d.tar.gz
# 将geth添加到系统PATH
sudo mv geth /usr/local/bin/

(2)Windows

  • 访问 Geth官方下载页,下载Windows版本(geth-windows-amd64-1.13.6-4bb3c97d.zip
  • 解压后将geth.exe所在目录添加到系统环境变量PATH

(3)验证安装

geth version
# 输出版本信息即表示安装成功

初始化私有网络节点

私有网络需要唯一的网络ID(避免与公有网络冲突)和创世区块(定义网络初始规则),以下是具体步骤:

创建工作目录

mkdir ~/ethereum-private-net
cd ~/ethereum-private-net

编写创世区块配置文件

创世区块配置文件(genesis.json)定义了网络的初始参数,如链ID、难度、奖励分配等,以下是一个典型的私有网络创世配置示例:

{
  "config": {
    "chainId": 2023,       // 私有网络唯一ID(避免与公有网络冲突,如主网为1,Ropsten为3)
    "homesteadBlock": 0,   // 启用Homestead规则的区块高度
    "eip155Block": 0,     // 启用EIP-155规则的区块高度
    "eip158Block": 0,     // 启用EIP-158规则的区块高度
    "byzantiumBlock": 0,   // 启用Byzantium规则的区块高度
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "londonBlock": 0,
    "mergeNetsplitBlock": 0,
    "terminalTotalDifficulty": 0,
    "terminalTotalDifficultyPassed": true,
    "alloc": {}            // 预分配地址(可选,用于测试)
  },
  "difficulty": "0x400",   // 初始难度(较低难度便于快速出块)
  "gasLimit": "0xffffffff", // gas上限
  "extradata": "",         // 额外数据(留空即可)
  "coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址(初始无矿工)
  "nonce": "0x0000000000000042", // 初始nonce值
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 初始mixhash
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" // 父区块哈希(创世区块为空)
}

初始化节点

使用geth init命令根据genesis.json初始化节点数据目录:

geth --datadir ./data init genesis.json

执行后,./data目录下会生成keystore(密钥存储)和geth(链数据)子目录。

启动私有网络节点

私有网络可启动多个节点形成网络,节点间需通过--bootnodes或静态发现机制互联,以下是单节点和多节点启动的示例:

启动第一个节点(创世节点)

geth \
  --datadir ./data \
  --networkid 2023 \
  --nodiscover \
  --maxpeers 25 \
  --rpc \
  --rpcaddr "0.0.0.0" \
  --rpcport 8545 \
  --rpcapi "eth,net,web3,personal" \
  --ws \
  --wsaddr "0.0.0.0" \
  --wsport 8546 \
  --wsapi "eth,net,web3,personal" \
  --wsorigins "*" \
  console

参数说明

  • --datadir:指定数据目录
  • --networkid:网络ID(与genesis.json中一致)
  • --nodiscover:禁止自动发现其他节点(私有网络手动管理)
  • --maxpeers:最大连接节点数
  • --rpc:启用HTTP-RPC服务
  • --rpcaddr:RPC监听地址(0.0.0允许所有IP访问)
  • --rpcport:RPC端口(默认8545)
  • --rpcapi:开放的API接口(如ethnetweb3
  • --ws:启用WebSocket服务
  • --wsaddr--wsport随机配图