? EOS区块链将收到的区块,首先压入到fork_db中,然后与链上当前的头区块进行比对,根据比对结果形成了两个分支处理。下面分别介绍下具体的处理流程。
我们先来看下代码的处理,如下图:
? 从上面代码中,可以看到,当fork_db接收到的其他节点发来的区块后,如果该区块与当前节点头块构成前后顺序连接关系,则直接就接受该区块(执行块上所有交易,修改本地状态DB),并将该块标记为主链上区块,然后更新节点的头块为接收到的区块,如下图所示:假设链头块序号为7,与fork_db中刚加入的头块序号为8的前区块7相同,则就会形成主链接。
? 具体接收并验证块上交易的函数apply_block()的代码如下:
对应的,弹出区块并相应回滚之前块上交易处理的函数pop_block()的代码如下:
我们先来看下代码的处理,如下图:
我们来将上面代码中的四个阶段的处理流程分别用示意图的形式来描绘一下,帮助我们加深对各个流程的理解。
举例:假设fork_db中区块序号5之后形成了分叉,链上块序号5之后的块序号6的块为A1‘,块序号7的块为A2’;
而fork_db中区块序号5的区块后的序号为6的块为A1,序号7的块为A2,序号8的块A3为刚收到加入的区块。
? maybe_switch_forks()函数,其实就是在处理区块链可能存在分叉时的情况,默认的处理原则就是:尽量保持最长链。如果在处理链切换的过程中出错,那么就回滚切换过程,恢复到最初的链。保证区块链能够持续运行下去。
原文:https://blog.51cto.com/14267585/2411932