区块链重组详解:原因、风险及应对措施 |Quicknode🤖 新推出:《Quicknode 》AI 烹饪指南 10个经过验证的AI编程教程agents 。
查看食谱 简而言之:当网络的标准链发生变化,且先前被视为主链一部分的区块被另一组区块取代时,就会发生区块链重组(简称“reorg”)。这可能会导致已确认的交易消失、交易顺序发生变化,以及应用程序状态出现不一致。 由于网络延迟和并行区块生成,重组在大多数区块链上都会自然发生,但深度重组也可能由攻击或软件漏洞引起。对于任何开发依赖已确认区块链数据的应用程序的开发者而言,理解重组至关重要,因为若未能考虑重组因素,可能会导致双花漏洞、幽灵交易以及数据库损坏。
简明解释
不妨将区块链想象成森林中的一条小径,每一步都代表一个区块。在正常情况下,所有人都沿着同一条路前行。但偶尔,会有两位开拓者同时发现不同的路线,在短暂的一段时间内,两条有效的路径会并存。网络最终会决定哪条路径是正确的(通常是先延伸得更远的那条),然后所有人都会切换到那条路径上。那些原本沿着另一条路径前行的人,则必须原路返回并切换过来。
当这种切换发生时,就称为重组。被弃用的路径上的区块会被丢弃,而胜出路径上的区块则成为标准链。原本位于被弃用区块中的任何交易,可能出现在胜出链的区块中,也可能不会出现。有些交易可能会同时出现在两条路径的相同位置;有些交易可能只出现在其中一条路径上,而不在另一条上;还有少数交易如果与胜出链中的交易发生冲突,可能会被完全丢弃。
对于大多数终端用户而言,浅层重组(深度为一到两个区块)会频繁发生,且不会被察觉。 您的钱包可能会短暂地将一笔交易显示为已确认,然后在该交易于新的规范区块中重新确认之前,又将其显示为待处理状态几秒钟。您可能甚至不会察觉到这一点。但对于大规模处理区块链数据的应用程序而言,即使是一次单区块重组,也意味着基于旧区块已写入数据库的记录现在已不正确,需要进行更正。
通过 SOC 2 II 类认证 · ISO 27001
组织重组是如何发生的
网络重组最常见的原因是自然的网络延迟。当两个验证者几乎在同一时间(在同一槽内或同一区块高度)生成有效的区块时,网络的不同部分可能会暂时采用不同的区块。节点 A 可能先看到区块 X 并将其视为规范区块,而节点 B 则先看到区块 Y。根据共识规则,这两个区块都是有效的,但最终只有一个能成为主链的一部分。
网络通过其分叉选择规则来解决这种歧义。在Ethereum 上,分叉选择规则(LMD-GHOST)会选择获得最多验证者认证支持的链。在Bitcoin 上,最长的链(累积工作量最多)胜出。 无论采用何种具体规则,结果都是一样的:其中一条分叉被采纳为标准链,另一条则被弃用。原本跟随被弃用分叉的节点会检测到这一切换,回滚孤立区块,并转而采用胜出的链。
在Bitcoin 等基于工作量证明(PoW)的区块链上,重组现象相对常见,因为挖矿过程本质上具有随机性。 两名矿工可能几乎同时挖出有效的区块,从而产生一个临时分叉,该分叉通常在一两个区块内就会得到解决。在Bitcoin 上,单区块重组经常发生,被视为网络运行的正常现象。在诚实运行的情况下,更深层的重组较为罕见,但如果攻击者控制了网络中相当一部分的算力(即51%攻击的基础),则可能会发生此类重组。
在Ethereum 的权益证明(PoS)系统中,基于时槽的区块生成模型减少了自然重组的发生频率,因为每个时槽都有指定的提议者。然而,如果某位提议者的区块因网络延迟而延迟到达,且下一位提议者转而基于前一个规范区块进行构建,则仍可能发生重组。 当指定提议者未能生成区块(即“漏槽”)时,如果多个验证者基于链的不同视图进行构建,也会造成短暂重组的条件。
重组的类型
浅层重组的深度为一至三个区块,在大多数区块链上都会自然发生。这是分布式共识的正常结果,通常会在几秒钟内自行解决。大多数应用程序可以通过在将数据视为最终结果之前,额外等待几个区块的确认来处理浅层重组。
深度重组的深度超过三个区块,通常预示着某种异常情况:蓄意攻击、共识漏洞或严重的网络分区。主链上的深度重组是一起严重事件,因为它可能会撤销用户和应用程序原本已视为确认的交易。在安全性较低(哈希算力或质押价值较低)的小型链上,深度重组更为常见,且曾被用于实施双花攻击。
51%攻击(或在某些PoS链上称为34%攻击)是指蓄意制造深度重组。拥有多数共识权力的攻击者会挖矿或验证一条与公共链不同的私有链,然后将其披露给网络。由于攻击者的链更长(或拥有更多确认),网络会将其采纳为标准链,从而使公共链的近期区块成为孤块。 这使得攻击者能够逆转被弃用链上的交易,从而可能对先前已发送并确认的资金进行双花。
对应用程序的影响
对于处理区块链数据的应用程序而言,区块重组会带来数据一致性方面的挑战。如果您的应用程序在交易记录出现在区块中后立即将其写入数据库,那么区块重组意味着其中一些记录现在是基于已不存在的区块生成的。这些交易可能仍会出现在新的规范区块中(只是位置不同或区块号不同),也可能完全缺失。
DeFi 应用尤其容易受到攻击。如果一个 DEX 聚合器将一笔兑换显示为已确认并更新了用户的投资组合,但随后因重组导致该兑换被从规范链中移除,那么该投资组合的信息就会出现错误。如果一个跨链桥在源链上检测到一笔存款并在目标链上释放了资金,但随后因重组导致该笔存款被移除,那么该跨链桥就针对一笔已不存在的交易发放了资金。这是针对跨链桥的主要攻击途径之一。
索引器和数据管道必须检测重组操作,识别哪些数据块已被弃用,回滚从这些数据块派生的任何记录,并重新处理正确的规范数据块。如果没有这一逻辑,索引数据库会积累来自孤立数据块的幽灵记录,从而产生随时间推移而不断加剧的不一致性,并导致下游分析、余额和交易历史数据出现错误。
如何应对组织重组
防范重组的最简单方法是,在将数据视为已确认之前,先等待最终性确认。 在Ethereum 上,最终性在两个纪元(约12-13分钟)后达成,此后若要回滚区块,必须销毁至少三分之一的质押ETH。在Bitcoin 上,六次确认(约60分钟)是经济最终性的普遍接受标准。在Solana 上,单槽最终性意味着已确认的交易在约400毫秒内即被视为最终确定。
对于无法等待完全最终性的应用(因为用户期望获得更快的反馈),最佳实践是在获得足够数量的确认之前,将数据标记为“未确认”或“待处理”,并实现回滚逻辑,以优雅地处理因重组导致最近已确认的交易被撤销的情况。
数据管道应尽可能按照区块最终性顺序处理区块。管道不应在区块刚出现在链尖时就立即摄入(这存在处理未来可能成为孤儿区块的风险),而应将近期区块缓存起来,并在它们达到安全的确认深度后再进行处理。对于无法接受缓存的实时用例,管道必须包含明确的重组检测和回滚机制。
“重组”和“分叉”有什么区别?
重组(Reorg)和分叉(Fork)虽有关联,但并非同一概念。分叉是指区块链分裂为两条相互竞争的分支的任何时刻,这种分裂可能是暂时的(同一高度存在两个有效的区块),也可能是永久的(通过协议升级创建一条新链)。 重组特指在临时分叉解决后,节点放弃某一分支并切换到另一分支时发生的情况。换言之,临时分叉是原因,而重组则是支持了失败分支的节点所面临的后果。
方面 | 组织重组 | Fork |
|---|
定义 | 节点用竞争分支替换规范区块 | 链条分成两条或更多条支链 |
触发器 | 临时分支最终合并到了另一个分支上 | 并发阻塞、一个漏洞,还是协议升级 |
永恒 | 始终是临时性的;其中一个分支会被丢弃 | 可以是暂时的,也可以是永久的 |
对数据的影响 | 已确认的交易可能会移动或消失 | 可能会形成一条独立且持久的链条 |
多少个确认能防止重组织?
确认次数的安全阈值取决于区块链的共识机制设计以及涉及的价值大小。确认次数越多,要逆转你的交易就需要进行更深层次的重组,这对攻击者而言,成本将呈指数级增长。下表总结了将数据视为最终结果的常见指导原则。
链 | 通用最终性阈值 | 大约的实际时间 |
|---|
Bitcoin | 6 条确认 | 约60分钟 |
Ethereum | 2 个 epoch(已完成) | 约12至13分钟 |
Solana | 单槽最终性 | 约400毫秒 |
较小的PoW链 | 还有更多确认信息 | 情况各异,重组风险较高 |
等待区块链最终性是最好的保障,而规模较小或安全性较低的网络则需要更深的确认深度,因为它们的重组风险更高。可靠的基础设施在此也至关重要:了解节点可靠性为何对保持一致且能应对重组的数据如此重要。
区块链重组算是一种攻击吗?
大多数重组都是无害的,且会在一个或两个区块内自行解决,但蓄意制造的深度重组则是一种攻击。通过私下构建一条竞争链并将其发布,拥有足够共识算力的攻击者可以使近期区块成为孤块,并撤销看似已确认的交易——这就是双花攻击和51%攻击背后的机制。 区块重组还与利润提取策略存在交集,因此了解什么是 MEV并审查常见的区块链故障模式,有助于团队设计出在遭遇恶意(而非自然)区块重组时能够安全停机的系统。
常见问题解答
区块链重组是正常现象吗?
一到三个区块的浅层重组是分布式共识的正常现象,且经常发生,尤其是在工作量证明(PoW)链上。此类重组通常在几秒内即可解决,大多数用户甚至不会察觉。而深度重组则属于异常情况,往往预示着攻击或程序漏洞。
在重组期间,已确认的交易会消失吗?
确实如此。孤儿区块中的交易可能会以不同的位置重新出现在新的规范链上,也可能因与胜出分支发生冲突而被完全舍弃。这就是为什么应用程序在将交易视为最终确认之前,应等待获得足够的确认数。
哪些区块链的重组次数最多?
基于工作量证明(PoW)的区块链以及哈希算力或质押价值较低的小型网络,更容易发生重组。Bitcoin 偶尔会出现单区块重组,而安全性较弱的区块链则更容易遭遇更深层次的、可能带有恶意意图的重组。
索引器如何处理重组操作?
一个支持重组的索引器会检测到分叉,识别出哪些区块已被弃用,回滚由此衍生的所有记录,并重新处理新的规范区块。如果没有这一逻辑,数据库会积累幻影记录,这些记录会随着时间的推移导致余额和分析数据出现错误。
等待最终确定能否避免重组问题?
是的。一旦区块达到最终性,除非付出极高的经济成本,否则无法回滚,因此与已最终确定的区块相关的数据不会受到重组的影响。其代价是延迟,这就是为什么有些应用程序会显示未确认的数据,同时将不可逆的操作保留给已最终确定的数据。
Quicknode 如何处理重组
Quicknode Streams 其核心架构中内置了重组处理机制。Streams 按最终性顺序交付区块链数据,这意味着只有当区块在网络上达到安全的确认深度后,才会被处理并交付。当发生重组时,Streams 会自动检测分叉,识别哪些已交付的区块不再是规范区块,并向您的接收端发送更正数据,以确保您的数据与区块链的真实状态保持一致。
这种内置的重组处理机制消除了区块链数据处理中最为复杂的工程挑战之一。您无需在处理管道中构建自定义的重组检测、回滚逻辑和区块对账功能,只需配置一个流(Stream),剩下的工作就由Quicknode 来处理。无论您是在构建索引器、分析平台还是实时监控系统,Streams 都能确保目标数据与规范链保持一致,即使在网络重组期间也是如此。
Quicknode其核心 API还支持查询所有受支持网络中的最新区块数据和已确认区块数据,让您的应用程序能够根据不同用例选择合适的确认级别。对于希望获得即时反馈的用户,可向其显示最新区块;但对于涉及财务决策或不可逆操作的任何逻辑,则应依赖已确认的区块数据。
延伸阅读