使用 Raft 共识协议创建私有网络
专用网络提供用于测试的可配置网络。 这个私有网络使用 Raft 共识协议。
先决条件
GoQuorum。 确保 PATH 包含 geth 和 bootnode 。
步骤
页面右侧列出了使用具有两个节点的 Raft 创建私有网络的步骤。
1. 创建目录
为您的专用网络和两个节点创建目录:
2.创建创世文件
将以下配置文件定义复制到名为 raftGenesis.json 的文件中,并将其保存在 Raft-Network 目录中:
{
"alloc": {
"fe3b557e8fb62b89f4916b721be55ceb828dbd73": {
"privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63",
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
"balance": "0xad78ebc5ac6200000"
},
"627306090abaB3A6e1400e9345bC60c78a8BEf57": {
"privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3",
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
"balance": "90000000000000000000000"
},
"f17f52151EbEF6C7334FAD080c5704D77216b732": {
"privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f",
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
"balance": "90000000000000000000000"
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"config": {
"homesteadBlock": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"chainId": 10,
"eip150Block": 0,
"eip155Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip158Block": 0,
"maxCodeSizeConfig": [
{
"block": 0,
"size": 35
}
],
"isQuorum": true
},
"difficulty": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xE0000000",
"mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
"nonce": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
3. 生成节点密钥
在 Node-1 目录中,生成一个节点密钥,并将密钥复制到数据目录中。
4. 添加节点到静态节点文件
在 Node-1 目录中,显示节点 1 的 enode ID 。
将以下内容复制到名为 static-nodes.json 在 Node-1/data 目录中
用 bootnode 命令返回的 enode ID 替换 <EnodeID> 占位符。
[
"enode://212655378f4f48ec6aa57648f9bd4ab86b596553a0825d68ae34ad55176920b0ae06bf68fd682633b0ef3662cbe68a06166aa3053077b93fd4afa9cf8855ea0b@127.0.0.1:21000?discport=0&raftport=50000"
]
5. 初始化节点 1
在 Node-1 目录中,初始化节点 1 。
6. 启动节点 1
在 Node-1 目录中,启动节点 1 。
PRIVATE_CONFIG=ignore geth --datadir data --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50000 --rpc --rpcaddr 0.0.0.0 --rpcport 22000 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21000
PRIVATE_CONFIG 环境变量在未启用隐私的情况下启动 GoQuorum 。
7. 附加到节点 1
在 Node-1 目录中的另一个终端中,附加到您的节点。
使用 Raft cluster 命令查看集群详情。
8. 为节点 2 生成节点密钥
在 Node-2 目录下的另一个终端中,为节点 2 生成一个节点密钥,并将密钥复制到数据目录中。
9. 创建和更新节点 2 的静态节点文件
将 static-nodes.json 文件从 Node-1 目录复制到 Node-2 。
在 Node-2 目录中,显示节点 2 的 enode ID 。
使用不同的主机端口和 Raft 端口将节点 2 enode ID 添加到 static-nodes.json 。
10.初始化节点 2
在 Node-2 目录中,初始化节点 2 。
11. 将节点 2 添加为节点 1 的 Raft peer
在连接节点 1 的终端中,使用 Raft addPeer 命令添加节点 2 。
使用 Raft cluster 命令确认集群现在有两个节点。
12.启动节点 2
在 Node-2 目录中,使用与节点 1 相同的命令启动节点 2 ,除了:
PRIVATE_CONFIG=ignore geth --datadir data --nodiscover --verbosity 5 --networkid 31337 --raft --raftjoinexisting 2 --raftport 50001 --rpc --rpcaddr 0.0.0.0 --rpcport 22001 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21001
节点 2 连接到节点 1 。