XCM 预编译(XCM Precompile)

原文作者: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 进行测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值