本文将介绍在本地部署EOS的多节点私链的方案。
1.创建三个数据文件夹
用来存储相关的数据,每个文件夹下包括创世文件genesis.json
和配置文件config.ini
。
1 | mkdir -p eostest1 eostest2 eostest3 |
三个节点的genesis.json都相同,内容为:
1 | vim eostest1/genesis.json |
2.启动节点(1)
节点1的config.ini文件内容为:
1 | blocks-dir = "blocks" |
配置选项如下:
- http-server-address = 0.0.0.0:8888,这里设置四个0代表本地可以通过localhost或者127.0.0.1调用http接口,同时外部可以通过本机固定ip访问。
- p2p-listen-endpoint = 0.0.0.0:9876,p2p网络本机监听端口,监听外部接入的p2p节点,这里的四个0的ip配置意义同上。
- bnet-endpoint = 0.0.0.0:4321,bnet是使用一个非常简单的算法来同步两条区块链。主要工作是两条链上的确权,共识,广播,同步区块,保持默认配置即可。
- p2p-peer-address = ip:port,对端p2p节点地址,可以设置多个。
- producer-name = eosio,配置出块的账户采用eosio
- enable-stale-production = true,意思是可以不经过确权直接出块,单节点时要配置为true,多节点出块由于需要各方确权共识,要配置为false。
- signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 ,密钥对,公钥加私钥,对应eosio账户,这对秘钥是写死的,不可改变。
然后启动节点(1)并让它出块:
1 | cd eostest1 |
3.创建账户用来启动节点(2)和(3)
创建默认钱包default
1 | 👍 cleos wallet create --to-console |
如果创建过,进行解锁:
1 | cleos wallet unlock |
将创建节点1的私钥密钥导入钱包
1 | cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 |
然后发布eosio.bios合约:
1 | cleos set contract eosio build/contracts/eosio.bios/ |
然后再创建inita、initb两个账户:
1 | $ cleos create account eosio inita EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV |
4.启动节点(2)
节点2的config.ini文件:
1 | blocks-dir = "blocks" |
注意修改以下几项代表了该节点的信息:
- p2p-peer-address = localhost:9876 节点(1)的p2p服务地址,通过该配置项使节点(2)链接上节点(1)
- producer-name = inita,节点2的出块账户设置为inita
- enable-stale-production = false 不允许节点2在不经确认直接出块的功能
- http-server-address = 0.0.0.0:8889 该节点的server 端口
- p2p-listen-endpoint = 0.0.0.0:9877 p2p网络本机监听端口,监听外部接入的p2p节点
- p2p-server-address = 0.0.0.0:9877 p2p网络服务节点端口
启动节点2:
1 | cd eostest2 |
可以看到节点2连上了节点1并进行了同步,此时节点2还不能出块。
1 | info 2019-01-10T07:20:22.004 thread-0 producer_plugin.cpp:341 on_incoming_block ] Received block c8ae236b27e648d3... #8533 @ 2019-01-10T07:20:22.000 signed by inita [trxs: 0, lib: 8464, conf: 0, latency: 4 ms] |
配置节点(2)可以出块,在节点(1)上执行命令:
1 | $ cleos push action eosio setprods '{"schedule":[{"producer_name":"inita","block_signing_key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"}]}' -p eosio |
而节点1由出块者变成了同步者:
1 | info 2019-01-10T07:26:55.004 thread-0 producer_plugin.cpp:341 on_incoming_block ] Received block c6c6536853f2ee5c... #9319 @ 2019-01-10T07:26:55.000 signed by initb [trxs: 0, lib: 9304, conf: 0, latency: 4 ms] |
5.启动节点(3)
节点3的config.ini文件:
1 | blocks-dir = "blocks" |
节点(3)的出块账户设置为initb,另外要注意的是节点(3)的p2p连接节点不能设置为节点(1),因为此时节点(1)已经不是生产者了。节点(3)的连接节点应该设置为节点(2)的地址p2p-peer-address = localhost:9877
。
启动节点3:
1 | $ cd eostest3 |
为了让节点3成为出块者,需要执行命令:
1 | $ cleos push action eosio setprods '{"schedule":[{"producer_name":"inita","block_signing_key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"},{"producer_name":"initb","block_signing_key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"}]}' -p eosio |
可以看到此时节点1和节点2交替出块了,每个节点在轮到它出块时连续生产了12个块。