Wormhole 是一个通用跨链消息协议,由一组 19 个 Guardian 节点提供安全保障。每个 Guardian 为每条已连接的链运行一个全节点,并观察 Wormhole Core Contract。当合约通过 publishMessage() 发出消息时,Guardian 会独立观察该事件、签署证明,并在收集到 19 个签名中的 13 个后生成 VAA(Verified Action Approval)。VAA 是基础原语——一个已签名、可移植的证明,表明源链上发生了某事,并可在任何目标链上验证。
一、用途 Wormhole 用于跨链消息传递与代币转移。它支持在链之间发送任意应用数据,也支持代币的跨链流转。其核心机制围绕 VAA 展开:源链发布消息,Guardian 网络签名生成 VAA,目标链验证 VAA 后执行相应动作。
二、主要能力
- 跨链消息:通过 Core Bridge 的 publishMessage() 在源链发出事件,由中继者(自动或手动)获取 VAA 并提交到目标链。
- NTT(Native Token Transfers,原生代币转移):在源链销毁代币、在目标链原生铸造,产出原生代币而非包装代币,代币部署者保留完全控制权。架构包含 NttManager(核心合约,负责销毁/铸造逻辑、速率限制、对等方注册)、Transceiver(通过 Guardian 网络收发消息的传输层)以及代币(授予 NttManager 销毁/铸造权限的 ERC-20)。NTT 内置按对等链的速率限制,入站与出站限额均可配置;若转账超过限额且 shouldQueue = true 则进入队列,若 shouldQueue = false 则回滚。
- Token Bridge(传统代币桥):在源链锁定代币并在目标链铸造包装表示(如 WETHwh)。与 NTT 的区别在于:NTT 产出原生代币,Token Bridge 产出包装代币;选择取决于是否控制代币合约。Token Bridge 会将所有金额归一到 8 位小数,若代币为 18 位小数,最后 10 位会被截断;NTT 无此限制。
- Wormhole Queries:支持无需发送交易的跨链读取。Guardian 在目标链执行读取并返回签名响应,目标链不消耗 gas。查询类型包括 EthCallQueryRequest(在远程链执行 eth_call,读取合约状态)、EthCallByTimestampQueryRequest(在特定时间戳执行 eth_call,读取历史状态)、EthCallWithFinalityQueryRequest(带显式最终性的 eth_call,读取需要已最终确定状态的数据)。
- Standard Relayer(标准中继者):自动处理 VAA 投递——在源链预先付费,中继者投递到目标链。自动 Standard Relayer 对目标链 gas 设有上限;若 receiveWormholeMessages 处理逻辑计算量较大,应使用手动中继或通过 quoteDeliveryPrice 提高 gas 预算。
三、使用方式 安装:npm install @wormhole-foundation/sdk viem。 客户端设置:使用 viem 的 createPublicClient、createWalletClient、http 以及 privateKeyToAccount 创建账户与源链客户端。 发送跨链消息(最小示例):读取 Core Bridge 的 messageFee,构造 payload,通过 simulateContract 调用 publishMessage(nonce, payload, consistencyLevel),再通过 writeContract 发送并等待交易回执,检查 receipt.status 是否为 success。 发布消息(Solidity):合约持有 IWormhole 实例,调用 wormhole.messageFee() 获取费用,校验 msg.value 足够后调用 wormhole.publishMessage{value: fee}(0, payload, consistencyLevel),并发出事件。 接收消息(Solidity):调用 wormhole.parseAndVerifyVM(encodedVaa) 解析并验证 VAA,校验 valid,检查 vm.emitterChainId 与 vm.emitterAddress 是否匹配预期来源,用 keccak256(encodedVaa) 做已消费消息去重,然后处理 vm.payload。 获取 VAA(TypeScript):通过 https://api.wormholescan.io/api/v1 的 /vaas/{emitterChain}/{emitterAddress}/{sequence} 端点轮询获取,带重试与延迟。 NTT 转账:调用 NttManager 的 transfer(amount, recipientChain, recipient),其中 recipient 为 bytes32 格式,需先授权 NttManager。 Standard Relayer 发送:合约持有 IWormholeRelayer,调用 sendMessage(targetChain, targetAddress, payload) 并附带足够费用。
四、关键概念与注意事项 VAA 结构:包含 version(恒为 1)、guardianSetIndex(签署该 VAA 的 Guardian 集合索引)、signatures[](13 个以上 Guardian 签名)以及 body(timestamp、nonce、emitterChainId、emitterAddress、sequence、consistencyLevel、payload)。 一致性级别:1 = Instant(立即观察,不等待最终性,适合低价值、延迟敏感消息);15 = Finalized(等待链最终性,以太坊上为 15 个区块,适合高价值、安全关键转账);200 = Safe(链特定的“安全”头,适合中等价值、平衡延迟与安全)。 Wormhole 链 ID 与 EVM 链 ID 不同:Solana=1、Ethereum=2、BSC=4、Polygon=5、Avalanche=6、Fantom=10、Sui=21、Aptos=22、Arbitrum=23、Optimism=24、Base=30。使用 EVM 链 ID(如 1、42161、8453、10)会静默路由到错误链或回滚。 VAA 必须在目标链验证:原始 VAA 只是字节,目标链的 Core Bridge 合约会先根据当前 Guardian 集合验证 Guardian 签名,再执行任何动作;绝不要信任未验证的 VAA 字节。 Guardian 集合会轮换:Guardian 地址通过治理 VAA 变更,绝不要硬编码 Guardian 公钥或集合哈希,应始终从 Core Bridge 合约读取当前 Guardian 集合。 发布不等于投递:publishMessage() 只在源链发出事件,必须由中继者(自动或手动)获取 VAA 并提交到目标链;没有中继者,消息将永远处于未投递状态。 Emitter 地址是 bytes32 而非 EVM 地址:EVM 链上地址左侧补零,Solana 上为程序的 emitter PDA;跨链比较 emitter 地址时始终需要归一化。
五、适用场景 适用于需要跨链消息传递、原生代币跨链转移、跨链状态读取以及自动 VAA 投递的区块链应用开发场景。
六、限制 资料未提供 Wormhole 的收费、价格、支持平台范围、性能指标或效果保证等信息,暂未提供。