区块链最终性工程指南:防范双花攻击与重组风险

本文深入探讨区块链最终性的技术机制,分析概率性最终性与可证明最终性的区别,详解重组攻击原理,并提供针对不同链(如以太坊、Polkadot、L2网络)的最终性检查实践方案,帮助开发者构建安全的链下应用。

区块链最终性工程指南

许多安全关键的链下应用使用简单的区块延迟来确定最终性:即交易在区块链账本中变得不可变的时刻(若不付出极端经济成本则无法"撤销")。但这对于大多数网络来说是不够的,可能成为依赖交易最终性的中心化交易所、多链桥和L2扩展解决方案的单点故障。若不充分考虑区块链的最终性标准,看似最终的交易可能被恶意行为者通过称为重组的事件从区块链中清除,导致双花攻击和从应用中窃取价值。

我们研究了几种链下应用和L2网络,发现两个L2客户端Juno和Pathfinder要么没有检查最终性,要么错误地使用区块延迟来检测以太坊区块是否最终化。我们向每个产品团队披露了我们的发现,并在披露后不久发布了修复版本:Juno v0.4.0和Pathfinder v0.6.2。本博文汇集了我们从这项研究中获得的知识和见解。它解释了重组的危险、不同最终性机制之间的差异,以及在编写消费不同类型区块链数据的应用时如何防止双花攻击。

理解重组

当用户向区块链提交交易时,其生命周期在所有区块链中几乎相同。首先,他们的交易在区块链的点对点网络中传播到区块提议者。一旦区块提议者收到交易并将其包含在区块中,该区块就在网络中广播。

问题从这里开始:一些区块链没有明确定义下一个区块提议者应该是谁,而那些这样做的区块链需要一种在该提议者离线时恢复的方法。这些情况导致区块链有两种或更多有效的前进方式(分叉),网络必须确定哪个分叉应该是规范的。

图1:PoW网络上的两个矿工同时为槽4提议有效区块。

区块链在设计时考虑了这些问题,并定义了分叉选择规则来确定哪个分叉应被视为规范的。分叉有时可能持续多个区块,网络的不同部分认为不同的链是规范的。

图2:一个PoW网络,其中槽4、5和6的区块候选被快速连续挖出并建立在不同的父块上,导致分叉。

假设网络软件中没有错误,分叉最终会被调和,导致单个分叉成为规范的。其他分叉、它们的区块和它们的交易从区块链的历史中清除,称为重组。

当交易通过重组从链中清除时,该交易可能会重新排队以包含在新区块中,或者其排序或区块号更改为规范链中的任何内容。攻击者可以利用这些更改来修改交易的行为或完全取消交易,具体取决于它包含在哪个分叉中。

图3:经过三区块重组后的网络。区块4a、5a和6a中的交易不再是规范链的一部分。

重组是区块链生命周期的正常部分,可能由于区块生产速度、网络延迟和网络健康等因素而定期发生。然而,攻击者可以利用(甚至策划!)重组来执行双花攻击,这是一种攻击类别,攻击者提交存款交易,等待其被包含在区块中,然后策划重组以将其交易从规范链中清除,同时在链下应用上仍然获得其存款的信用。

正是出于这个原因,最终性考虑很重要。如果中心化交易所或桥索引未最终的存款交易,则容易受到攻击者通过导致区块链重组而进行的双花攻击。

区块链使用各种不同的共识算法,因此有各种不同的最终性条件,应针对每个链进行考虑。

概率性最终性

示例:比特币、币安智能链(BEP-126之前)、Polygon PoS、Avalanche——或通常任何基于PoW的区块链

使用概率性最终性的链的独特之处在于它们的区块实际上从未最终化——相反,它们变得概率上最终,或随着时间的推移变得更加"最终"。给定足够的时间,先前区块被重组出链的概率接近零,因此该区块变得最终。

在大多数概率最终链中,确定规范链的分叉选择规则基于哪个分叉上面构建了最多的区块,称为中本共识。在中本共识下,如果向网络广播更长的链,链可能会重组,即使更长的链排除了已包含在较短链中的区块/交易。

概率性工作量证明网络上的双花攻击

针对工作量证明网络的经典攻击是51%重组攻击。这种攻击需要链下交易所、桥或其他索引存款交易非常快的应用,理想情况下在区块产生后立即索引或具有极短的延迟。

攻击者必须积累、购买或租用足够的计算资源,以便攻击者控制网络上的大部分哈希算力。这意味着攻击者有足够的资源私下挖一条比诚实规范链更长的链。请注意,这是一种概率性攻击;控制网络51%的哈希算力使攻击最终成为必然。理论上,攻击者可以用远低于网络51%的哈希算力执行双花攻击,但可能需要多次尝试才能成功。

一旦挖矿资源准备就绪,攻击者在公共规范链上提交交易,将资金从他们的钱包存入交易所/桥。

随后,攻击者必须创建第二个冲突交易,将资金从他们的钱包转移到另一个攻击者控制的地址。攻击者配置他们的挖矿资源以挖一个新的分叉,其中包含转移交易而不是存款交易。

图4:攻击者创建一个包含转移交易而不是存款交易的私有分叉。

鉴于攻击者控制网络上的大部分哈希算力,最终他们的私有分叉将比规范分叉有更多的区块。一旦他们获得存款交易的信用并且他们的私有分叉比规范链有更多的区块,攻击者指示他们的网络将私有链的区块发布给遵循规范链的诚实节点。

诚实节点应用"最长链"分叉选择规则,触发围绕攻击者更长链的重组,并排除包含攻击者存款交易的区块。

图5:一旦攻击者发布他们的私有分叉,网络重组并清除包含他们存款交易的分叉。

实际上,这允许攻击者"双花"他们的币:交易所或桥为攻击者的币提供信用,而币仍然存在于攻击者控制的钱包中。

测量概率性最终性

由于概率最终链没有定义最终性条件,必须基于自目标交易/祖先区块以来经过的区块数量概率性地测量最终性。在给定祖先之上构建的区块越多,攻击者重组的成本就越高。

正确的区块延迟应基于历史因素和经济因素,选择两者中较大的一个作为应用的索引延迟。

在历史因素中,链下应用开发者应考虑链重组的频率以及重组通常有多大。如果区块生产是概率性的(如工作量证明网络),则应考虑更大的延迟,以补偿在异常短的时间内创建许多区块的机会。

在经济因素中,应考虑对给定经济价值的交易执行重组攻击的成本。鉴于51%攻击的概率性质,工程师应建立安全边际,并考虑25%攻击的成本而不是51%。例如,如果对比特币执行25%攻击、六区块重组攻击的最低成本为50万美元,那么接收50万美元存款的链下应用应等待至少六个区块,然后才认为交易最终并索引它。

使用Crypto51,我们可以计算在25%攻击阈值下(截至2023年6月)75,000美元存款和取款所需的区块延迟。

  • 比特币:两个区块最终性(约20分钟)
  • 莱特币/狗狗币:48个区块最终性(约两小时)
  • 比特币现金:103个区块最终性(约17小时)
  • 以太坊经典:3,031个区块最终性(约11小时)
  • 以太坊PoW:23,600个区块最终性(约89小时)
  • Zcash:1,881个区块最终性(约40小时)

这些延迟代表了特定存款金额在单个时间点的数据。随着每个网络上的哈希算力增加或减少,最终性时间也会改变,必须相应更新。每个网络上的挖矿哈希算力与链代币价格高度相关,因此哈希算力可能非常快地下降,需要集成应用进行监控和快速响应。未能及时调整最终性延迟将导致双花攻击。

对于某些类似交易所的应用,使用链上监控、自动系统停止、交易限制和取款延迟,可以减少工作量证明链的最终性延迟。然而,这些机制可能会使应用的逻辑过于复杂,并使其容易受到其他形式的攻击。

应注意的是,哈希率极低的链可能很容易以远超过网络51%的哈希率受到攻击。现有服务提供易于租用的哈希容量,可能超过链的哈希率许多倍。在这种情况下,建议避免与链集成,或基于可租用哈希容量进行最终性计算。

使用权益证明/权威证明的概率性链需要稍有不同的考虑,因为区块提议者不能自由进入提议者集,并且可能具有与工作量证明网络不同的分叉选择规则。

  • 币安智能链:一旦通过的区块数等于其验证者集中验证者数量的三分之二,区块被视为最终。需要20个区块最终性(约60秒)。
  • Polygon PoS:集成者应使用L1状态根检查点作为最终性度量。当包含给定交易的状态根检查点在L1上最终化时,Polygon交易可被视为最终。状态根检查点大约每30分钟发生一次。

可证明最终性

延迟最终性示例:以太坊PoS(Casper FFG)、Polkadot(GRANDPA)、Solana
即时最终性示例:Cosmos、Celestia、Algorand、Aptos

使用可证明最终性的系统对最终性有特殊考虑,以确保它比大多数概率最终链构建更快发生并具有更好的经济保证。

有两种类型的可证明最终性:具有即时可证明最终性的链和具有延迟可证明最终性的链。

具有即时最终性的链不需要链下应用进行特殊的最终性考虑。网络发布的所有区块根据定义立即可证明最终。

具有延迟最终性的链对新产生的区块和最终化的区块有单独的共识机制。这些链通常具有比即时最终性链更好的活跃性属性,但代价是增加了复杂性、对重组的脆弱性以及链下应用更复杂的集成考虑。

图6:延迟最终性链。最终性边界右侧的区块可能被重组,不应由交易所或桥索引。

延迟最终性链上的双花攻击

历史上,大多数区块链没有可证明的最终性,因此桥、交易所和其他链下应用会使用区块延迟来测量它们集成的任何新链的最终性。

然而,对于具有可证明延迟最终性的链,有时最终性机制可能停滞或失败,如2023年5月事件中以太坊的最终性小工具Casper FFG停滞。当最终性机制失败时,链可能继续产生区块,创建长串未最终化的区块,这些区块可能因错误或攻击者而被重组。

在以太坊事件期间,链的最终性机制停滞了九个epoch——相当于139个区块的确认(在控制错过槽提议之后)。此时,大多数桥/中心化交易所使用区块延迟规则来确定以太坊上交易的最终性,延迟范围从14个区块到100个区块。

如果以太坊最终性事件由攻击者策划,攻击者可能能够通过策划极长的重组对这些桥/交易所执行双花攻击。

检查最终性

对于延迟最终性链,如前面的示例所示,区块延迟不是"等待"区块变得最终的充分方式。相反,应用必须查询链的RPC以获取确切的最终性条件,以确保正在索引的区块实际上是最终的。

以太坊权益证明

以太坊JSON RPC为各种端点定义了"默认区块"参数,应设置为"finalized"以查询最新的最终化区块。要获取最新的最终化区块,请使用eth_getBlockByNumber("finalized", ...)。此参数可用于其他端点,如eth_calleth_getBalanceeth_getLogs

Polkadot

调用chain.getFinalizedHead()获取最新最终化区块的区块哈希,然后使用chain.getBlock()获取与该哈希关联的区块。

Solana

使用getBlocks() RPC方法,将承诺级别设置为finalized。

当可证明最终性说谎时

可证明最终性/权益证明系统的一个主要警告是它们无法提供强主观性保证。区块链的主观性是指从创世同步的节点是否总是到达相同的链头,以及攻击者是否可以操纵同步节点的最终状态。

在工作量证明区块链中,为部分同步的节点创建替代链的成本等于矿工从创世到规范链头执行的所有工作,使得任何主观性攻击对工作量证明网络不切实际。

然而,在权益证明网络中,创建替代链的成本只有一个要求,且成本未知,可能为零:链的历史验证者的私钥。历史验证者的密钥可能通过多种方式获得;私钥可能被泄露或暴力破解,或者不再使用其密钥的验证者可能出售它们。

这种旧验证者密钥的重新使用创造了长程同步攻击的可能性,其中新同步的节点可能表现为特定交易已提交并最终化,而实际上它从未提交到规范链。

为防止长程同步攻击,运营团队应始终从弱主观性检查点开始节点同步。这些检查点基本上用作创世区块,为节点同步提供可信的起点。弱主观性检查点可以从已同步的节点或通过社会过程获得。

L2的特殊情况

示例:Arbitrum、Optimism、StarkNet、Scroll、ZKSync、Polygon zkEVM

L2网络的独特之处在于它们没有普通区块链那样的共识机制。在普通区块链中,验证者集必须就状态转换函数的输出达成共识。在L2网络中,是底层L1网络负责验证状态转换函数。最终,这意味着L2网络的最终性条件取决于底层L1的最终性条件。

当L2定序器或证明者收到交易时,它对交易进行排序/生成证明,然后返回L2交易收据。一旦定序器/证明者收到足够的交易,它将交易组装成批处理提交到L1网络。

图7:用户在L2网络上的交易流。值得注意的是,定序器/证明者在交易在L1上包含或最终化之前很久就向用户提供交易收据。

对于ZK-Rollups,批处理包含代表批处理中每个交易执行的证明。L1合约验证证明,一旦批处理交易最终,证明中包含的所有L2交易也最终。

对于Optimistic Rollups,批处理包含批处理中每个交易的调用数据。L1合约不运行任何状态转换函数或验证调用数据是否有效。相反,Optimistic Rollups使用挑战机制允许L2节点对L1批处理提出异议。这意味着提交到Optimistic Rollup的交易只有在包含在L1上的批处理中、批处理及其父级有效且L1交易最终时才能被视为最终。

检查最终性

要确定L2交易的最终性,必须验证承诺/证明交易已包含在L1上并由L1最终化。L2提供商通常提供方便的RPC方法,链下集成者可以使用来确定给定L2交易的最终性。

Arbitrum Nitro/Optimism

Arbitrum和Optimism节点都实现以太坊JSON RPC,包括"finalized"区块参数。因此,可以使用eth_getBlockByNumber("finalized", ...)来确定最终性。

StarkNet

StarkNet的定序器提供商有一个getTransactionStatus()函数,报告交易在StarkNet交易生命周期中的状态。tx_statusACCEPTED_ON_L1的交易可被视为最终。

ZkSync Classic

ZkSync的v0.2 API有几个接受最终化参数的端点。

  • /accounts/{accountIdOrAddress}/{stateType}可以将stateType设置为finalized。
  • /blocks/{blockNumber}接受lastFinalized作为blockNumber参数。
  • /blocks/{blockNumber}/transactions{?from,limit,direction}接受lastFinalized作为blockNumber参数。

实践安全最终性

与区块链领域的其他近期创新一样,可证明最终性极大地改变了区块链可以提供的安全保证类型。然而,链下或多链应用的开发者必须意识到不同架构的特定最终性要求,并在必要时使用正确的技术来确定交易是否最终。

确定最终性的旧技术,如区块延迟,对于较新的架构不够充分,使用不正确的最终性标准可能使应用面临双花攻击的风险。

如果您正在设计新的区块链或链下应用并对最终性有疑虑,请联系我们。

如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News

页面内容 理解重组 概率性最终性 概率性工作量证明网络上的双花攻击 测量概率性最终性 可证明最终性 延迟最终性链上的双花攻击 检查最终性 当可证明最终性说谎时 L2的特殊情况 检查最终性 实践安全最终性 最近文章 我们构建了MCP一直需要的安全层 利用废弃硬件中的零日漏洞 Inside EthCC[8]:成为智能合约审计员 使用Vendetect大规模检测代码复制 构建安全消息传递很难:对Bitchat安全辩论的细致看法 © 2025 Trail of Bits. 使用Hugo和Mainroad主题生成。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计