在区块链技术的探索与应用开发中,以太坊(Ethereum)无疑占据了举足轻重的地位,它不仅支持智能合约的部署与执行,还为去中心化应用(DApps)的开发提供了强大的平台,对于开发者而言,在不希望暴露于公共网络、进行快速迭代测试、或者需要特定共识规则控制的环境下,搭建一条私有以太坊链(Private Chain)是至关重要的步骤,本文将详细介绍如何在广受开发者喜爱的 Linux 发行版——Ubuntu 上,从零开始搭建一条功能完善的以太坊私链。

在开始之前,请确保您的 Ubuntu 系统满足以下基本要求:
Geth(Go-Ethereum)是以太坊官方实现的 Go 语言客户端,功能强大,是搭建私链的常用工具之一,我们将使用 Geth 来初始化、启动和管理我们的私链。
更新系统包列表: 打开终端,执行以下命令:
sudo apt update sudo apt upgrade -y
安装 Geth: Ubuntu 的官方软件源中可能没有最新版的 Geth,因此我们推荐通过 PPA(Personal Package Archive)或直接下载二进制文件的方式安装,这里介绍通过 PPA 安装(推荐,方便后续更新):
sudo apt-add-repository -y ppa:ethereum/ethereum sudo apt update sudo apt install -y ethereum
安装完成后,可以通过以下命令验证 Geth 是否安装成功:
geth version
初始化私链主要是创建一个 genesis.json 文件,该文件定义了创世区块的配置信息,包括链 ID、初始分配、共识机制、 gas 限制等,对于私链,我们通常使用 PoA(Proof of Authority,权威证明)共识机制,因为它比 PoW(Proof of Work,工作量证明)更高效,且需要预授权的节点才能出块。
创建 genesis.json 文件:
在您的工作目录下(~/ethereum-private-chain),创建一个名为 genesis.json 的文件,并填入以下内容:
{
"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,
"istanbul": {
"epoch": 30000,
"dummyDuration": 0,
"blockperiodseconds": 1,
"cancunblock": 0,
"pragueblock": 0,
"verkleblock": 0
},
"berlin": {
"reward": 0
},
"london": {
"reward": 0
},
"ethash": {},
"clique": {
"period": 15, // 出块时间(秒)
"epoch": 30000, // 权威证明者列表更新周期
"wasmBlock": 0
}
},
"nonce": "0x0",
"timestamp": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 可以预留位置填写预授权节点地址
"gasLimit": "0x47b760", // Gas 限制,30000000
"difficulty": "0x1", // 初始难度
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址
"alloc": {
// 可以在这里预分配一些账户及其余额,用于测试
// "0x742d35Cc6634C0532925a3b844Bc454e4438f44e": {"balance": "0x20000000000000000000"}
}
}
注意: 上述配置中,我们使用了 clique 共识机制(一种 PoA 实现),适用于授权节点出块的私有网络。period 控制出块间隔,extraData 字段中可以填入预授权节点的公钥列表(十六进制格式,每个公钥 32 字节,不足用 0 填充,共 97 字节,包括 0x 前缀和空格分隔)。
初始化创世区块: 在终端中,进入 genesis.json 文件所在的目录,执行以下命令:
geth --datadir ./data init genesis.json
执行成功后,会在当前目录下创建一个 data 文件夹,其中包含 keystore(存储账户密钥)和 geth(存储区块链数据)等子目录。
geth --datadir ./data --networkid 15 --nodiscover --http --http.addr "0.0.0.0" --http.port "8545" --http.api "personal,eth,net,web3,txpool,miner" --unlock 0 --allow-insecure-unlock
参数解释:
--datadir ./data:指定数据存储目录。--networkid 15:指定网络 ID,与 genesis.json 中的 chainId 对应。--nodiscover:禁止自动发现其他节点,因为是私链,不需要发现公网或其他未知节点。--http:启用 HTTP-RPC 服务。--http.addr "0.0.0.0":允许任何 IP 地址访问 HTTP-RPC 接口(生产环境请谨慎设置,建议设置为 0.0.1 或特定 IP)。--http.port "8545":指定 HTTP-RPC 服务端口。--http-api "personal,eth,net,web3,txpool,miner":暴露的 HTTP API 列表。--unlock 0:解锁账户,