跳转到内容

Wormhole — 多链之间替你跑腿的"邮政系统"

待复核

Wormhole 是一套跨链通用消息协议——让一条区块链上的合约能”喊话”另一条链上的合约,让它做事(转代币、调方法、记账)。日常类比:像多国邮政联盟,A 国的信件经过 19 个邮局共同盖章,B 国邮局看到 13 枚以上有效印章就承认这封信,照单办事。

每条链各自封闭,互相不知道对方发生过什么。Wormhole 用 19 个独立运行的 Guardian 节点当外部观察者:它们盯着源链发生的事件,等源链 finality(最终确认,像邮局盖”妥投”章、不可再退件)后各自签名,把”已发生”的事实凝固成一份带签名的小数据包——VAA(Verifiable Action Approval)。任何人都能把这份 VAA 提交到目标链,目标链合约验证至少 13/19(quorum,法定多数)签名后就执行预定动作。

源链合约 emit("转 100 USDC 到 Bob 在以太坊的地址")
↓ Guardian 19 个节点观察 + 各自签名
↓ off-chain gossip 聚合成 VAA
任何人 → 把 VAA 提交到以太坊 Wormhole 合约
↓ 验证 13/19 签名
目标合约 → mint 100 包装 USDC 给 Bob

不理解跨链消息层,下面这些事都没法解释:

  • 为什么 Solana 链上的 USDC 能在以太坊也是 USDC——它不是”传送”过去的,是 Wormhole 发的”凭证”让以太坊合约 mint 一份
  • 为什么 2022 年一次跨链桥事故能丢 3.25 亿美元——签名验证一行代码漏掉就开门
  • 为什么”通用消息”比”代币桥”更重要——代币桥只是 message passing 的一种特例,通用层能跑借贷、清算、治理投票
  • 为什么跨链总要等几分钟到几十分钟——不是网络慢,是源链 finality 决定的(以太坊 ~13min)

整个 Wormhole 协议拆开就是 三件东西

  1. Guardian 网络:19 个独立运行的节点,每个有自己的私钥。类比”19 国海关共同盖章”——任意 13 国(2/3+)盖了章,世界其他海关就承认。私钥不放任何一个公司,也不放链上。

  2. VAA(Verifiable Action Approval):跨链版的”已签名报关单”。结构 = 头(版本 + Guardian set 编号 + 签名列表)+ 身(哪条链 / 哪个 emitter 合约发的——像寄件人章 / sequence 编号 / payload 数据)。VAA 一旦签好就是不可变的事实证据。

  3. Core 合约:每条支持的链上都部署一份小合约,只做两件事——emit message(往外发)和 verify VAA(验签 + 调回应用合约)。应用合约(桥、NFT、DeFi)建在它之上。

三者合起来叫 xDapp 框架(cross-chain dApp)。

案例 1:跨链转 USDC(Portal Bridge)

Section titled “案例 1:跨链转 USDC(Portal Bridge)”

用户把 100 USDC 从 Solana 转到以太坊(下列为示意 API,非可编译 Solana 程序):

# Solana 端(Rust 程序,此处用伪代码)
portal.transferTokens(USDC_mint, 100_000000, ETH_chain_id=2, bob_eth_address, fee)
# → 锁 USDC 进金库 + wormhole.publishMessage(payload)

Guardian 观察 emit、等 Solana 确认、各自签名、聚合成 VAA。Bob(或任意 relayer)把 VAA 提交到以太坊:

// 以太坊端:验签后 mint 包装 USDC
portal.completeTransfer(vaaBytes);
// → parseAndVerifyVM:验 13/19 签名
// → 应用层把 (emitter_chain, emitter, sequence) 写入 mapping 防重放
// → mint 100 wUSDC 给 bob_eth_address

Guardian 只签一份 VAA;relay 可重试,靠 sequence 三元组防重放。

案例 2:NTT(原生代币转账,不再包装)

Section titled “案例 2:NTT(原生代币转账,不再包装)”

包装代币的痛点:以太坊 USDC 经 Wormhole 到 Polygon 变成 wUSDC,合约地址不同,DEX 流动性分裂。NTT 让发行方自己控制:源链 burn + 目标链 mint 原生代币:

ntt.transfer(amount, recipient, destChain);
// 源链:token.burn(amount) + publishMessage("mint …")
// 目标链:验 VAA → token.mint(recipient, amount)

逐部分解释

  • burn:源链销毁,总供应量先减
  • VAA:只证明”已 burn 这么多”,不搬运代币本体
  • mint:目标链按同一数量铸造原生代币,跨链总量恒定

案例 3:通用合约调用(不只是转钱)

Section titled “案例 3:通用合约调用(不只是转钱)”

借贷协议想做”以太坊抵押 ETH,在 Arbitrum 借 USDC”:

// 以太坊:锁抵押 + 发消息
collateral.lock(msg.sender, amount);
wormhole.publishMessage(abi.encode("BORROW", msg.sender, USDC, borrowAmt));
// Arbitrum:验 VAA → 校验抵押率 → 放款
function onMessage(bytes vaa) external {
(action, user, token, amt) = decode(verify(vaa));
require(action == "BORROW");
USDC.transfer(user, amt);
}

逐部分解释

  • 源链只负责”锁仓 + 喊话”,不直接碰目标链资产
  • payload 是任意 bytes,可编码 BORROW / 投票 / NFT 元数据
  • 目标链合约自己决定信不信、怎么执行——这就是通用消息层
  1. Guardian 多签 ≠ 去信任:13/19 串谋或私钥泄漏即全网失守,本质是有外部信任假设的 multi-sig;比 zk-proof / light client 简单,安全模型完全不同。
  2. VAA 重放攻击:协议层 sequence 单调递增,但 应用合约自己要把 (emitter_chain, emitter_address, sequence) 存进 mapping,下次见到就拒——不少集成方漏掉这一步被偷过。
  3. Finality 等待差异极大:以太坊 ~13min(2 个 epoch),Solana 秒级,BSC ~1 分钟;同一笔跨链 UX 因方向差几十倍,产品要提前告知等待时间。
  4. 2022 hack 根因:Solana 端 verify_signatures 用了未校验 instructions sysvar 地址的废弃 API(load_instruction_at),攻击者注入伪造 sysvar 绕过验签,mint 12 万 wETH(约 3.25 亿美元)。教训:验签路径必须用 checked API,并校验 sysvar 账户身份。

适用

  • 多链 dApp 需要跨链消息(DeFi 跨链清算、跨链治理投票、跨链 NFT 元数据同步)
  • 代币桥(包装代币 / NTT 原生代币)
  • 链覆盖广 + 集成成熟度高的需求(30+ 链中很多没别家方案)

不适用

  • 完全 trustless 要求(要 zk-bridge / 光明正大的 light client,不是 Guardian 多签)→ 看 zk-bridge 类方案
  • 高频低值小额(VAA 上链 gas 不便宜,单笔几美元起跳)
  • 仅以太坊 L2 之间互通(用 arbitrum / optimism 原生 L1↔L2 消息更便宜)
  • 链下应用调用(Wormhole 是链到链,不是链到 web2 后端)
  • 2020 年:Solana 生态启动 Wormhole v1,最初只接 Solana ↔ Ethereum 一条线,目的是把 Solana 上的资产桥到以太坊享受 DeFi 流动性。
  • 2021 年:升级到 v2,Guardian 网络从 9 扩到 19,加入 BSC / Polygon / Avalanche。VAA 格式定型成今天的样子。
  • 2022 年 2 月:Solana 端因废弃 sysvar API 未校验账户身份被攻破,攻击者 mint 12 万 wETH(约 3.25 亿美元)。Jump Crypto 当天宣布补足资金。
  • 2023-2024 年:扩展到 Aptos / Sui / Cosmos / Near 等 30+ 链;推出 NTT(原生代币转账);推出 Connect(前端 SDK)。
  1. 跨链的本质是”消息 + 验证”——代币桥只是消息层的一种应用,通用消息层可以跑任何跨链业务
  2. 多签 Guardian 是”工程实用主义”的代价——完全去信任要 zk 或 light client,成本高得多;Wormhole 选了”够用 + 落地快”
  3. VAA = 跨链版的签名收据——链下生成、链上验签,与 layerzero 的 oracle + relayer 双独立模型形成对比
  4. 2022 hack 是行业血泪教训——验签依赖的系统账户/API 必须身份校验;事后各桥加强形式化验证与审计
  • layerzero —— 同样是跨链消息协议,Wormhole 用 Guardian 多签,LayerZero 用 oracle+relayer 分离
  • uniswap-v3 —— 多链部署的 DEX,跨链治理/消息是同类场景(未必绑定 Wormhole)
  • arbitrum —— L2,本身有原生 L1↔L2 消息;Arbitrum ↔ Solana 仍需通用跨链消息层
  • optimism —— 与 Arbitrum 同理,原生跨 L1 用 native bridge,跨异构链仍要桥
  • aave-v3 —— 跨链借贷是通用消息层的典型应用场景之一
  • go-ethereum —— 以太坊主网客户端,Wormhole core 合约部署其上
  • bitcoin-core —— Wormhole 暂未原生支持 BTC(无 EVM),需要包装方案
  • axelar —— Axelar — 通用跨链 gateway
  • chainlink-ccip —— Chainlink CCIP — 让两条链像两个银行那样互转钱
  • layerzero —— LayerZero V2 — 让一条链上的合约能给另一条链上的合约发消息
  • pyth —— Pyth Network — 一手数据上链的低延迟预言机