工程师的区块链终局性指南
许多安全关键的链下应用使用简单的区块延迟来确定终局性:即交易在区块链账本中变得不可变的时刻(在没有极端经济成本的情况下无法"撤销")。但这对于大多数网络来说是不够的,并且可能成为依赖交易终局性的中心化交易所、多链桥和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%攻击阈值下,75,000美元存款和取款所需的区块延迟(截至2023年6月)。
- 比特币:两个区块用于终局性(约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_call、eth_getBalance和eth_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_status为ACCEPTED_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的特殊情况
- 检查终局性
- 实践安全终局性
最近文章
- 使用Deptective调查您的依赖项
- 系好安全带,Buttercup,AIxCC的评分回合正在进行中!
- 使您的智能合约超越私钥风险成熟
- Go解析器中意想不到的安全隐患
- 我们审查首批DKLs23库的收获
© 2025 Trail of Bits。 使用Hugo和Mainroad主题生成。