首页 > 其他 > 详细

区块分叉数据的处理

时间:2019-06-22 09:50:20      阅读:112      评论:0      收藏:0      [点我收藏+]
区块分叉数据的处理

? EOS区块链将收到的区块,首先压入到fork_db中,然后与链上当前的头区块进行比对,根据比对结果形成了两个分支处理。下面分别介绍下具体的处理流程。

fork_db头块与链头块为前后顺序连接关系

我们先来看下代码的处理,如下图:

技术分享图片

? 从上面代码中,可以看到,当fork_db接收到的其他节点发来的区块后,如果该区块与当前节点头块构成前后顺序连接关系,则直接就接受该区块(执行块上所有交易,修改本地状态DB),并将该块标记为主链上区块,然后更新节点的头块为接收到的区块,如下图所示:假设链头块序号为7,与fork_db中刚加入的头块序号为8的前区块7相同,则就会形成主链接。

技术分享图片

? 具体接收并验证块上交易的函数apply_block()的代码如下:
技术分享图片

对应的,弹出区块并相应回滚之前块上交易处理的函数pop_block()的代码如下:
技术分享图片

fork_db头块与链头块不存在前后顺序连接关系且不相同

我们先来看下代码的处理,如下图:
技术分享图片

我们来将上面代码中的四个阶段的处理流程分别用示意图的形式来描绘一下,帮助我们加深对各个流程的理解。

图例理解

举例:假设fork_db中区块序号5之后形成了分叉,链上块序号5之后的块序号6的块为A1‘,块序号7的块为A2’;

而fork_db中区块序号5的区块后的序号为6的块为A1,序号7的块为A2,序号8的块A3为刚收到加入的区块。

获取基于fork_db头块和节点链头块的链分支区块数组

技术分享图片

放弃最短链分支,尝试应用最长链分支

技术分享图片

如果切换长链处理出错就恢复原有短链分支

技术分享图片

总结

? maybe_switch_forks()函数,其实就是在处理区块链可能存在分叉时的情况,默认的处理原则就是:尽量保持最长链。如果在处理链切换的过程中出错,那么就回滚切换过程,恢复到最初的链。保证区块链能够持续运行下去

相关链接

星河公链

区块分叉数据的处理

原文:https://blog.51cto.com/14267585/2411932

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!