使用Geth搭建以太坊私有网络完整指南

时间: 2026-02-23 4:48 阅读数: 3人阅读

以太坊作为全球第二大区块链平台,其灵活性和可扩展性使其成为区块链开发的首选,而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,per
随机配图
sonal" \ --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--wsapi:WebSocket相关配置
  • --wsorigins:允许WebSocket跨域访问(允许所有域名)
  • console:启动交互式控制台(可选)

启动后,节点会开始同步区块(创世区块为空,直接完成同步),并进入控制台界面(输入exit可退出)。

启动第二个节点(同步节点)

在另一台机器或同一机器的另一个目录下,启动第二个节点并连接到第一个节点:

mkdir ./data2
cd ./data2
geth --datadir ./data --networkid 2023 --bootnodes "enode://<节点1的enode地址>:<端口>" console

获取节点1的enode地址: 在节点1的控制台中输入:

admin.nodeInfo.enode

输出格式为:

enode://<公钥>@<IP地址>:<端口>?discport=<发现端口>
enode://a1b2c3d4e5f6...@192.168.1.100:30303?discport=30303

将此地址复制到节点2的--bootnodes参数中,即可实现节点间同步。

验证节点同步

在任一节点控制台中输入:

eth.syncing

若返回{currentBlock: 0, highestBlock: 0, ...},表示同步完成(私有网络创世区块为空,同步瞬间完成)。

私有网络基础操作

创建账户

在控制台中使用personal.newAccount命令创建新账户:

personal.newAccount("your_password")

返回账户地址,

"0x1234567890123456789012345678901234567890"

查看账户列表

eth.accounts

查看账户余额

eth.getBalance("0x1234567890123456789012345678901234567890")

私有网络初始无ETH,需手动转账或挖矿获取。

挖矿获取ETH

(1)启动挖矿

miner.start(1)  // 1表示使用1个CPU线程

(2)停止挖矿

miner.stop()

(3)查看挖矿状态

eth.mining  // 返回true/false,