Conflux研究组 | 艰难破局:如何应对“存活性攻击”

640?wx_fmt=gif

从 2018 年 7 月开始,Conflux 团队就开始思考如何解决“平衡攻击”和“分割攻击”带来的存活性(Liveness)问题。

彼时的 Conflux 还没有区分开发团队与研究团队,因此对这个问题的探索,成为了 Conflux 全体核心成员定期开展的头脑风暴。

谁也记不清我们一共提出并否定了多少种方案了,在此我们只能凭借当事人们的回忆还原当初探索的脉络。

1

如近在咫尺,却远在天涯

首先,我们注意到一点,无论是“平衡攻击”还是“分割攻击”,都需要攻击者藏很多区块,并且藏相当长一段时间,然后再根据需要有选择地释放出来。

实际上,对于每一个节点来说,这种被藏了很久的“陈年老区块”与新区块在绝大多数情况下都是比较容易分辨的。

试想一下如果你看到两份日期被撕掉的报纸,一张报纸上有昨天刚刚发生的新闻,另一张报纸上则只有几个月甚至一年前的新闻,哪份报纸是新的是不是很容易分辨?

同样道理,如果一个诚实的节点发现刚刚收到的区块没有引用任何较新的(例如一个小时内收到的)其它区块,那么就有充足的理由怀疑,这个刚刚收到的区块在广播前被攻击者雪藏了一段时间(例如一个小时)。

更进一步,我们可以推测绝大多数诚实的节点应该都会得出相同的结论:

这个区块是异常的,很可能是由攻击者生成的。

640?wx_fmt=gif

如果能够确保所有诚实节点都把这类区块视为非法区块,那么攻击者能藏的区块的数量和时间都会受到限制,进而失去通过藏匿区块的方式发起“平衡攻击”和“分割攻击”的能力。

但是,仅仅是大多数诚实的节点在大多数情况下结论一致是不够的,如何确保所有诚实的节点对每一个区块都做出一致的判断才是真正的难题。

对于任何试图识别并剔除攻击者区块的方案,这都是一个无法绕过的问题。

在最初的设计中,我们曾经尝试简单地设定一个时间阈值 x。

如果你在时刻 T 收到了一个区块 A, 在时刻 T+x 以后收到了区块 B, 但区块 B 没有引用区块 A, 那么区块 B 就是非法区块。

然而,这个设计是非常容易被攻击的,因为每个诚实节点收到区块 A 和区块 B 的时刻并不相同。攻击者可以让一部分节点早一些收到区块 B,另一部分节点晚一些收到区块 B。

如果这个“早一些/晚一些”恰好让区块 B 处在合法与不合法的边界上,那么诚实的节点关于区块 B 的合法性就可能产生不一致的判断。

整个区块链网络就分叉了。

我们尝试通过各种姿势添加补丁来解决这一问题,但最终都失败了。我们无法找到一种方式,让每个节点都基于自己的私有信息做判断,并且保证所有节点的判断在任何情况下都保持一致。

对于那些被藏了很久的区块,即使我们知道它一定是攻击者生成的,也知道所有诚实节点都认同这个判断,我们依然对它无能为力。

因为无法保证所有节点对于“藏了很久”的判断标准在所有情况下都保持一致。这种结果,是让人很无奈的。

2

求同存异

既然完全求同是不可能的,我们就将思考的重点放在了如何弱化“异”的不良影响。

即使诚实节点间无法完全求“同”,只要“异”不影响大家的共识,就不会影响交易执行结果的一致性。

存“异”却不影响共识,这本就是所有 PoW 共识机制一直在做的。由于网络延迟的存在,每个区块在网络中传播需要一段时间,所以不同节点看到的区块不一样是很正常的情况。

Conflux 的树图结构无法保证任何时候每个诚实节点收到的区块是完全一样的。但是,合理的共识机制设计依然可以保证:

所有诚实节点对已确认区块的排序达成共识。

640?wx_fmt=gif

回到第一阶段的例子,假设一个诚实节点刚刚收到了区块 B, 区块 B 没有引用它在 x 分钟前收到的区块 A。

虽然对于不同的诚实节点,这个 x 的取值可能会不一样,但在网络条件比较好的情况下,差距一般不会特别长(比如超过两分钟)。

基于 x 的取值,我们为每个区块赋予一个 0 到 1 之间的权重(例如 max{1-x/500,0}):x 数值越大,则区块 B 是恶意区块的嫌疑就越大,在共识决策中所占的权重就越低。

只要不同节点观测到的 x 取值差异不大,它们眼里的区块权重也应该基本相同。

我们尝试证明不同诚实节点对 x 取值的“异”不会影响对区块排序的“同”。然而,这个思路下实际上会带来更多的问题,而解决这些问题看起来是遥遥无期的。

3

自适应权重

2018年的十一小长假期间,龙凡提出了一个新的方案。

该方案放弃了通过“无效化”攻击者所藏的区块来抵抗攻击的思路,而是选择在遭到存活性攻击时,通过放慢 Conflux 的出块速度来应对。

按照这个方案,最坏的情况下无非是整个网络出块速度安全地降低到比特币的量级,同时也会获得与比特币协议相近的安全性保障。

沿着这个思路进一步探索,我们最终确定了 Conflux 保障存活性的基本思路:

640?wx_fmt=gif

1、共识机制只基于树图结构中每个区块的父边和引用边,不再使用区块接收时间这种对不同节点可能不一致的“本地信息”。

2、通过调整挖矿的难度,来实现对 Conflux 出块速度的调整。在没有攻击时,Conflux 使用较快的出块速度来追求效率;有存活性攻击时,Conflux 放慢出块速度来确保安全。出块速度放慢时,要相应提高区块奖励,以保证矿工的利益。

3、挖矿难度不能让矿工自己说了算,但也无法做到让所有诚实节点同时切换。在具体的难度调整机制上,我们依然需要使用求同存异的思路。

从上述的基本思路出发,我们最终设计了动态调整区块权重的 GHAST (Greedy Heaviest-Adaptive Sub-Tree)共识机制,解决了最重链规则的缺陷,使得 Conflux 可以享受最重链规则下快速的确认时间,同时又具有和比特币相近的抵抗存活性攻击的能力。

从基本思路到 GHAST 机制的设计还有一段路要走,我们将在之后的几期里继续讲解。

END


了解最新动态

(向上滑动查看内容)

640?wx_fmt=png

官方网站

www.conflux-chain.org/zh/

640?wx_fmt=jpeg

微博关注@Conflux中文社区

weibo.com/confluxchain

640?wx_fmt=jpeg

知乎关注@Conflux中文社区

www.zhihu.com/org/confluxzhong-wen-she-qu/activities

640?wx_fmt=jpeg

百度贴吧关注@Conflux中文社区

tieba.baidu.com/f?kw=conflux%E4%B8%AD%E6%96%87%E7%A4%BE%E5%8C%BA

640?wx_fmt=jpeg

Twitter关注@ConfluxChain

twitter.com/ConfluxChain

640?wx_fmt=jpeg

Reddit

www.reddit.com/user/ConfluxChain

640?wx_fmt=jpeg

Telegram

t.me/Conflux_English

640?wx_fmt=jpeg

GitHub开源交流

github.com/conflux-chain

640?wx_fmt=png

Medium

medium.com/@Confluxchain

640?wx_fmt=gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值