阅读更多
实现:
1.EOS的出块流程是周期性循环的,即每过126s,top_producers中的节点即重复一次出场流程,每个节点生产12个区块.
2.DPoS算法是通过eosio.system系统合约实现的,并根据std::sort()函数按照选出的前21个超级节点的账户名首字母排序,而控制这21个出场节点的生产区块的具体函数就是3.plugins/producer_plugin/produce_plugin.cpp中的schedule_production_loop函数
nodeos程序根据全局时间(ePoCh)重复执行schedule_production_loop()函数,以达到周期性出场的目的
schedule_production_loop():
1.通过chain_plugin插件调用controller函数,并重置时间
2.调用start_block()函数,尝试打包新区块,返回start_block_result状态(succeeded,failed,waiting,exhausted)
a.failed:提示出块错误消息,挂起至同步状态
b.waiting:不做任何操作,保持同步状态
c.succeeded:
c1:出块成功,若生产的区块不是exhausted状态(超过规定的出块时间),则调用maybe_produce_block函数尝试生产并发布区块
c2:判断该节点是否有其他出块账户,若有,等待下次出块.监听出块节点动态,判断自己是否处在下一轮出块列表中
c3:通过这样的设置,nodeos节点就可以持续跟踪自己是否具有当前ePoCh的出块权限,若具有,则出块,反之则同步
start_block():EOS生产区块的函数,通过这个函数可以保证节点在处于出块环节时生产区块
1.首先获取当前区块生产者
2.接着判断本地节点是否具有最新区块,同步是否完成
3.接着判断是否具有对应的私钥
4.正式出块,调用controller中的start_block函数,生产区块