原文标题:《理解「侧链」》
作者 :barryWhiteHat 翻译 : 阿剑
引言
Layer-2 对以太坊的重要性与日俱增,而且已成共识。
但是,「Layer-2」 是个不精确的标签。有些人说起 「Layer-2」 时,仅仅指的是 「不在以太坊 Layer-1 (上的东西)」。但实际上,方案到底怎么跟以太坊 Layer-1 交互,是非常重要的。同属「Layer-2」 名目下的不同方案,特性可以有天壤之别。可以争议 「Layer-2」 应该专指具备特定属性的某些东西(例如,我们大概都同意,部署在 AWS 上的东西不是 Layer-2,但也有一些项目,安全性保证差不多,但也被认为是 Layer-2)。不过,这不是我这里要讲的主题。
我在这里要讨论的是侧链(sidechains)的属性。
侧链的基本含义是:由一组验证者,把一条链的最新状态提交给一个(主链上的)智能合约,如此推进的一类系统。这些(最新状态的)检查点可被一个桥接合约(bridge contract)使用,以支持用户的存款和取款。一般来说,在该组验证者之间也会有一个领袖选举流程,来决定某时某刻由谁来创建侧链区块;例如 PoA 权威证明算法和 PoS 算法。(译者注:由该定义可见,作者所讨论的,是在主链上没有设计有效性保证机制的侧链;按照现在大家对 「侧链」的宽泛定义,作者讨论的是广义侧链的一个子集;但是,原始的「侧链」,也就是狭义的侧链概念,正与作者这里提出的一般无二。就看大家自己愿意把「侧链」 当成一个专有名词,还是愿意取其衍生含义了。)
侧链在以太坊生态中也扮演着重要的角色。在研究人员还未开发出更好的方案之前,它们是可扩展性和可用性的临时解决方案。像 xDai 这样的产品,也点出了大家对更好的用户体验的需求,并使之扩散了开来。
但是,侧链并不具备广大的以太坊社区所期待的安全性。这不是说永远不该使用侧链这种方案。如果人们完全知情,但是愿意用,那是他们自己的选择,也可能是值得的。但如果人们是不知情的,那就危险了。本文是希望提供一些信息。如果每个人都已经完全知晓了这些特性,那我这再写一篇也无伤大雅。但如果这文章能帮助大家意识到自己的误解,那就算做了好事了。
那么侧链到底缺少了哪些安全特性?几乎所有的侧链,都不能够提供:审查抗性
终局性
资金所有权保证
如果这些特性你全都要,那你可能得另找方案来代替侧链了。当然,也有可能在维持侧链核心架构的前提下改进具体方案在这些维度上的表现。
我觉得开放性的讨论对大家都有好处。
审查抗性
显然,侧链的审查抗性比(设计优良的)区块链要弱。不然,那也根本不需要区块链了。但这里我们挖得再深一些。
如果某条侧链有 N 个验证者,而只要有 M 个验证者一致同意就可以审查任意一笔交易,那么只需要 (N-M) 个验证者联合起来,就可以审查一个区块。这就导致了一个有趣的两难:要让审查交易变得更难,就会让审查区块变得更简单。因为审查交易和审查区块都是糟糕的事情,所以侧链就在根本上不能获得强健的审查抗性(译者注:这里的逻辑如下,如果只要 M 个验证者都不同意出某个块,系统就不能出块,那么自然,只需要 M 个验证者就可以通过拒绝出块来审查某一笔交易;但是,这也意味着,只要 N-M 个验证者同意,他们可以任意出块,总是出包含了别的内容的区块而不出某个区块,甚至集体玩消失)。
这种担忧在使用 PoS 时也依然存在,甚至按权益来计算出块权重会让它变得更糟糕,因为达成阈值的独立实体数量可能会更低(即使在最理想的情况下,权益是充分均匀分布的,那也只不过跟不使用 PoS 的情形一样,不会变得更好)。
数据可得性保证
假设只要 (N-M) 个验证者就可以创建一个区块。再假设所有其他验证者需要拥有整个状态的数据才能够验证新状态。那么,只要 (N-M) 个验证者是恶意的,他们可以:创建一个新区块
拒绝与诚实验证者共享区块数据
本质上就是将 N-(N-M) = M 名诚实验证者移出了共识过程,因此完全掌控了整个系统
这种情况发生的可能性有多大呢?显然需要更具体的细节才能下结论,但我们可以这样开始思考:一个理性的验证者,要跟其他人共享数据的激励在哪里呢?在传统的权威证明机制中,不这样做可能对声誉有损。但是,其实声誉机制也很难起作用,因为实际上并没有办法证明数据被扣起来了,除非其他人把所有数据都放到了链上。觉得这个解决方案听起来像是 optimistic rollup?没错,就是如此。这也意味着,带有更好安全性的侧链,本质上就 “退化” 成了 optimistic rollup。
在大多数侧链方案中,验证者可以因为自己的工作而获得某种形式的支付。对于诚实的验证者,奖励会在 N 个验证者之间共享。对于不诚实的验证者,同样多的奖励只会在 N-(N-M)=M 个验证者之间共享,所以验证者完全有激励不跟其他人分享更新后的状态(译者注:此处的计算疑有误)。
在这里,有一个根本性的难题:很难辨别数据可得性(data availibility)攻击。对于诚实验证者来说,很难分辨出,到底是有人发动了攻击,还是自己遇到的同步问题。
终局性
假设状态转换的流程如下:
state 1 => state2 => state3
而每一次的转换都需要一些交易在已有的状态上生效从而改变状态。而终局性就是说,交易一旦生效,就不能撤销。
侧链的检查点,经过侧链验证者的共识之后发送到以太坊区块链上,并根据以太坊的共识机制被固化下来。有些人可能因此就认为,侧链的终局性等同于以太坊的终局性;要回滚侧链的区块,你也需要回滚以太坊的区块。但这完全搞错了。
因为终局性是说不能回滚交易,不是说不能用新状态来替代旧状态。只要 (N-M) 个验证者同意,他们可以执行如下的状态转换:
state 1 => state2 => state1
(使用 state1 来替代 state3,就等于是回滚了大家默认已经终局的 state2,但这完全不需要以太坊主链也回滚。)
侧链资金所有权保证
假设现在的 state1={Alice:1000,Bob:0}。即 Alice 有 1000 块,而 Bob 啥也没有。那如果 Bob 是恶意的,而且控制着(或者可以高效地腐化) POA 验证者中的绝大多数,他可以怎么做?
他可以执行一个状态转换,state 1 => state2,而 state2={Alice:0,Bob:1000}。也就是偷走 Alice 所有的钱并交给 Bob。
因此,侧链的防御就减弱为,不会有 (N-M) 个验证者同意去执行这样的非法状态转换。
这已经是众所周知的事(至少我是这么相信的),但我认为还是有必要提醒大家。你对一条侧链的信心,只能是相信验证者中的大多数不会干这样的事情。对侧链的大部分安全分析都应该关注这一点。
可能还是有某些人你可以在某种程度上信任他们。就像我们中的许多人都(出于许多理由而信任)中心化的服务提供商。有时候这种牺牲是值得的。重要的是,你得清楚这是一种权衡。
使用治理程序作为防御手段的问题
有一种说法是:”我们可以使用治理程序来解决上面提到的所有问题“。这种方法是有缺陷的,因为整个系统会退化为一个治理流程。这种说法格外使我担心的一个理由是,它意味着侧链的其他属性是剧院(什么时候,我们因为什么理由需要这样的属性呢?)。举个例子,如果治理流程才是防范上述问题的最终手段,那也就意味着,什么 PoS、PoA,统统都不重要。系统的治理流程才是真正的 PoA。而且,很明显,对系统的治理流程,同样可以发动一模一样的攻击。
侧链的特性在哪里可能特别有用?
除了侧链的一些附加属性,比如更快的区块时间(因此有更好的用户体验),确实有一些场合,是侧链的特点可以大放异彩的。比如:你就是想要 N -M 个验证者就能执行任意状态转换。希望有一个高级控制权限的企业应用就是一个例子。
M=0,且 N 个验证者可以执行任意状态转换的情况。例如,一个四方参与的游戏。不过问题是,1 个验证者就可以关停这条链。
结语
曾经,侧链是在保持一定水平的以太坊可组合型和互操作性的前提下,唯一可用的方案。现在,随着别的一些 Layer-2 扩展方案的成熟,是时候考虑侧链如何与其他方案更好地结合了。
有一些属性,很适合让侧链加以整合:实现不收费的大规模迁移,保证用户不会因为费用而被卡住,无法退出。
将领袖选举机制替换为其他具备更强审查抗性的方案(PoS 可能是个错误的方向。见此帖)
需要协调器来处理链上两个状态的差异。
加入错误性证明来防止非法的状态转换。
随着 optimistic rollup 和 optimistic VM 技术的成熟,项目的权衡范围也会改变,因此,现在是反思侧链属性及其相关取舍的好时机。
来源:链闻