以太坊,作为全球领先的智能合约平台,其强大的去中心化应用(DApp)开发能力备受瞩目,在很多场景下,如企业内部测试、隐私数据交互、原型验证等,我们并不需要公链的公开透明和高成本,而是需要一个可控、私有的环境,搭建以太坊私有链是满足这类需求的常用方案,而其中最基础也最核心的环节之一,便是节点的部署与通信,本文将详细介绍如何搭建一个包含两个节点的以太坊私有链,并探讨其关键配置与意义。
为何选择以太坊私有链?
在深入双节点部署之前,我们先简要回顾一下私有链的优势:
以太坊私有链双节点部署核心步骤

搭建一个包含两个节点的以太坊私有链,主要涉及以下几个关键步骤:
环境准备:

创世区块(Genesis Block)配置: 每个以太坊链都有一个独特的创世区块,它定义了链的初始参数,我们需要创建一个自定义的创世文件(例如genesis.json)。
一个典型的genesis.json示例可能包含以下内容:
{
"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,
"terminalTotalDifficulty": 0,
"terminalTotalDifficultyPassed": true,
"powAlgorithm": "ethash",
"powMining": true,
"veil": {
"blockReward": 0
}
},
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760", // Gas上限,可根据需求调整
"difficulty": "0x400000000", // 初始挖矿难度,私有链可设低一些方便测试
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {} // (可选)预分配地址和以太币,用于测试
}
chainId:务必设置为与其他链不同的值。difficulty:私有链可以设置较低难度,方便单个节点快速出块(如果启用挖矿)。alloc:可以预置一些账户和余额,方便测试。初始化节点: 使用Geth的init命令,基于上述genesis.json文件初始化每个节点,假设我们创建两个节点目录node1和node2:
# 初始化节点1 geth --datadir ./node1 init genesis.json # 初始化节点2 geth --datadir ./node2 init genesis.json
这会在node1和node2目录下创建相应的数据结构,包括区块链数据、密钥等。
启动节点并建立连接: 这是双节点私有链的核心,启动节点时,需要指定它们如何发现彼此并进行通信,我们可以使用--bootnodes参数指定一个或多个引导节点,或者让节点在本地网络中通过发现机制彼此找到。

启动节点1(作为引导节点):
geth --datadir ./node1 --networkid 123456 --port 30303 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi "eth,net,web3,personal" --nodiscover console
--datadir: 指定节点数据目录。--networkid: 私有网络ID,两个节点必须相同。--port: 指定节点监听的端口,确保不同节点端口不同。--rpc: 启动HTTP-RPC服务,方便与DApp或工具交互。--rpcaddr: RPC服务监听地址。--rpcport: RPC服务端口。--rpcapi: 暴露的RPC API接口。--nodiscover: 禁用节点发现机制,避免连接到公网其他节点(可选,如果通过bootnodes则更安全)。console: 启动JavaScript控制台。启动节点2并连接到节点1: 在另一个终端,启动节点2,并通过--bootnodes参数指定节点1的节点地址(enode URL): 从节点1的控制台或日志中获取其enode URL(格式通常为enode://<node_id>@<ip>:<port>,如果是本地测试,ip可以是0.0.1)。 假设节点1的enode URL是enode://a1b2c3d4...@127.0.0.1:30303,则启动节点2:
geth --datadir ./node2 --networkid 123456 --port 30304 --rpc --rpcaddr "0.0.0.0" --rpcport 8546 --rpcapi "eth,net,web3,personal" --bootnodes "enode://a1b2c3d4...@127.0.0.1:30303" console
--bootnodes: 指定引导节点的enode URL,节点2将尝试通过此节点加入网络。--port和--rpcport与节点1不同,避免冲突。验证节点连接: 在任一节点的控制台,可以使用以下命令验证节点是否成功连接:
// 查看当前节点连接信息 admin.peers // 或者 net.peerCount
如果net.peerCount返回1,且admin.peers能看到另一个节点的信息,则说明两个节点已成功建立连接,形成了一个最小的私有网络。
双节点私有链的意义与应用场景
仅仅两个节点的私有链虽然简单,但其意义不容小觑:
后续操作与扩展
一旦双节点私有链正常运行,你可以进行更多操作:
personal.newAccount()创建账户,使用eth.sendTransaction()进行转账测试。