币圈知识百科

Cosmos宕机25小时深度复盘:公链共识机制的脆弱性与底层逻辑解析

25小时链网中断事件:透过Cosmos公链宕机,解析区块链共识的脆弱与底层逻辑

Cosmos公链近期经历的长达25小时网络停摆,彻底颠覆了许多人对区块链具备“永续运行”能力的固有印象。区块链系统的运转依赖于全网节点达成一致的共识机制,然而这一机制并非无懈可击。当代码存在缺陷、节点配置出现异常或遭遇恶意攻击时,若节点间无法完成共识确认,整条公链便会陷入停滞状态。

此次事件不仅是一个典型案例,直观揭示了共识机制的底层运作逻辑及其潜在的脆弱性,更向行业发出警示:即便是成熟的公链,也无法完全排除网络中断的风险,盲目夸大区块链稳定性的观念亟待纠正。

9月22日晚,一名用户发起了一笔ATOM转账。

然而,一夜过去,该交易状态仍显示为「等待确认」。

在排除了私钥丢失和钱包签名异常后,次日多方检查发现,多个公开RPC节点均显示Cosmos Hub卡在区块高度33,086,740。

由于没有新产生的区块,这笔交易自然无法被打包进任何新的块中。

直至大约一天后,Cosmos Hub恢复出块功能,这笔长期处于挂起状态的ATOM转账才最终得以成功执行。

Cosmos停摆25小时探共识

对于广大普通用户而言,这是一堂关于区块链共识最直观且深刻的课程。

我们常听到“没有任何中心机构可以关闭一条公链”的说法,但现实情况远比此复杂。一条足够去中心化的区块链,确实通常不存在服务器机房里的那个「关机按钮」,但它仍然可能停止。

此次Cosmos Hub的暂停,恰好将这套平时隐匿于底层的机制,完整地暴露在了普通用户面前。

一、Cosmos 为何突然「停止出块」?

首先需澄清一个常见的误解:本次事件中,直接遭受攻击的目标并非Cosmos Hub。

事件的源头发生在Neutron链上。

9月22日,一项名为「AIATO: AI Agent Takeover」的Neutron治理提案获得通过。攻击者利用了链级治理权限的漏洞,借助wasmd框架原生提供的特权指令,将Astroport、Drop等应用的合约管理员地址篡改为攻击者控制的地址。

这并非传统意义上的“代码漏洞”或“协议缺陷”。

通俗来说,应用本身拥有自己的“门锁”,但Neutron的链级治理持有权限更高的“总钥匙”。当攻击者控制了治理结果,也就等于拿到了这把钥匙,从而可以重新指定管理员、迁移合约,进而转移其中的资产。

真正将Cosmos Hub卷入漩涡的,是随后发生的跨链资金转移行为。

Cosmos Labs在复盘报告中指出,在Neutron停止运行之前,攻击者已将部分资产转移至多个网络,其中约170万枚ATOM被转入Cosmos Hub,并试图通过跨链流动性进行兑换。

换言之,Cosmos Hub本身并未受到直接攻击,普通Hub用户的资金也未因Neutron的漏洞而直接被盗。

但是,攻击所得的ATOM已经流入Hub,为了阻止剩余AToM继续流出,一部分Cosmos Hub验证人开始主动停止节点运行。

截至9月22日19:18左右(SGT),停止运行的验证人代表的投票权已超过总投票权的三分之一,导致Cosmos Hub无法继续形成新区块,最终定格在区块高度33,086,740。

这一步骤至关重要。

它意味着Cosmos Hub并不存在某家公司可以直接点击的「Pause」按钮,也没有先经过一次链上治理投票,真正让网络停下来的是足够多验证人不再参与形成共识。

然而,更值得关注的其实是后续的恢复过程。

停链约4小时后,验证者收到了一份完整的恢复方案:针对停链高度执行一次性的状态修改,将攻击者地址中剩余的ATOM转入由社区验证者共同管理的多签地址。

随后,Cosmos Labs根据验证者达成的方案制作了Gaia v28.3.0补丁,进行测试后分发给验证者安装。

该版本的Gaia会在指定的恢复高度执行一次性状态变更,将攻击者地址中的1,227,121 ATOM转入由Nansen、Keplr、Enigma、Silknodes、Kiln和Polkachu六方组成的4-of-6多签地址。

到9月23日凌晨,确认安装v28.3.0的验证者已超过总投票权的67%。因此,当天12:00 UTC,Cosmos Hub协调重启,约6分钟后,这次一次性状态修改在区块高度33,086,741执行,网络恢复正常出块。

综上所述,从Cosmos停止出块到恢复运行的整个过程中,先是验证者使网络失去Liveness(可用性),随后超过三分之二投票权的验证者接受了一套新的状态转换规则,最终使这套规则成为恢复后的canonical state(标准状态)。

至此,一个看似简单的问题浮现出来:既然是一条去中心化公链,为什么超三分之一的验证权就能让它停下来,而恢复网络,又需要足够多验证者共同接受并运行同一套软件?

答案,其实就藏在「共识」这两个字里。

二、所谓共识,本就不是「永远不会停」

区块链领域最容易被误解的一点,就是将「去中心化」与「永不宕机」画上等号。

实际上,共识机制真正解决的问题是在没有中央记账人的情况下,众多节点如何对交易顺序和账本状态达成一致。

只是,不同公链实现这一目标的方法各不相同。

以Bitcoin为例,其经典机制PoW(工作量证明)依靠矿工算力竞争出块。当网络短时间内出现两条合法分支时,节点按照累计工作量选择其中一条继续构建。

因此,Bitcoin不存在一个明确的「67% 投票后这个区块永远 Finalized」时刻,它更接近一种概率最终性,后续区块越多,想重新组织掉前面的交易,就需要付出越来越高的算力成本。

这也是为什么业界常说,一笔Bitcoin交易最好等待6个区块确认,毕竟即使算力再高,也不能简单绕过节点正在执行的共识规则。

当然,这并不意味着Bitcoin的状态在任何情况下都「绝对无法修改」。理论上,如果整个生态接受一套新的客户端和新的共识规则,通过Hard Fork,同样可以让过去规则下无效的状态变化变成有效。

但问题在于,谁有能力让足够多的矿工、Full Node、交易平台、钱包和用户共同接受这样一套新规则?

事实上,几乎没有。

开发团队并不能替整个Bitcoin网络决定共识规则,矿工和交易平台也很难做到,因为需要跨越的共识门槛极高。当初币安被盗7000枚BTC时,有人建议CZ联系大矿工操作,但最终不了了之。

以太坊则提供了另一个经典的样本。

转向PoS之后,现在的以太坊使用由Casper FFG与LMD-GHOST共同组成的Gasper共识。简单来说,一部分机制负责判断「当前应该跟哪条链」,另一部分则负责让区块获得真正意义上的Finality(最终确定)。

当代表至少三分之二质押ETH的验证者对相应checkpoint达成一致,区块才能进一步走向最终确定;反过来,如果超过三分之一的stake长时间不参与正确投票,网络就可能暂时无法形成Finality。不过Ethereum还设计了inactivity leak机制,在长时间无法finalizing时逐步降低离线验证者的有效权重,让网络最终有机会重新恢复Finality。

想真正改变这种结果,同样需要改变协议规则和客户端。

正如2016年The DAO事件,以太坊社区最终通过Hard Fork,在区块1,920,000执行了一次Ethereum Foundation当时直接称为irregular state change的特殊状态修改,把相关ETH转入恢复合约。

只是,拒绝升级、继续维护原有状态的一部分矿工和社区最终形成了Ethereum Classic(ETC),导致了众所周知的ETH与ETC分叉,表明不是所有人都接受这套规则。

Cosmos Hub的情况有所不同,它使用CometBFT,更接近典型的BFT共识。

可以把它理解为更加典型的BFT共识,即一个区块想真正提交,需要获得超过三分之二voting power的Commit。

其优势在于Finality非常明确,一旦区块经过足够验证权投票提交,就不需要像PoW那样继续等待越来越多区块,用概率换取安全感。

但其劣势也同样直接:如果三分之一或以上voting power不再提供形成Commit所需要的投票,剩余验证人再努力,也凑不出超过三分之二的阈值。

此时,网络最安全的选择便如本次的「暂停出块」。所以从分布式系统的角度看,这次Cosmos Hub的短暂停摆其实并不神秘。

一言以蔽之,一群掌握足够voting power的验证人停止参与之后,共识协议按照自己的规则,宁愿失去可用性,也不继续在缺乏足够共识的情况下确认新区块。

这背后其实对应了分布式系统里两个经常被普通用户混在一起的概念:

  • Safety:不能让不同节点同时确认两个彼此冲突的最终状态;
  • Liveness:网络还能不能持续向前运行、处理新的交易;

对于BFT系统来说,当参与共识的节点不足时,暂停有时候恰恰是维护Safety所付出的代价,说得直白一点,这本去中心化账本宁愿先停在那里,也不能让剩下的人各记各的。

从这个角度再回头看,会发现公链历史上许多看似完全不同的事故,其实都围绕同一件事展开:

当分布式节点无法继续对「正确状态」形成一致意见时,网络该怎么办?

三、从 Bitcoin 到 Solana,公链真正的风险边界在哪里?

这并不是Cosmos第一次将这个问题摆到台面上。

早在2013年,Bitcoin就发生过一次非常经典的链分叉事故。

当时Bitcoin 0.8将底层数据库从Berkeley DB切换到LevelDB,随后一个包含大量交易输入的区块出现,新版节点能够正常处理,但部分旧版节点由于Berkeley DB锁数量限制,将这个区块判断为无效。

于是出现了尴尬的一幕:大家运行的都是Bitcoin,但新旧客户端开始对「这个区块到底是否合法」产生不同答案。

网络因此分裂成两条链,而且新版0.8一侧一度拥有大约60%的算力,无法依赖正常的算力竞争快速自行收敛。

最终,大型矿池经过协调切回旧版本,在旧规则一侧重新获得更多算力,网络才重新收敛,Bitcoin后来也专门以BIP 50对这次事故进行了复盘。

到了2016年,以太坊的The DAO事件又把问题向前推了一步。

正如上文提到的The DAO事件,以太坊社区最终通过Hard Fork,在区块1,920,000执行了一次被Ethereum Foundation明确称作irregular state change的特殊状态修改,把相关ETH转入恢复合约。

但并不是所有人都认同这种处置方式,拒绝接受状态修改的一部分矿工和社区继续维护原来的规则,也就有了后来长期存在的Ethereum Classic(ETC)。

这次DAO Fork也是一个经典事件,相当于告诉所有人,当极端事件发生时,代码共识之外还存在社会共识,如果无法形成足够一致的意见,一条链真的可以分成两条。

2021年的Solana,则展示了另一种完全不同的故障路径。

当年9月,大量机器人交易涌入网络,引发验证节点内存耗尽,大量节点崩溃,最终整个网络无法对当前状态形成一致意见,停止确认新区块约17个小时,随后验证人共同协调恢复网络。

把这些事故放到一起分析,会发现它们并不是同一回事:

  • Bitcoin 2013年的问题,是不同客户端开始执行不同的有效性规则;
  • Solana 2021年的问题,是大量验证节点无法继续正常参与共识,网络失去Liveness;
  • Ethereum DAO面对的,则更接近一个社区是否应该通过新的协议规则主动修改状态的问题;
  • 而这一次Cosmos Hub,又带有另一层特殊性,网络先通过验证人协调主动失去Liveness,阻止攻击资产继续移动;之后又由足够高比例的验证权共同接受新的软件与恢复状态,让网络重新形成一致;

所以,与其把这些事件简单归结为「区块链原来也能关机」「去中心化都是假的」,不如承认一个更加真实的事实:

共识机制从来不是一台不会坏的机器,它真正提供的其实是一套去中心化的规则,譬如发生分歧时谁来决定正确的链;多少参与者才能让一个状态获得最终性;出现故障时网络选择继续运行还是停止;以及在极端情况下,什么样的集体行动能够改变接下来的运行规则。

这也让这次Cosmos事件,留下了一个比「该不该停链」更值得普通用户思考的问题。

总结:

我们经常说,not your keys, not your coins。

这句话当然依旧成立,只是它强调的是资产控制权——只要私钥在自己手里,钱包、交易平台或者其他第三方不能替你正常签署一笔转账。

前提是,你所在的区块链必须在任何时候都有能力处理这笔签名。

Cosmos Hub停止出块的那一天,用户依然持有自己的私钥,资产也没有因此凭空消失,只是你即使正确签署了一笔交易,也没有新的区块可以接受它。

恢复过程又进一步说明,如果足够多的共识参与者接受一套新的状态规则,特定账户的链上状态,也可能在没有原地址私钥签名的情况下发生变化。

这并不会让「Not your keys, not your coins」失效,但提醒我们,私钥自主权和底层共识权,从来不是同一件事情。

而对于钱包来说,同样如此。

钱包可以确保私钥和签名权掌握在用户自己手中,可以尽快识别链级异常、准确展示交易状态、建立RPC与节点冗余,并在网络恢复之后重新确认交易最终结果。

但钱包不能替一条公链恢复共识,也无法保证底层网络永远不会中断,更无法保证链上的规则和状态永远不会发生共识层面的变化。

所以,一个成熟的去中心化系统真正需要追求的,可能从来都不是「任何东西绝对不能改」;相反,应该尽可能把这些并不完美的边界说清楚:谁能够让共识暂停?需要多大的权重?什么情况下允许紧急干预?

因为真正的去中心化,不可能让系统永远不会遇到事故,关键在于,即使事故真的发生,我们依然能够知道是谁、依据什么规则、以多大的共识,决定了这本账接下来该怎么记。

以上就是25小时链网中断事件:透过Cosmos公链宕机,解析区块链共识的脆弱与底层逻辑的详细内容,更多关于Cosmos停摆25小时探共识的资料请关注其它相关文章!