原文作者:PaperMoon团队
XCM(Cross-Consensus Message,跨共识消息)预编译允许 Polkadot Hub 的开发者通过 Solidity 接口,在智能合约中直接使用 XCM 功能。
该预编译部署在一个固定地址:
0x00000000000000000000000000000000000a0000
XCM 预编译提供了三个核心函数:
• execute:在本链上执行 XCM 消息
• send:向其他链发送跨链消息
• weighMessage:估算 XCM 消息的执行成本
本指南将演示如何使用 Remix IDE,通过 Solidity 智能合约与 XCM 预编译进行交互。
注意
XCM 预编译仅提供最底层(barebones)的 XCM 能力。
它具备高度灵活性,但不会帮你封装或抽象 XCM 细节,这些抽象需要由开发者在上层自行构建。
预编译接口
XCM 预编译实现了 IXcm 接口,该接口定义了与 XCM 功能交互所需的结构和方法。接口源码如下:
IXcm.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/// @dev XCM(跨共识消息)预编译在链上的固定地址
address constant XCM_PRECOMPILE_ADDRESS = address(0xA0000);
/// @title XCM 预编译接口
/// @notice 与 `pallet_xcm` 交互的底层接口
/// 调用会直接转发到对应的 dispatchable 函数
/// @dev 文档:
/// @dev - XCM: https://docs.polkadot.com/develop/interoperability
/// @dev - SCALE 编码: https://docs.polkadot.com/polkadot-protocol/parachain-basics/data-encoding
/// @dev - Weight: https://docs.polkadot.com/polkadot-protocol/parachain-basics/blocks-transactions-fees/fees/#transactions-weights-and-fees
interface IXcm {
/// @notice XCM 执行所使用的 Weight v2 结构
struct Weight {
/// @custom:property 基于参考硬件的计算时间消耗
uint64 refTime;
/// @custom:property 执行所需的证明大小
uint64 proofSize;
}
/// @notice 使用调用者的 origin 在当前链上执行 XCM 消息
/// @dev 内部调用 `pallet_xcm::execute`
/// @param message SCALE 编码的 Versioned XCM 消息
/// @param weight 执行所允许的最大 Weight
/// @dev 建议先调用 weighMessage(message) 以确保分配足够的 weight
function execute(bytes calldata message, Weight calldata weight) external;
/// @notice 向其他平行链或共识系统发送 XCM 消息
/// @dev 内部调用 `pallet_xcm::send`
/// @param destination SCALE 编码的 MultiLocation 目标地址
/// @param message SCALE 编码的 Versioned XCM 消息
function send(bytes calldata destination, bytes calldata message) external;
/// @notice 估算执行某条 XCM 消息所需的 Weight
/// @param message SCALE 编码的 Versioned XCM 消息
/// @return weight 包含 refTime 与 proofSize 的 Weight 结构
function weighMessage(bytes calldata message) external view returns (Weight memory weight);
}
Weight 结构说明
Weight 用于描述 XCM 操作的计算成本,由两个部分组成:
• refTime:在参考硬件上执行所需的计算时间
• proofSize:执行所需的证明数据大小
所有 XCM 消息都必须使用 SCALE 编码(Polkadot 的标准序列化格式)。
如需更多信息,可查看 pallet-xcm 中的 precompiles/IXCM.sol 文件。
与 XCM 预编译交互
你可以在 Remix IDE 中直接使用该接口与 XCM 预编译交互:
1. 在 Remix 中新建一个文件 IXcm.sol

2. 将上面的接口代码粘贴进去
3. 编译该接口(点击按钮或使用 Ctrl + S)
在 Deploy & Run Transactions 面板中:
1. 在合约下拉框中选择 IXcm
2. 在 At Address 输入框中填入预编译地址

0x00000000000000000000000000000000000a0000
3. 点击 At Address 连接到预编译合约
连接成功后,你就可以在 Remix 界面中调用:
• execute
• send
• weighMessage

称重(Weigh)一个消息
weighMessage 用于估算执行某条 XCM 消息所需的计算成本。这一步对于在执行或发送消息前评估资源消耗非常关键。
在 Remix 中,你可以使用一个 SCALE 编码的 XCM 消息 来测试,例如:
0x050c000401000003008c86471301000003008c8647000d010101000000010100368e8759910dab756d344995f1d3c79374ca8f70066d3a709e48029f6bf0ee7e

该编码消息表示一组 XCM 指令:
• Withdraw Asset
从本链的主权账户或调用者账户中提取资产,供后续 XCM 指令使用
• Buy Execution
使用提取的资产购买目标链上的执行时间
• Deposit Asset
在扣除执行费用后,将剩余资产存入目标链上的指定账户
该编码消息仅作为示例。你可以根据自己的业务需求构造任意 XCM 消息。
调用成功后,函数会返回一个 Weight 结构,其中包含:
• refTime
• proofSize
它们表示执行该消息所需的预估计算成本。

提示!
你可以在一个 gist 中找到更多 XCM 示例(该示例连接到了 Polkadot Hub TestNet)。
执行(Execute)消息
execute 是 XCM 预编译的主要入口函数,用于在当前链上执行一条 XCM 消息。
执行流程如下:
1. 调用 weighMessage 获取所需的 Weight
2. 将相同的 message 和返回的 weight 传给 execute
在 Remix 中点击 Transact 即可执行该 XCM 消息。
如果执行成功:
• Remix 终端中会显示成功结果
• 你可以进一步检查 XCM 中指定的受益账户是否成功收到资产,以验证执行效果
发送(Send)消息
虽然大多数跨链操作可以通过 execute 完成,但在某些场景下(例如打开 HRMP 通道)需要使用 send。
发送步骤如下:
1. 准备 XCM 格式编码的目标地址(destination)
2. 准备 XCM 消息内容
3. 调用 send(destination, message)

destination 参数必须使用 XCM 的 MultiLocation 格式编码,明确指定目标平行链或共识系统。
与 execute 不同的是:
• send 不需要 weight 参数
• 执行成本由目标链根据其自身费用规则处理

合约内调用(Cross Contract Calls)
除了直接在 Remix 中交互,你也可以将 XCM 功能直接集成到自己的智能合约中:
• 通过 import 或 inherit IXcm 接口
• 在合约函数中直接调用 XCM 相关方法
这种方式可以让你在应用逻辑中无缝集成跨链能力,适用于:
• DeFi 协议
• 治理系统
• 任何需要跨链协作的应用
总结
XCM 预编译为 Polkadot 生态提供了一个简洁但极其强大的跨链接口。
通过构建和执行 XCM 程序,开发者可以充分利用 Polkadot 的互操作性能力,打造真正的跨链应用。
如果你感兴趣探索更多,前往 Polkadot Hub TestNet,开始实际体验 XCM 预编译
• 使用 Hardhat 进行开发
• 使用 PAPI 构建 XCM 程序,并通过 Chopsticks 进行测试
&spm=1001.2101.3001.5002&articleId=157165441&d=1&t=3&u=714f006013654ed4a5d47c964794cdfa)
1008

被折叠的 条评论
为什么被折叠?



