版本比较

密钥

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

...

因此,每次同步前,都必须对历史数据进行验证,直到 Genesis,也即对历史的 accmulator 叶子节点进行验证,都通过,才能同步 tips 后续节点。当然,后续节点也需要验证,保证链上的区块交易和状态都是可靠的。

...

网络延迟高导致矿工被孤立

若某个矿工因为网络延迟的原因,造成挖了很多矿但实际跟外面的大部队已经相差很远,此时,若网络延迟恢复到正常,矿工的链就需要和大部队同步,此时就需要:

...

由于引入并发挖矿,会出现子节点的父节点还未同步,子节点就被广播或者通过过来,因此需要增加一个节点池,若一个节点的父节点至少有一个不在 db 中,那么这个节点就只能先放在节点池,直到父节点都同步过来为止。

在节点池的节点不能执行交易,也不参加同步。

时间复杂度

最差情况

若有 n 个节点,dag 的 链接参数为 k,那么,最差的情况下,每次只有一个矿工成功挖矿,此时就相当于单链的情况, accumulator 的内容和单链的 accumulator 完全一样,即都有一个字节点。那么同步 accumulator 的时间复杂度为 O(n),空间复杂度也为O(n),和原来的复杂度一样。

最优情况

相比只有一个矿工成功挖矿,最优的情况下,一共有 k 个矿工(或者一个矿工同时挖中 k 个区块)产生 k 个区块,此时, accumulator 的叶子节点有 n / k 个,时间复杂度为 O(n / k),可见 k 越大,accmulator 同步越快。空间复杂度没有变化,因为依然需要同步 n 个区块 hash 值。

平均情况

即每次只有 k / 2 个区块被挖出,即O(2n / k),依然还是 O(n / k),取决于我们设置的 k 值或者实际并发时的挖矿数量。

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

其它

使用startup info存储同步快照

节点握手的时候需要同步 chain info

...