区块链公链都是基于p2p网络,本篇文章将建立一个多节点不同职责参与的EOS的测试网络,根据路上发现的可做文章的技术点大做文章。
关键字:EOS组网,全节点,交易确认,boot sequence,stake,帕累托分配模型,竞选出块节点,EOS出块奖励,代理投票,resign
构建源节点源节点就是第一个EOS节点(Genesis node),也可以叫主节点,EOS多节点组网的前提是已经对单机环境非常熟悉,我们的架构如下:
配置config.ini,默认位置: ~/.local/share/nodeos/config/config.ini,需要解释的几个配置项:
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节点地址,可以设置多个。
enable-stale-production = true,意思是可以不经过确权直接出块,单节点时要配置为true,多节点出块由于需要各方确权共识,要配置为false。
producer-name = eosio,出块者,创世块,默认eosio账户
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 ,密钥对,公钥加私钥,对应eosio账户,这对秘钥是写死的,不可改变。
注意对钱包进行修改时,例如删除钱包数据,重新创建,要预先手动kill掉keosd进程。
采用后台进程的方式启动节点,同时保存日志。
nohup nodeos>logs/nodeos-log.log 2>&1&
采用后台进程的方式启动钱包,同时保存日志。
nohup keosd>logs/keosd-log.log 2>&1&查看日志,通过 tail -500f logs/[filename] 的方式动态追踪日志。
查看进程
liuwenbin@liuwenbin:~$ pgrep nodeos 1959 liuwenbin@liuwenbin:~$ pgrep keosd 1978
为cleos设置携带keosd的别名(keosd服务一般会与nodeos部署在同一台机器上,如果是普通用户的业务场景,则与nodeos服务不在一台机器,需要指定ip),保险起见,我们直接将其设置到.bashrc文件中,并source使其生效。
alias cleos='cleos --wallet-url="http://localhost:8889"' 注意这里的--wallet-url的值要与钱包目录,默认是用户根目录下的eosio-wallet/config.ini中的http-server-address配置相同,从而保证我们访问的钱包是同一个。如果要更换ip或端口的话,首先要修改config.ini的配置,然后启动keosd,然后alias别名覆盖设置即可。停止进程,注意由于我们使用的
其他更详细的描述请转到《启动一个单独节点》。
单机准备就完成了,可以看出nodeos和keosd是分开的进程,最后通过alias别名将他们结合在了一起。
构建全节点全节点不出块但会保持同步完整区块数据到本地。在另一台机器上,同样的拉取同版本源码构建安装命令,然后修改配置文件config.ini。这里我们要修改的是:
去掉producer-name以及signature-provider配置项。
enable-stale-production配置在全节点无所谓,因为它只约束出块者,所以在这里可以去掉。
p2p-peer-address = ip:port,对端p2p节点地址,可以设置多个。
sync-fetch-span = 1000,同步区块的速度,步进。
直接键入命令nodeos启动节点。
全节点版本更新源码拉取-> checkout 最新版本号 -> 构建执行环境 -> 修改本地配置文件
然后使用命令:
清空旧的区块数据,重新启动链。
全节点日志分析 3435662ms thread-0 net_plugin.cpp:3055 plugin_startup ] starting listener, max clients is 2 3435671ms thread-0 net_plugin.cpp:749 connection ] created connection to 47.93.127.182:9876 3435672ms thread-0 net_plugin.cpp:1969 connect ] host: 47.93.127.182 port: 9876 3449419ms thread-0 net_plugin.cpp:773 connection ] accepted network connection 3449851ms thread-0 producer_plugin.cpp:290 on_incoming_block ] Received block 5f1a90b86a211c11... #1000 @ 2018-06-21T03:24:52.500 signed by eosio [trxs: 0, lib: 999, conf: 0, latency: 109957351 ms] 3450291ms thread-0 producer_plugin.cpp:290 on_incoming_block ] Received block 1476bbf0e003fcf4... #2000 @ 2018-06-21T03:33:12.500 signed by eosio [trxs: 0, lib: 1999, conf: 0, latency: 109457791 ms] 3450785ms thread-0 producer_plugin.cpp:290 on_incoming_block ] Received block 8c4bea86b3433b78... #3000 @ 2018-06-21T03:41:32.500 signed by eosio [trxs: 0, lib: 2999, conf: 0, latency: 108958285 ms] 3451298ms thread-0 producer_plugin.cpp:290 on_incoming_block ] Received block ddd23622b0174f2c... #4000 @ 2018-06-21T03:49:52.500 signed by eosio [trxs: 0, lib: 3999, conf: 0, latency: 108458798 ms] 3451794ms thread-0 producer_plugin.cpp:290 on_incoming_block ] Received block 37d4aa8148f4a429... #5000 @ 2018-06-21T03:58:12.500 signed by eosio [trxs: 0, lib: 4999, conf: 0, latency: 107959294 ms]全节点重新启动以后,可以观察到日志的内容与主节点有所不同:
首先它的区块的状态是on_incoming_block,而不是produce_block