在区块链技术的学习和开发过程中,搭建一条私有的以太坊链(简称“以太坊私链”)是一个非常实用的实践,它允许开发者在不受主网高 Gas 费和网络拥堵影响的环境下,自由地测试智能合约、部署应用、验证想法,甚至进行团队内部的协作开发,本文将详细介绍如何从零开始,一步步启动一条属于你自己的以太坊私链。
在动手之前,我们先明确一下启动以太坊私链的主要目的:
在开始搭建之前,请确保你的系统满足以下条件,并准备好必要的工具:

sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install geth
brew install geth启动以太坊私链主要有两种方式:一种是使用 Geth 的内置功能快速创建,另一种是通过自定义创世区块文件进行更灵活的配置。
这种方式适合快速搭建一个临时的、功能相对简单的私链。

初始化节点数据目录 创建一个目录用于存放节点的数据(如区块链数据、密钥等)。
mkdir ~/ethereum-private-chain cd ~/ethereum-private-chain
启动节点并创世 使用 geth --datadir ./data init 命令可以初始化一个默认的创世区块,但更常见的是直接启动节点,Geth 会在第一次启动时自动生成一个创世区块(如果不存在)。 为了更明确地控制,我们可以先生成一个默认的创世配置文件(可选,Geth 会自动处理):
geth --datadir ./data init /dev/stdin <<EOF
{
"config": {
"chainId": 15, // 私链的 Chain ID,必须唯一,避免与公有网冲突
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": {}, // 预分配账户,留空表示无预分配
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址
"difficulty": "0x40000", // 创世区块难度,私链可以设置低一些方便挖矿
"extraData": "", // 额外数据
"gasLimit": "0xffffffff", // Gas 限制
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
EOF 如果你直接运行下面的启动命令,Geth 会使用默认的创世配置。

启动节点 在 ~/ethereum-private-chain 目录下执行以下命令启动节点:
geth --datadir ./data --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpcapi "eth,net,web3,personal" --networkid 15 console
命令参数解释:
--datadir ./data:指定数据目录。--nodiscover:禁止其他节点发现此节点,因为是私链,不需要发现。--rpc:启用 HTTP-RPC 服务。--rpcaddr "0.0.0.0":允许任何 IP 地址访问 RPC 服务。--rpcport "8545":指定 RPC 服务端口,默认是 8545。--rpcapi "eth,net,web3,personal":允许通过 RPC 访用的 API 接口。--networkid 15:设置网络 ID,确保与公有网隔离,15 是示例,可以自定义。console:启动交互式 JavaScript 控制台,方便直接与节点交互。启动成功后,你会看到类似 Welcome to the Geth JavaScript console! 的提示。
这种方式提供了更高的自定义性,例如可以预分配账户、设置特定的共识机制(虽然私链通常用 PoA,但创世配置更灵活)。
创建自定义创世配置文件 在 ~/ethereum-private-chain 目录下创建一个名为 custom-genesis.json 的文件,内容如下(可根据需要修改):
{
"config": {
"chainId": 12345, // 自定义网络 ID
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"parisBlock": 0,
"shanghaiBlock": 0,
"cancunBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"parisBlock": 0,
"shanghaiBlock": 0,
"cancunBlock": 0,
"ethash": {} // 对于 PoA 私链,可以省略或指定为 clique
},
"alloc": {
"0x1234567890123456789012345678901234567890": { // 预分配的账户地址
"balance": "1000000000000000000000000000" // 预分配的以太币数量,单位是 Wei
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x40000",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
chainId:务必设置为一个唯一的、非公有网已有的 ID。alloc:可以在这里预先创建一些账户并分配初始资金,方便测试。使用自定义创世文件初始化节点
geth --datadir ./data init custom-genesis.json