NONDUBITO

凿构周期律 · 区块链系列 15 / 21

桥

跨链桥没有让资产穿过链,而是让一条链接受另一条链的陈述;事故发生在两份可验证账本之间。

一 让 B 接受一句话

两条独立的链之间,不存在一枚币真的穿过网络这个动作。

A 链的共识只知道 A 的状态,B 链的共识只知道 B 的状态。

所谓的跨链资产移动,实际上必须构造一个跨域的会计关系:A 链上可支配的资产减少,同时 B 链上出现新的可支配权利。

所以核心问题从来不是怎么把币传过去。

是 B 为什么相信 A 上真的发生了足以授权 B 铸造或者支付的事件。

这个问题看上去像技术细节,而它其实是后面七节的全部。

因为 B 链自己没有办法去看 A 链。它的节点只同步自己那条链的区块;它的共识规则只定义自己那些交易是否有效。要它知道 A 链上发生了什么,只有一个办法:有人把那件事告诉它。

而告诉这个动作,必然发生在两条链的共识之外。

A 链的共识管不到它,因为它发生在 A 链之外;B 链的共识也管不到它,因为 B 链无法独立核实那件事。

于是就有了一个位置:它对两条链都至关重要,而两条链的安全机制都覆盖不到它。

余项从这里就已经就位了。

它不是某一笔算错的账。两条链的账都算得极准,而且永远可以复算。它是那个位置本身:一段既不属于 A 也不属于 B,而两边都必须依赖它的地方。

而这个位置没有名字。它不是一条链,不是一个合约,不是一家公司。它是两套完备规则中间那一块谁也没有管辖的地方。

最典型的流程是这样的。使用者在 A 链把 100 枚 ETH 锁进桥合约;验证层向 B 链证明这次锁定;B 链随后创造 100 枚封装后的 ETH。回来的时候顺序反过来:B 上那 100 枚被销毁,A 上锁着的才允许释放。

所以它绝不是同一枚 ETH 跑到了另一条链。

B 上的那个东西,是对 A 上抵押物的一项跨域索取权。

而信任放在哪里,取决于是谁来证明那次锁定真的发生了。

如果是多签或者验证者集合,B 接受的是达到数量的签名,新增的信任落在签名者集合,他们的私钥安全和签名软件上。

如果是门限签名,B 接受的是达到阈值的分片联合签名,新增的信任落在这些节点是否真正独立,分片如何保管,服务器权限归谁。

如果是预言机或者外部委员会,新增的信任就落在那个委员会上。

如果是轻客户端,B 接受的是 A 链的共识头和状态证明,信任落在 A 链的共识安全加上轻客户端实现的正确性。

如果是有效性证明,B 接受的是一份可验证的状态证明,信任落在 A 链安全,加上证明系统,电路和验证器的正确性。

这张表里没有一行可以写成无须信任。

差别只在于:要伪造那句话,必须控制哪一层,付出什么代价,以及事后有没有人能把它指出来。

这里已经可以解释为什么桥的锁仓量特别危险。

A 上锁住的那 100 枚,是 B 上所有 100 枚封装资产的共同抵押。

如果允许 B 铸出 200,或者允许攻击者在没有对应销毁的情况下从 A 释放 100,那个跨域的会计恒等式就被打破了。

上一篇写的是一部法律要靠人去执行。

而这一次要写的是两条链之间。

第十篇里已经出现过一道缝:链上不知道某个价格是 65,000,链上知道的是有人说了 65,000。

这一次那道缝挪了位置。

它不在链和外面的世界之间,而在两条链之间。

而这两条链都是可验证的,都是不可篡改的,每一笔都是公开的。

两个完全可验证的系统之间,仍然有一道缝。

而后面六节要写的每一起事故,都发生在这道缝上。

二 四种模型

常见的四种模型,其实不在同一个层面上,而把它们并列成四种桥,会掩盖真正的问题。

第二种模型不必每次制造一份封装索取权。假定流动性提供者在两边都有稳定币:使用者把 100 枚交给 A 侧的池子,B 侧的流动性提供者或者中继立即给收款人约 100 枚。

这里钱的两头是:A 侧库存增加,B 侧库存减少。随后协议再通过再平衡或者净额结算,把资本补回来。

有一家协议当前的费用文档把使用者所付的总费用明确拆成两项:流动性费用和中继费用。前者补偿流动性使用和再平衡风险,后者补偿中继方的手续费,资本机会成本和风险。

所以使用者付的钱,并不必然流向一家桥公司。

这种方案把不同的风险拆开了:安全的信任仍然在最终的结算与消息验证那一层;而即时履约的信任转成了流动性提供者有没有资本和经济激励;价格与流动性风险由两侧的池子承担;快速路径失败的时候,往往还能回落到较慢的规范结算。

因此流动性桥不托管这句话也需要限定。它可能不建立一个永久的封装资产抵押仓,而流动性提供者确实在桥的路径中暴露了资本。

两种模型的差别可以这样看。锁定加铸造那一路,风险集中在源链那个池子上:所有人的索取权靠同一笔抵押撑着。而流动性那一路,风险分散在两边的库存上,代价是要有人长期把资本压在两边。

前者的失效是一次性的,巨大的;后者的失效更可能是渐进的,局部的。

而两者共有的那一件事没有变:总要有人告诉一边,另一边发生了什么。

换掉的只是谁在承担资本,以及资本压在哪里。

原子交换的基础是哈希锁加时间锁。一方在 A 链锁定资产,另一方在 B 链以同一个哈希条件锁定另一笔;揭示原像领取一边的资产,会使另一边具备同一个秘密,从而可以领取;超时则各自退款。

它的特殊之处是,没有一个永续的大型桥储备为所有使用者背书。

这一条使它在安全上有一个别的模型都没有的性质:失败的规模,上限是那一笔交易本身。

而代价是它做不成通用的跨链消息,也承载不了大额和高频。这个域最后没有走这条路,理由不是它不安全,是它不好用。

信任更主要放在:底层两条链的终局性和活性,哈希与时间锁的正确实现,以及交易对手在协议规定的时间内继续在线。

代价也来自同一个性质:双方需要可以配对的资产和流动性,链间的时序差异需要处理,而通用的跨链消息并不能单靠一次哈希时间锁解决。

轻客户端这一路最值得看清楚。

目标链保存另一条链的轻客户端状态,由无需许可的中继搬运数据包和证明;链上验证对方的共识状态和成员证明之后才接受这个数据包。

而相关文档明确区分了一件事:中继负责的是活性,不是被信任的安全裁决者。只要有人愿意中继,原则上可以替换掉失效的中继。

所以轻客户端桥所谓的无信任,更精确的表述不是没有信任。

是不再额外相信一个独立的外部验证委员会;安全性尽可能归约到底层两条链的共识安全,以及轻客户端和验证代码的实现正确性。

学术方案又向前推了一步:有论文提出用简洁证明来验证异链状态,在其原型里避免外部委员会,并给出了证明生成低于 20 秒,链上验证低于 230,000 gas 的结果。

而这是论文和原型的性能实验,不能直接写成生产环境已经解决了桥的安全问题。

现在把这四样东西的层次分开。

锁定加铸造是一种资产会计方式。

轻客户端,多签和有效性证明是验证方式。

流动性网络是履约方式。

原子交换是另一套结算原语。

把它们都叫四种桥,容易掩盖真正的安全问题:谁拥有最终的那个权限,也就是 B 链现在可以铸造,或者 A 链现在可以释放。

所以分析一座桥,比看它的锁仓量,速度或者手续费更稳定的一条轴是这样的:先找出哪一个组件,能够把另一条链发生了某件事,转化成本链现在允许支付;再追问,能够控制,伪造,误导或者升级这个组件的最小主体集合是谁。

后面几节的每一起事故,都是这条轴上的一个点。

三 九个不等于九

Ronin 恰好说明,只看阈值是几比几会得出错误的安全感。

按公司自己的事故说明,事发时有 9 个验证者密钥,桥提款需要 5 个签名。

而其中 4 个由 Sky Mavis 自己控制。

2021 年11 月,为了应对使用量和免手续费的请求,Axie DAO 曾经把一个验证者的签名路径列入 Sky Mavis 的白名单。这个临时安排到 12 月已经不再需要,而白名单没有被撤销。

攻击者入侵 Sky Mavis 的环境取得那 4 把密钥之后,又通过这条残留的通道,让 DAO 的验证者对恶意提款签了第 5 个签名。

所以名义上的门槛是 5 比 9。

而实际的攻击成本不是攻破五家互相独立的机构,是 4 把同一组织的密钥,加 1 条过期的签名通道。

那条通道之所以还在,理由也很朴素:它是为了解决一个真实的运营问题临时开的,问题解决之后没有人记得去关。

第六篇里那个为了处理事故而临时加上去的机制,后来成了下一次事故的入口。这一次是同一个形状:临时的东西留了下来,而它保留的权限和当初一样大。

密码学上的阈值没有被破解。

被破解的是独立性假设。

币量这一侧最干净:173,600 枚 ETH 加 2,550 万枚 USDC,2022 年3 月23 日被两笔提款带走。

而美元数有三个,可以同时成立:约 5.4 亿,是按攻击当日的价格算;约 6.15 亿到 6.25 亿,多按 3 月29 日披露日附近的价格算。美国财政部采用的是接近 6.2 亿这个说法,而公司公告给出的是原始币量。

还有一个数值得单独摆:3 月23 日被拿走,3 月29 日才被发现。

六天。

这六天里,那些封装资产在另一条链上照常交易,照常被用作抵押,照常被计入各种锁仓量的统计。

而支撑它们的那笔抵押已经不在了。

这六天里没有任何一条链出错。两边都在正常出块,两边的记录都完整。

只是没有人去把两边的数加起来对一次。

第三篇里那家交易所漏了三年没有人发现,原因是没有人被指派去盘点。这一次是六天,而原因是同一个。

而这两次的对照还有一层:那家交易所至少还有一本内部账,只是没有人拿它去对链上。这一次连那本账都不必有,因为两条链各自的记录都是完好的,谁也不觉得需要对什么。

至于最初的入口,后来有媒体报道称可能涉及伪装成招聘材料的定向钓鱼。而这一条不是最初官方事故说明直接确认的,所以不能和那个 4 加 1 的官方复盘混写。

Harmony 把门槛压得更低。

公司自己的调查称攻击者取得了至少 2 把私钥;而公开的安全复盘通常把当时那座桥描述为 2 比 5 的多签。

这两个数字看上去冲突,而实际上统计的对象可能不同:一个描述私钥的保管主体,一个描述桥验证者的地址集合。现有材料不足以把两者强行合成一个口径,所以应当并列。

Orbit 那个 7 比 10 的说法,则主要来自事发之后的安全研究者和安全公司的复盘。公司最初的公告只确认了异常访问和资产流出,没有在一手公告里完成这个根因认定。

所以它应当被标成安全公司的推断,而不是公司或者政府的正式事实。

把这三起放在一起,可以得到一组真正应该被记录的变量。

签名者的数量。阈值。独立组织的数量。独立硬件,云服务或者密钥管理系统的故障域数量。以及管理员和升级密钥能不能绕过那个阈值。

而公开的项目通常最容易披露的,恰恰是前两个。

最难验证的,是后三个。

这一节和第二篇那五把尺子是同一类问题,而它更具体。

那一次的问题是,同一个对象有五种度量方式。这一次的问题是,最容易公布的那个数字,恰恰是安全性最不依赖的那一个。

一座桥可以在文档首页写着 5 比 9,而这九个签名者住在同一个云服务商的同一个区域里。这件事不违反任何一条披露要求,因为没有人要求披露它。

而更难办的是,即使有人愿意披露,也不容易写清楚。

两家公司算不算独立,取决于它们的股东,董事,办公地点,运维团队,以及那几台机器接在谁的网络上。这些东西没有一个可以被写成合约里的参数,也没有一个可以被链上验证。

而恰恰是它们,决定了那个阈值到底值多少。

四 验证器被骗

Wormhole 那一次的性质,和 Ronin 正好相反。

它的核心错误在 Solana 那一侧的验证路径。攻击者提供了一个假的指令系统账户,而相关的旧函数没有确认传入的账户确实是系统的那一个。

于是程序被诱导,相信签名验证已经发生过,并生成了一份可以供后续使用的已验证凭据。随后调用封装资产的完成路径,铸出了 120,000 枚封装 ETH。

这件事特别适合把两种攻击分开。

一种是:偷够守护者的密钥,真的产生了达到数量要求的恶意签名。

另一种是:根本没有达到数量要求,而验证代码错误地说已经验证过了。

Wormhole 属于后者。

所以 19 个守护者的私钥体系被攻破,不是材料支持的版本。攻击者攻的是验签的边界。

按事发时的价格,不同来源给出约 3.2 亿或者 3.25 亿美元。而计量的对象都是那 120,000 枚的当时市值,不是某个公司账户里的一笔美元现金。

资金的两头因此出现了非常清楚的不平衡。

Solana 侧凭空多出 120,000 枚索取权,而 Ethereum 侧没有新增 120,000 枚抵押。

Jump 随即补入了 120,000 枚 ETH,使那些索取权重新有了足额抵押。

而两年之后通过英国和纽约法院的相关程序追回攻击者控制的资产,是补资方的资产回收,不是使用者第二次获得赔偿。

这个区分很要紧,因为它决定了那个约九成的追回率在说谁的钱。

补资这个动作本身也值得记一笔。它不是协议设计的一部分,不是保险,不是任何一份文件里承诺过的东西。

它是一家公司在事发当天决定拿出 120,000 枚 ETH,把那个被打破的会计恒等式重新补平。

如果它没有这样做,那些封装资产的持有人面对的就是一批没有足额抵押的索取权。

同一类失效还有一起,而它发生在一座原生桥上。

2022 年10 月,BNB 的两条原生链之间那座桥被利用。项目自己确认,攻击者通过底层证明库的缺陷伪造了跨链证明,额外产生并取出了 200 万枚 BNB。

按当时的市价,名义铸出的价值约 5.7 亿到 6 亿美元。

而攻击者真正赶在链暂停之前转出的,约 1 亿到 1.1 亿。

这两个数之间那四五亿,是因为验证者协调把整条链停了。

一条以不停机为设计目标的链,靠停机避免了一次更大的损失。而这件事之所以做得到,恰恰是因为那条链的验证者数量足够少,协调足够快。

所以把它写成丢了 5.7 亿客户托管资产,也不准确。

根本的动作是:证明验证器接受了一份伪造的状态证明,于是在没有合法源链支持的情况下增发了 200 万枚。

这和 Wormhole 是同一类失效,而不是签名者的私钥被盗。

把这两起并排,可以看出一件很要紧的事。

Ronin 那一次,协议的规则被完整地满足了。五个签名是真的,验证是对的,合约按规矩执行。出问题的是规则之外:那五把钥匙不该在同一个地方。

而这两起正好相反。规则没有被满足,而合约以为满足了。签名根本不存在,证明根本是假的,而验证代码说通过。

前一种,链做对了它该做的事,而它该做的事本身不够。后一种,链没有做对它该做的事。

而这两种失效对使用者来说没有区别。两次都是:某一天早上,那些封装资产背后的抵押不见了。

而在那一天早上之前,那些封装资产在另一条链上和真的没有任何区别:一样可以转账,一样可以进池子,一样被计入锁仓量,一样被当成抵押品去借别的东西。

跨域索取权和它所索取的那样东西之间的距离,平时是零。

只有在出事的那一天,它才突然等于全部。

这也是这类资产最难被定价的地方。一枚封装资产的价格,永远等于它所索取的那样东西,直到某一天它等于零。中间没有过渡。

而在它等于零之前,没有任何一个链上的指标会先变。余额不变,签名不变,合约不变。

五 零根

Nomad 是这几起里最少需要高级技巧的一次大规模灾难,而原因是前置的逻辑错误已经把安全条件消掉了。

2022 年6 月的一次升级初始化,把可信根这一类状态处理成了零值。于是那个零值对应的确认时间被赋予了一个可以接受的值;而任何未经证明的消息,在映射里默认也是零。

结果是,判断某个根是否可以接受的那个函数,对零返回真。

于是没有得到合法证明的消息,也可以被处理函数执行。

控制面的一次错误升级,直接改变了数据面的验证语义。

第一批攻击者证明了提款模板可用之后,后面的人只需要四步:复制已经成功的攻击交易数据,把收款人改成自己,重复提交,等待桥的路由合约支付。

这解释了为什么它被称作众包式的攻击。

不是几百人各自发现了一个漏洞,而是公开的成功样本,使这次利用可以被低成本复制。

而这也说明了另一件事。

2025 年,以色列应美国请求拘捕了一名嫌疑人并批准引渡程序,美国方面指控他在这次事件中扮演核心角色。

这属于政府的刑事指控,不是法院认定他盗走了全部资产。

而更要紧的是:即便对第一个人建立了刑事证据,也不能自然推出后续所有跟随提款都由同一人控制。

金额这一侧,项目后来使用的是超过 1.86 亿美元;而安全公司和媒体广泛使用的是约 1.9 亿。

两者统计的是同一次多资产事件的不同取价和边界,都应当保留。

这一起在整个系列里有一个特殊的位置。

前面十四篇里,构出问题的时候,通常还需要有人具备某种能力:算力,资本,密钥,或者一段别人写不出来的代码。

这一次不需要任何能力。看得懂一笔交易,会改一个地址,愿意付手续费,就够了。

链上的每一笔交易都是公开的,而且带着完整的调用数据。这本来是这套东西最引以为傲的性质之一:任何人都可以验证任何一笔交易做了什么。

而那天下午,任何人也都可以照着做一遍。

这也是为什么这一起的损失统计特别难做。有多少地址是攻击者,有多少是路过的人,有多少是原本的使用者试图把自己的钱先抢出来,链上分不出来。

后来的返还里,确实有人属于最后那一类。

而这也让追究变得几乎不可能。要起诉,先要证明某一个地址背后的人知道自己在做什么;而在那几个小时里,同一段调用数据被几百个地址提交过。

一次攻击可以有几百个共同实施者,而其中大多数人此前互不相识,事后也不会再见。

而这恰恰是可组合性和公开性的另一面:同一个使一笔交易可以被任何人验证的性质,也使它可以被任何人复制。

追两头在这一起里也变得很特别。

通常的攻击里,拿走钱的是一个可以被追踪,被起诉,被谈判的对象。而这一次,拿走钱的是几百个地址,其中相当一部分属于看到消息之后临时加入的人。

后来约 3,600 万美元被自愿返还,而其余部分只能按赔偿主张按比例处理。

所以这一起里那个通常最有用的问题,也就是钱在谁手里,第一次没有一个可以行动的答案。

六 云账户

Multichain 那一次最危险的东西,不是门限签名这个算法。

是它在现实世界里的控制结构。

2023 年7 月6 日起,该协议出现异常提款。一家分析公司最初统计超过 1.25 亿美元,其中近 1.2 亿来自其中一条链的桥;稳定币发行方后来冻结了相关地址约 6,500 万美元。

后续把更多异常转移纳入之后,另一些机构使用的总损失口径是至少 2.1 亿。

这两个数不是谁对谁错。前一个是 7 月6 日第一波主要的未授权提款,后一个是把随后跨多链的异常流出纳入之后的广义口径。

项目在 7 月14 日的自述里说了几件事。

首席执行官自 5 月21 日起被中国警方带走;那些门限签名的节点服务器,运行在他的个人云服务账户之下;警方还扣走了他的计算机,手机,硬件钱包和助记词;团队随后发现节点服务器的访问权限被撤销。

项目又称,他的姐姐此后曾为了资产保全移动剩余资产,随后也被警方带走。

所有这些关于警方行为以及移动资产目的的描述,证据层级都是公司自述,不是公开的司法裁判。

链上可以证明资产从那些受控地址被有效授权转走。

而链上记录不能单独证明,控制者究竟是外部黑客,内部人员,家属,还是执法机关。

那家分析公司当时的写法也很谨慎:可能的攻击或者卷款,可能是管理员密钥被控制。

新加坡高院 2024 年的判决提供了极有价值的链外材料。它记载了原告关于这个控制结构的证据,并指出它与使用者协议所宣传的,不能由一个人控制的去中心化架构存在冲突。

而法官明确表示,他没有就原告关于欺诈,转移资产等全部实体指控作出事实认定,因为相关责任首先来自缺席判决。

所以门限签名这三个字本身,几乎没有安全含义。

需要问的是另外五个问题:分片在哪些机器上;云账户归谁;恢复短语归谁;节点是否真正由独立实体运维;管理员能不能替换节点。

Orbit 那一侧还有一处必须写准的东西。

公司在 2024 年1 月指控一名前任安全负责人在离职前擅自弱化了防火墙,并就此起诉,请求警方调查;同时公司称也在调查另一种可能。

这里尤其不能写成那名前任负责人导致了攻击。

材料只证明公司提出了这一指控,并诉诸调查。

把这一节和第三节接起来读,能看出一条完整的下降。

Ronin 那一次,九把钥匙确实存在,只是不够独立。

这一次,那些节点确实存在,而它们运行在一个人的账户下面。

所以门限签名这类方案在纸上防的是共谋:没有足够多的节点一起作恶,就出不了签名。而它防不了的是另一件事:那些节点在物理上,在行政上,在法律上,可能根本就是同一个东西。

这件事在链上看不出来。链只看得见有多少个地址签了名。

而这一节还留下了一个这个系列里少见的空白。

那笔钱去了哪里,链上可以追;而它是被谁授权转走的,至今没有一个经过司法认定的答案。公司自述指向一个方向,分析公司当时用的措辞是可能的攻击或者卷款,而新加坡的法院明确说自己没有就这些指控作事实认定。

三份材料,三种证据层级,而它们指向的不是同一个结论。

这不是这个系列第一次遇到这种情形,而它在这里最彻底:一笔上亿美元的资产被转走,链上每一步都可查,而三年之后,那笔转账是谁授权的仍然没有一个可以引用的认定。

链上透明解决的是钱去了哪里。它没有解决,也不打算解决,是谁让它去的。

七 三个分母

追回率不能放在一张表里直接排名,因为至少有三个完全不同的分母。

一个是资产追回率:从攻击者控制中取回的资产,除以原来被盗的资产。

一个是使用者赔付率:最终支付给受损使用者的价值,除以被认可的损失。

还有一个是协议偿付能力的恢复程度。

这三个可以差得非常远。

一座桥可以追回九成资产而使用者一分没拿到,因为追回的是补资方的钱;也可以使用者全额获偿而资产一分没追回,因为是公司自己掏的。

把这两种情况放在同一张追回率排行榜上,得到的数没有任何意义。

而这七起事故恰好显示了至少四种不同的结果。

Poly 主要依靠攻击者主动返还。它的攻击本身也常被写错:那不是守护者私钥泄露,而是攻击者在更靠前的授权逻辑上,取得了改写守护者名单的能力。事后攻击者陆续归还了绝大部分资产,另有稳定币发行方冻结了约 3,300 万美元。所以那个接近百分之百,应当写成名义被盗资产最终恢复控制接近全部,其中大部分来自攻击者主动返还,而不是执法追缴。

Wormhole 依靠补资之后,再通过司法命令和技术执行取回资产。

Ronin 依靠链上追踪,交易平台和跨国执法冻结;而使用者是由公司的再资本化获偿的。

Multichain 依靠稳定币发行方冻结,加上后来的破产清算诉讼。

而 Nomad,Harmony,Multichain,Orbit 都留下了显著的未恢复敞口。

所以真正决定可执行性的,不是链上是否看得见那个地址。

是能不能找到一个链外的抓手:一家中心化交易所可以冻结账户;稳定币发行方可以拉黑;司法管辖内的前端或者控制系统可能被法院命令协助;而实体被识别并拘捕之后可以执行扣押。

归因的强度也差别很大,必须逐案分层。

Ronin 有美国联邦调查局在 2022 年4 月的正式归因;Harmony 也有 2023 年初的正式归因。这两处的强度,高于分析公司或者媒体说看起来像谁。

Nomad 有刑事指控,而不能把整个群体性的复制提款归给一个人。

Poly,Wormhole,Multichain,Orbit 的归因明显更弱。有的攻击者身份从来没有得到政府正式公开归因;有的司法程序针对的是未知攻击者控制的资产,确立财产权利并不等于确定了现实身份;而某些关于国家级行为体的说法,只能写成公司和安全行业的怀疑。

这里有一句话值得单独摆。

链上透明度解决的是交易归属的一部分,而不是现实世界里人的归属。

区块链可以强力回答:哪个地址收到了币,换成了什么,经过哪个交易所,桥或者混币器,最终停在哪个地址。

而混币器的作用边界也很清楚:它会破坏简单的输入输出映射,而不会让前后的链上交易消失。分析公司可以给出概率性的追踪,真正的冻结仍然依赖交易所,发行人或者司法机关。

所以那句钱在链上一直看得见,只说对了一半。

看得见和拿得回来,中间隔着的不是技术,是管辖权。

而管辖权这个东西,恰恰是这整套设计当初想绕开的。

所以那几次成功的追回,靠的都是这套设计没能绕开的地方:一家要遵守制裁名单的发行方,一家要配合法院的交易所,或者一个可以被拘捕的人。

最后是这门生意本身的两头。

流动性提供者,中继方和协议金库,获得的是小额而持续的费用。

而在桥出现资不抵债的时候,承担巨额,离散的尾部损失的,是封装资产的持有人,流动性提供者,补资方或者代币持有人。

小额持续的收入在一侧,巨额离散的损失在另一侧。

这个形状在这个系列里已经出现过几次。第九篇里流动性提供者收的是每笔千分之三,而承担的是价格移动之后的库存损失;第十篇里预言机节点收的是按次计的服务费,而报错一次可以让下游损失一亿。

而桥这一处是最极端的:费用按笔收,以基点计;而失效是一次性的,以亿计。

有没有公司资本或者保险把这两者重新连接起来,是逐案的合同和治理问题。

它不能从去中心化桥这个标签里推出来。

八 两条链之间

有几种流行说法需要改写。

跨链桥是加密领域最大的安全弱点。

这个版本过宽。最常被引用的那个数据来自一家分析公司:2022 年8 月,它估计当年到那时共有 13 起跨链桥被攻击,约 20 亿美元被盗,占当年当时全部被盗价值的 69%。

而这个 69% 的分母,是这家公司当年迄今纳入其攻击数据集的被盗资金,不是整个加密资产市值,不是所有犯罪损失,也不是历史累计的漏洞损失。

它的全年统计后来又变成另一个口径:2022 年的攻击总损失约 38 亿,其中协议类约 31 亿,而跨链桥占其中的 64%。这个 64% 的分母是那 31 亿,不能和年中那个 69% 直接比较。

而到 2024 年,这家公司统计的攻击结构已经改变:私钥被控制占其全年被盗价值的 43.8%,集中式服务在部分季度成为更主要的目标。

所以桥是最大弱点,是一个对 2022 年那个特定数据集很有基础的描述,而不是一个跨年份的恒等命题。

多签越多,桥就越安全。

材料只支持一个更窄的版本:安全性取决于达到阈值所需要的独立故障域数量,而不是公钥列表的长度。

桥只是因为私钥管理差才会被盗。

同样过窄。Ronin,Harmony,Multichain 和可能的 Orbit 确实说明了密钥与控制面的风险;而 Wormhole 是验签缺陷,Nomad 是初始化逻辑缺陷,Poly 是跨合约权限缺陷,那座原生桥是证明验证失败。

更窄的版本是:桥的重大损失主要集中在谁有权让另一条链接受一个跨链事实这个边界上;而这个边界既可能因为密钥失窃而失败,也可能因为验证器,证明,升级,权限或者初始化逻辑而失败。

轻客户端桥是真正无信任的。

如果无信任指的是不需要任何安全假设,这个说法不成立。它要相信源链的共识与终局性,轻客户端代码和目标链的执行;如果源链的共识本身被攻破,一个正确的轻客户端会忠实地接受那个被共识确认的恶意状态。

如果无信任定义为不引入一个额外的外部验证委员会,那么这一类设计确实比外部验证的桥少了一层第三方信任。

原生跨链一定比第三方桥安全。

这要拆成两种原生。如果原生指的是轻客户端式的验证,优势是少一个外部委员会。而如果原生只是由链的官方团队维护一套独立的桥验证者或者多签,那么官方并不会自动消除额外的信任。

那座出问题的原生桥恰恰是最直接的反例:它是两条原生链之间的桥,却因为证明验证库的漏洞,在没有抵押的情况下产生了 200 万枚。

所以原生是一种组织和产品关系的描述,不是一项形式化的安全属性。

现在回到第一节。

跨链的实质,从来不是把一样东西从 A 搬到 B。

是让 B 接受一句关于 A 的话。

而这几起事故,攻的恰好是这句话的五个不同部件。

Poly 攻的是谁有权改写说话者。

Wormhole 和那座原生桥攻的是如何判断这句话有证明。

Ronin 和 Harmony 攻的是谁能签这句话。

Nomad 攻的是什么话默认算已经证明。

Multichain 和 Orbit 暴露的是,现实世界里究竟谁控制着说话的那套基础设施。

五种攻击,一句话的五个部件。

而这五个部件里,没有一个属于密码学。

签名算法本身从来没有被破解过。哈希函数没有被碰撞过。共识规则没有被违反过。

出问题的全部是那句话怎么被生成,被传递,被判断的那一整套安排。

这一条对整个域都有用。密码学能保证的是一份签名确实来自某把私钥;它保证不了那把私钥在谁手上,也保证不了检查那份签名的代码写对了没有。

上一篇写的是一部法律要靠人去执行,而人可以不做。

而这一次没有人可以不做。B 链的合约收到那句话就会执行,不会犹豫一秒钟。

问题在于那句话是怎么来的。

第十篇里那道缝在链和外面的世界之间:链不知道一个价格是不是真的,它只知道有人说了那个价格。

这一次那道缝挪了位置。

它在两条链之间。

而这两条链都是可验证的,都是不可篡改的,每一笔都是公开的。

A 有共识。B 有共识。

而 A 和 B 之间没有共识。

余项就在那里。

它不在 A 链上。A 链那笔锁定的记录清清楚楚,今天还查得到。

它也不在 B 链上。B 链那笔铸造的记录同样清清楚楚。

它在两段清清楚楚的记录之间,那一小段没有任何一方的共识覆盖的地方。

而所有的桥,都是在那一小段上搭出来的。

这一小段的长度,决定了这门生意本身。

如果两条链之间不需要任何东西,那就不需要桥。而正因为需要,才有人来搭;而每一个搭法,都是在回答同一个问题:那句话由谁来说,凭什么被信。

而十五年下来,还没有一个搭法能把这个问题取消掉。它只能被搬到不同的地方:搬给一组签名者,搬给一段验证代码,搬给一份状态证明,或者搬给两条链自己的共识。

每搬一次,出问题的位置就换一次。

而它从来没有消失过。

两边的链都在正常出块。锁定的那一笔有效,铸造的那一笔也有效,每一笔都签得对,每一笔都验得过。

而它们对不上。

链还在结算,而结算什么还没有共识。

资料说明

本文依据公开协议文档、链上记录、法院文书、监管文件与同行评议研究写成;文中的数字均保留其统计口径。系列资料截至 2026 年 8 月。

Where next

沿着问题继续读