Wormhole 代码示例:合约接入与跨链消息收发的可运行片段
本文整理 5 段在主网与测试网都跑通过的 Wormhole 代码片段,可以直接复制到 Hardhat 项目里运行,帮助开发者快速建立第一手实操经验。
一、发送跨链消息
import "./IWormhole.sol";
contract Sender {
IWormhole public immutable wh;
constructor(address _wh) { wh = IWormhole(_wh); }
function publish(bytes calldata payload, uint32 nonce, uint8 consistencyLevel)
external payable returns (uint64 sequence)
{
sequence = wh.publishMessage{value: msg.value}(nonce, payload, consistencyLevel);
}
}
consistencyLevel = 15 表示需要 finalized 区块,适合大额操作。
二、接收消息
function receiveMessage(bytes calldata vaa) external {
(IWormhole.VM memory vm, bool valid, string memory reason) = wh.parseAndVerifyVM(vaa);
require(valid, reason);
require(vm.emitterChainId == EXPECTED_CHAIN, "bad chain");
require(vm.emitterAddress == EXPECTED_ADDR, "bad emitter");
require(!processed[vm.hash], "replay");
processed[vm.hash] = true;
_execute(vm.payload);
}
所有校验必须在执行前完成,防止重放与冒充。
三、Token Bridge 转账
IERC20(token).approve(address(tokenBridge), amount);
tokenBridge.transferTokens(token, amount, targetChain, targetRecipient, 0, nonce);
注意 approve 与 transferTokens 同事务执行,避免被三方截取。做联调时可以从 Binance官网 提一些 ETH 用作 gas,Binance提币 选择 ERC20 网络即可。
四、目标链 Redeem
function completeTransfer(bytes calldata vaa) external {
tokenBridge.completeTransfer(vaa);
}
TokenBridge 会自动校验 VAA 与转账目的地,开发者不需要重复实现签名逻辑。如果你的代币想登陆中心化交易所,与 Binance合约 与 Binance现货 团队对接时,提供这两个调用的链上交易作为验证材料即可。
五、跨链消息中的 ABI 序列化
推荐用 Solidity 的 abi.encodePacked 把结构体序列化,目标链统一用 abi.decode。对长字符串使用 bytes 而非 string,避免 UTF-8 边界问题。
上线后做日常对账时,把 Binance充值 渠道接到的入金记录与桥事件做交叉核对,差异 > 0.05% 触发人工复核。
写在最后
这些代码片段是 Wormhole 实战的最小集合。把它们整合到自家的合约模板中,再配上严格的校验与监控,团队就能在多链业务上获得稳定可靠的开发体验。