在区块链的世界里,以太坊以其强大的智能合约功能占据了举足轻重的地位,当我们想要在不受公网干扰、数据私密可控的环境下进行应用开发、测试或内部业务流程时,搭建一条以太坊私有链就成了最佳选择,本文将以图文并茂的方式,手把手带你完成以太坊私有链的搭建,让你清晰地理解每一步背后的原理。
为何要搭建私有链?—— 私有链的核心价值
在开始之前,我们先明确一下搭建私有链的目的:
- 数据隐私与安全

在区块链的世界里,以太坊以其强大的智能合约功能占据了举足轻重的地位,当我们想要在不受公网干扰、数据私密可控的环境下进行应用开发、测试或内部业务流程时,搭建一条以太坊私有链就成了最佳选择,本文将以图文并茂的方式,手把手带你完成以太坊私有链的搭建,让你清晰地理解每一步背后的原理。
在开始之前,我们先明确一下搭建私有链的目的:

在动手之前,请确保你的电脑上已安装以下软件:
操作系统:本文以 Ubuntu 20.04 LTS 为例,但步骤同样适用于 macOS 和其他 Linux 发行版。
Go 语言环境:以太坊客户端(如 Geth)是用 Go 语言编写的,需要安装 Go 环境。
sudo apt-get install golang-go以太坊客户端 Geth:这是我们将要使用的核心工具,用于启动和管理节点。
sudo apt-get install software-properties-commonsudo add-apt-repository -y ppa:ethereum/ethereumsudo apt-get updatesudo apt-get install ethereum文本编辑器:如 VS Code、Vim 或 Nano,用于编写创世区块配置文件。
以下是搭建私有链的完整流程,我们将其分解为清晰的步骤,并用图示来辅助理解。
创世区块是区块链的“创世纪”,它定义了链的初始规则和状态,我们需要创建一个 JSON 文件来描述这些规则。
创建一个名为 private_chain 的目录,并在其中创建一个 genesis.json 文件。
mkdir private_chain cd private_chain nano genesis.json
在 genesis.json 文件中填入以下内容,这是一个典型的 PoA(权威证明)共识机制的创世配置,非常适合私有链。
{
"config": {
"chainId": 15, // 私有链的唯一ID,避免与公有链冲突
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"clique": { // 使用 PoA 共识机制
"period": 15, // 出块时间(秒)
"epoch": 30000 // 每30000个区块重签一轮
}
},
"difficulty": "0x400", // 初始难度,私有链可以设得很低
"gasLimit": "0xfffffffff", // Gas上限
"alloc": { // 预分配的账户,用于测试
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e": { "balance": "90000000000000000000000000" }
}
}
字段解释:
chainId:私有链的身份ID,用于网络隔离。clique:指定使用 PoA 共识,在 PoA 中,由一组预先授权的“签名者”轮流出块,效率高且中心化可控。difficulty:挖矿难度,私有链中可以设为极低值,以便快速出块。alloc:创世区块中预分配的账户及其以太币数量,这里的地址是我们后面要创建的矿工地址。我们使用 Geth 工具和刚刚创建的 genesis.json 文件来初始化我们的数据目录。
geth --datadir "./data_dir" init genesis.json
--datadir:指定数据存储目录,执行成功后,data_dir 目录下会生成 geth 和 keystore 等文件夹,它们分别用于存储区块链数据和账户信息。私有链需要至少一个账户来“挖矿”并产生新的区块。
创建新账户
geth --datadir "./data_dir" account new
命令会提示你输入两次密码,执行后,会返回一个账户地址,请务必妥善保存此地址和密码,我们得到地址:0x742d35Cc6634C0532925a3b844Bc454e4438f44e(与 genesis.json 中的 alloc 地址一致)。
解锁账户 在启动节点进行挖矿前,需要先解锁这个账户。
geth --datadir "./data_dir" account unlock 0x742d35Cc6634C0532925a3b844Bc454e4438f44e
输入你刚才设置的账户密码即可。
这是最关键的一步,我们将启动一个全节点,并让它开始挖矿。
geth --datadir "./data_dir" --networkid 1999 --mine --miner.threads 1 --unlock 0x742d35Cc6634C0532925a3b844Bc454e4438f44e --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpccorsdomain "*"
命令参数详解:
--datadir "./data_dir":指定我们初始化的数据目录。--networkid 1999:指定私有网络的ID,与 chainId 不同,用于节点间的识别,确保它是一个独一无二的数字。--mine:启动挖矿功能。--miner.threads 1:指定挖矿使用的CPU线程数,对于私有链,1个线程足够。--unlock 0x742d35Cc6634C0532925a3b844Bc454e4438f44e:解锁用于挖矿的账户。--rpc:启用 HTTP-RPC 服务,这是与私有链交互(如使用 Web3.js、Truffle 或 Mist 浏览器)的入口。--rpcaddr "0.0.0.0":允许任何 IP 地址的 RPC 请求。--rpcport "8545":指定 RPC 服务端口,默认为 8545。--rpccorsdomain "*":允许任何来源的网页通过 AJAX 访问 RPC 接口(开发测试时使用,生产环境请谨慎设置)。成功启动后,你会看到类似下面的日志,这表示你的私有链已经成功运行并开始出块!
INFO [09-20|15:30:00] Starting peer-to-peer node instance=Geth/v1.10.24-stable/linux-amd64/go1.17.13
INFO [09-20|15:30:00] Allocated cache and file descriptors cache=512.0MiB handleCount=4096
INFO [09-20|15:30:00] Starting RPC server endpoint=ipc:////home/user/private_chain/geth.ipc
INFO [09-20|15:30:00] HTTP server started url=http://0.0.0.0:8545
INFO [09-20|15:30:00] IPC endpoint opened url=/home/user/private_chain/geth.ipc
INFO [09-20|15:30:01] Successfully initialised new Ethereum-style database
INFO [09-20|15:30:01] Starting mining operation
INFO