:2026-03-05 18:54 点击:3
以太坊作为全球最大的智能合约平台,其公有网络(如主网、测试网)具有开放性高、节点分布广的特点,但也存在数据公开、交易费用波动、隐私性不足等问题,对于企业内部应用、联盟链场景、开发者测试或学术研究而言,搭建一个私有以太坊网络(Private Ethereum Network)成为更优选择:
在动手搭建前,需明确以下关键要素,并准备好相应工具:
以太坊私有网络可分为两类,根据需求选择:
geth 或 parity 初始化时生成; 单节点私有网络是搭建多节点网络的基础,步骤简单,适合快速上手。
打开终端,创建一个专用目录存放节点数据,并执行初始化命令:
mkdir private-ethereum && cd private-ethereum geth --datadir "./data" init genesis.json
genesis.json 是创世区块配置文件,需手动创建(文件名可自定义),内容如下:
{
"config": {
"chainId": 12345, // 网络ID(唯一标识私有网络,避免与公有网冲突)
"homesteadBlock": 0, // 启用 Homestead 规则的区块高度(0 表示立即启用)
"eip155Block": 0, // 启用 EIP-155 的区块高度(防止重放攻击)
"eip158Block": 0, // 启用 EIP-158 的区块高度
"byzantiumBlock": 0, // 启用 Byzantium 规则的区块高度
"constantinopleBlock": 0, // 启用 Constantinople 规则的区块高度
"petersburgBlock": 0, // 启用 Petersburg 规则的区块高度
"istanbulBlock": 0, // 启用 Istanbul 规则的区块高度
"clique": { // 共识算法配置(单节点推荐使用 Clique,无需挖矿,直接出块)
"period": 15, // 出块间隔(秒)
"epoch": 30000 // 每 30000 个区块重签一次密钥
}
},
"alloc": {}, // 预分配地址(可选,可提前给某些地址转入 ETH)
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址(单节点可留空)
"difficulty": "0x400", // 区块难度(单节点设为较低值,便于快速出块)
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000" // 额外数据(留空即可)
}
注意:若需挖矿,可将 "clique" 改为 "ethash"(PoW 共识),并设置 "difficulty" 为较高值(如 "0x200000")。
初始化完成后,启动节点并加入私有网络:
geth --datadir "./data" --networkid 12345 --nodiscover --maxpeers 0 console
参数说明:
--datadir:指定数据目录(存放区块链数据、密钥等); --networkid:网络 ID(与 genesis.json 中的 chainId 保持一致); --nodiscover:禁止自动发现其他节点(私有网络无需公开); --maxpeers 0:限制最大连接节点数为 0(单节点模式); console:启动交互式控制台(可输入命令管理节点)。 进入控制台后,可通过以下命令检查网络状态:
// 查看当前区块号
eth.blockNumber
// 查看账户列表(默认无账户,需创建)
eth.accounts
// 创建新账户(需设置密码)
personal.newAccount("your_password")
// 查看账户余额(单位:wei)
eth.getBalance(eth.accounts[0])
// 转账(从账户0转1 ETH到账户1)
personal.unlockAccount(
eth.accounts[0]) // 解锁账户0
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: 1e18}) // 1e18 = 1 ETH
若能看到区块号递增、账户余额变化,说明单节点私有网络搭建成功。
多节点私有网络需解决节点间通信、共识同步问题,以 3节点联盟链(使用 Geth + Clique 共识)为例:
mkdir node1 node2 node3
每个节点需唯一标识,通过 geth 生成节点密钥:
# 在 node1 目录下生成节点密钥 cd node1 geth --datadir "./data" account new # 创建账户(作为节点身份标识) # 记录输出地址,如 "Node1 Address: 0x1234...5678" # 同理在 node2、node3 目录下生成节点密钥,记录各自地址
修改 genesis.json 中的 clique 配置,添加节点地址(作为共识节点):
{
"config": {
"chainId": 12345,
"clique": {
"period": 15,
"epoch": 30000,
"signer": ["0x1234...5678", "0xabcd...efgh", "0x9876...5432"] // 替换为3个节点的地址
}
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x400",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
将修改后的 genesis.json 复制到 node1、node2、node3 目录下。
分别启动3个节点,并允许节点间发现(关闭 --nodiscover,设置 --maxpeers 为2):
# 启动 node1 cd node1 geth --datadir "./data" --networkid 12345 --port 30303 console # 启动 node2(端口需不同) cd node2 geth --datadir "./data" --networkid 12345 --port 30304 --bootnodes "enode://node1的enode地址@127.0.0.1:30303" console # 启动 node3(端口需不同) cd node3 geth --datadir "./data" --networkid 12345 --port 30305 --bootnodes "enode://node1的enode地址@127.0.0.1:30303" console
**获取节点 enode
本文由用户投稿上传,若侵权请提供版权资料并联系删除!