...
因此,每次同步前,都必须对历史数据进行验证,直到 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
...