以太坊作为全球领先的智能合约平台,其公链虽然功能强大,但在某些场景下(如企业内部应用、开发测试、隐私保护等),搭建一条私有以太坊链(私链)显得更为灵活和实用,Geth(Go-Ethereum)是以太坊官方的Go语言实现,功能全面,是搭建以太坊私链的首选工具之一,本文将详细介绍如何使用Geth从零开始搭建一条功能完善的以太坊私链。
在开始搭建之前,我们先简单了解一下搭建私链的常见原因:
环境要求:
安装Geth: 最常用的安装方式是使用二进制文件直接安装。

直接下载二进制文件(推荐) 访问 Geth官方GitHub Releases页面,下载对应操作系统的最新稳定版二进制文件,对于64位Linux系统:

wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.0-6c9179e0.tar.gz tar -xvf geth-linux-amd64-1.13.0-6c9179e0.tar.gz sudo mv geth-linux-amd64-1.13.0-6c9179e0/geth /usr/local/bin/
验证安装:
geth version
使用包管理器(如apt)
sudo apt update sudo apt install geth
源码编译(适合需要最新功能或自定义编译的场景)
sudo apt install git golang-go git clone https://github.com/ethereum/go-ethereum.git cd go-ethereum make geth sudo cp build/bin/geth /usr/local/bin/
以太坊的每个链都有一个“创世区块”(Genesis Block),它是链的起点,私链需要我们自定义创世区块配置文件。

创建创世配置文件: 创建一个名为genesis.json的文件,内容如下,这是一个基本的创世配置示例:
{
"config": {
"chainId": 15, // 私链的ID,用于区分不同的以太坊网络,公链是1,Ropsten是3,这里自定义一个15
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"mergeNetsplitBlock": 0,
"ethash": {} // 如果使用PoW共识,这里配置ethash;私链常用PoA,下面会替换
},
"alloc": {}, // 预先分配的账户地址和余额,这里留空
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000", // 创世区块难度,私链可以设小一些
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 额外数据
"gasLimit": "0xffffffff", // Gas限制
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
} 注意:如果我们打算使用权威证明(Proof of Authority, PoA)共识机制(私链常用,比PoW更高效且节能),需要修改config部分,使用Clique PoA共识:
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"mergeNetsplitBlock": 0,
"clique": {
"period": 15, // 出块时间(秒)
"epoch": 30000 // 每隔多少区块重签名者列表
}
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x1",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 后面会添加签名者地址
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
} 初始化创世区块: 使用geth的init命令来根据genesis.json文件初始化数据目录(data directory):
mkdir -p ~/ethereum-private-chain/data geth --datadir ~/ethereum-private-chain/data init ~/ethereum-private-chain/genesis.json
执行成功后,会在~/ethereum-private-chain/data目录下生成geth和keystore等文件夹。
启动第一个节点(创世节点): 假设我们使用Clique PoA共识,并且希望设置一个初始的签名者(signer)。
我们需要一个账户地址作为签名者,可以使用geth的account new命令创建新账户,或使用已有账户,这里我们假设已经创建了一个账户,地址为0xYourFirstSignerAddress。
启动节点,并指定创世文件、数据目录、网络端口、RPC端口等参数:
geth --datadir ~/ethereum-private-chain/data \
--networkid 15 \ # 必须与genesis.json中的chainId一致
--port 30303 \ # P2P监听端口,默认30303,私链多个节点时需区分
--rpc \ # 启动RPC服务
--rpcaddr "0.0.0.0" \ # RPC监听地址,0.0.0.0表示监听所有网络接口
--rpcport 8545 \ # RPC端口,默认8545
--rpccorsdomain "*" \ # 允许跨域访问的域名,开发时可设为"*"
--rpcapi "eth,net,web3,personal,miner,