问题描述

如果攻击者控制了足够多的节点,并发动了 liveness attack,那么它有能力进行如下攻击:

(假设 100 个节点,生效要求 34 个签名,坏人控制 40 个节点)

这个攻击类似于 Replay attack, 攻击者通过重放一个古老的签名,来造成 PoW 链上的麻烦。

早在 2018 年 3 月,设计 DAG 共识协议的时候,我们已经通过无数的失败尝试证明:

<aside> ⚠️ PoW 节点无法在出块的时候,对给定 message 是否 timeout 做出一致的判断。

</aside>

也就是说,如果上述攻击行为发生,是没有办法让 PoW 区块们一致地对卡住的 commitQC 撤销的。

所以,摆在我们面前的,只有两种选择:

  1. 承认这种 case 会导致 PoW 硬分叉的风险
  2. 利用 information cascade 的思路,在短时的硬分叉之后,让诚实节点们通过网络效应来到同一侧。(就像 GHOST 里随着时间推移,区块们都会 follow 一个子树一样。)

我并不喜欢方案 2,因为我们为了解决 GHOST 的 balance attack, 已经让协议很复杂了。方案 2 一方面要考虑 GHAST 协议的 feature, 另一方面要应对 balance attack, 无疑是一个大坑。我拒绝刨这个坑。