版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

增加节点时,如上图,分别增加了 P ,其父节点为 J 和 M,它的 dag 结构和 accumulator 如下,可以看到 P 挂在 J 和 M 下,而 J 和 M 映射到 accumulator 叶子 3 这个节点,因此,需要对 3 所对应的叶子节点重新生成后续节点:

...

例子二

增加 P 和 V 节点,V 节点挂在 K 和 L 下,而 K,L 和 D 下,D 对应了 1 节点,而 K 和 L 对应了 accumulator 的 叶子节点 2,因此从 2 开始,需要重新生成新的 3 和 4:1 开始,需要重新生成后续的 3, 4, 5:

...

这里可以看到保存广度优先搜索的队列好处就是某个节点新加入了子节点,那么对其拓扑顺序是会有影响的,如果不保存搜索使用的队列,那么就需要回溯父节点,uncle 节点(例如 V 的加入,导致跟 L 相关的拓扑顺序变化,因此需要去找 L 的父节点和兄弟节点,因此需要回溯到 的加入,导致第二层的拓扑顺序变化,因此需要去找 D 的父节点和兄弟节点,需要回溯到 Genesis 节点,再重新广度优先遍历),逻辑比较复杂,因此这里选择了保存广度优先搜索使用的队列。

...

1、区块节点和 accumulator 的叶子节点的映射关系。因为我们需要马上找到某个区块在哪个叶子节点中,由于 accumulator 叶子节点是 dag 的 各层子节点 hash,因此需要额外存储这个映射关系;

2、accumulator 叶子节点和广度优先搜索每次循环使用的队列信息的映射关系。(是否可以复用 dag 的 relationship store 待考察)叶子节点和广度优先搜索每次循环使用的队列信息的映射关系。此处可以复用 relationship store,只需要存储子节点队列即可。

同步的三大任务

确认边缘节点和验证历史节点

所谓确认和验证,即先确认两个网络 peer 节点的 accumulator 是对应同一个 dag 图的,哪怕两者 accumulator 其中一个相对另一个不那么完整。

...

另外,由于每次同步区块数据时,是批量同步,即最大的情况下,有 k 个区块同时打包同步,相比原来是一块块同步,相当于用了空间换取了时间。

对比单个节点对应一个accumulator叶子节点方案

...

单区块对应accumulator单叶子

...

按父子层级关系对应accmulator单叶子

...

批量处理

...

固定节点数

...

并发越大,批量处理越多

...

节点关系

...

缺点:需回溯处理父子节点,兄弟节点的关系,导致新增节点关系复杂。

优点:节点数量就是accumulator的叶子数。

...

缺点:需要额外记录节点的hash值和当前dag节点数量。

优点:仅需要处理父子节点,且保存广度优先搜索遍历时的子节点队列,可以快速修改。

...

算法复杂度

...

O(n / c),c是每次批处理的节点数

...

其它

使用startup info存储同步快照

节点握手的时候需要同步 chain info(包含 accumulator info)

...