...
前面说了,如果 tips 节点继续插入新的节点,那么 accumulator 尾部会出现不稳定的节点,这主要是因为并发的原因,如果我们设置 ghostdag 的 k = 1,那么就跟单链一样了不稳定的问题会大大降低,但也失去了并发的特性。因此,稳定性和并发需要有一个平衡,必须保证大部分稳定(越老越稳定),也需要有一定的并发能力。1,那么就跟单链一样了不稳定的问题会大大降低,但也失去了并发的特性。因此,稳定性和并发需要有一个平衡,必须保证大部分稳定(越老越稳定),也需要有一定的并发能力。
控制稳定性和并发的平衡,这里需要引入时间窗口的概念,即 tips 节点只能在特定的时间窗口内去加入新节点,过了窗口期,就只能在下一个 tips 节点加入新节点了。
...
因此必须防止 X 这样的节点插入进来,dag 的插入应该对区块的时间戳进行校验,若父子区块的时间戳差值超过窗口时间,则子区块应该被拒绝,从而减少 accumulator 的不稳定。
冒充诚实节点
所谓冒充诚实节点,即在同步 所谓冒充诚实节点,即在同步 accumulator 的时候,返回垃圾 hash 值。例如,第一步,诚实节点向恶意节点请求 值。例如,第一步,诚实节点向恶意节点请求 accumulator info 开始握手。恶意节点返回信息告知诚实节点自己有大量节点可以同步给诚实节点,此时,若诚实节点直接同步恶意节点的信息,就会被污染,实际恶意节点根本没有真实数据,或者数据都是自己创建的伪造数据。
因此,每次同步前,都必须对历史数据进行验证,直到 因此,每次同步前,都必须对历史数据进行验证,直到 Genesis,也即对历史的 accmulator 叶子节点进行验证,都通过,才能同步 tips 后续节点。当然,后续节点也需要验证,保证链上的区块交易和状态都是可靠的。
...
1)找到和大部队链一致的 tips 节点,验证 tips 节点的前序节点一致,然后同步后续节点。
2)回退交易状态,删除被会退的交易记录;2)回退交易状态,删除被回退的交易记录;
第一个在同步流程中已经解决,但交易状态的回退可能需要想想怎么设计才好。相比之前的回滚, dag 引入了并发挖矿,交易的冲突或重复交易的问题会更多,还得想想有没有更好的设计。
...
相比只有一个矿工成功挖矿,最优的情况下,一共有 k 个矿工(或者一个矿工同时挖中 k 个区块)产生 k 个区块,此时, accumulator 的叶子节点有 n / k 个,时间复杂度为 O(n / k),可见 k 越大,accmulator 同步越快。空间复杂度没有变化,因为依然需要同步 n 个区块 hash 值。
平均情况
即每次只有 时间复杂度,即每次只有 k / 2 个区块被挖出,即O(2n / k),依然还是 ,因此依然还是 O(n / k),取决于我们设置的 k 值或者实际并发时的挖矿数量。值或者实际并发时的挖矿数量。空间复杂度依然是O(n)。
另外,由于每次同步区块数据时,是批量同步,即最大的情况下,有 k 个区块同时打包同步,相比原来是一块块同步,相当于用了空间换取了时间。
...