原文作者:PaperMoon团队

在 Polkadot 平行链之间建立 HRMP 通道的完整实操指南。

一、什么是 HRMP?

在 Polkadot 中,Parachain 之间并不是默认可以互相通信的。跨链通信必须通过一种协议建立“通信管道”。这个协议就是:

HRMP — Horizontal Relay-routed Message Passing(横向中继路由消息传递)

它的本质可以理解为:

Relay Chain 充当“路由服务器”,而 HRMP 就是两条平行链之间的一条消息队列管道。

建立 HRMP 通道后:
    •    平行链可以发送 XCM 消息
    •    可以跨链转移资产
    •    可以远程调用另一条链上的逻辑(跨链执行)

单向 vs 双向

一个非常容易被误解的点:HRMP 通道是单向的。

也就是说:

Parachain A → Parachain B

只允许 A 给 B 发消息。如果你希望:A ↔ B,你必须再开一条:B → A。

换句话说:双向通信 = 两条 HRMP 通道

二、建立 HRMP 前的准备条件

在开始之前,你必须满足以下条件:
    1.    一个包含 Relay Chain 的网络(例如 Rococo Local)
    2.    至少两条已连接的 Parachain
    3.    可操作的账户钱包
    4.    账户有足够余额(用于 XCM 执行费用)

三、整体流程总览

建立 HRMP 其实是一个 四步握手过程:

1)发送链:发起通道请求
2)Relay Chain:记录请求
3)接收链:接受请求
4)Relay Chain:建立通道

完成后,通道正式存在。

四、发送方:发起 HRMP 通道

本示例:
    •    发送链:Parachain 2500
    •    接收链:Parachain 2600
    •    Relay Chain:Rococo Local

Step 1:为发送链 Sovereign Account 充值

每条 Parachain 在 Relay Chain 上都有一个账户:

Sovereign Account(主权账户)

它的作用是:

用来支付跨链 XCM 执行费用。

你需要:
    1.    打开 Polkadot.js Apps
    2.    连接 Relay Chain
    3.    将资金转入 Parachain 2500 的 Sovereign Account

否则:
XCM 会执行失败(最常见错误之一)

为了生成某条 Parachain 的 Sovereign Account(主权账户)地址,需要按以下步骤进行:

1)确定该平行链的类型

首先需要判断该平行链属于哪一种关系类型:
    •    上/下级链(up/down chain):即父链或子链关系
使用前缀 0x70617261(解码为字符串 b"para")
    •    兄弟链(sibling chain):即两条平行链之间的关系
使用前缀 0x7369626c(解码为字符串 b"sibl")

2)计算 Parachain ID 的 u32 SCALE 编码值

将平行链 ID 进行 u32 类型的 SCALE 编码(小端序)。

例如:

Parachain 2500 的编码结果为:c4090000

3)拼接前缀与编码后的 Parachain ID

将前缀与 Parachain ID 的编码拼接,即可得到完整的 Sovereign Account 地址。

例如,Parachain 2500 在 Relay Chain 上的主权账户地址为:

0x70617261c4090000000000000000000000000000000000000000000000000000

其对应的 SS58 格式地址 为:

5Ec4AhPSY2GEE4VoHUVheqv5wwq2C1HMKa7c9fVJ1WKivX1Y

4)工具方式生成(推荐)

你也可以直接使用 Substrate Utilities 工具中的:

“Para ID → Address”

功能来自动完成该转换。

Step 2:构造打开通道的 Extrinsic

进入:

Polkadot.js → Developer → Extrinsics

选择:

pallet: hrmp
function: hrmpInitOpenChannel

填写参数:

参数

含义

recipient

目标平行链 ID(2600)

proposedMaxCapacity

通道最大排队消息数量

proposedMaxMessageSize

最大消息大小

编码后的调用数据示例:

0x3c00280a00000800000000001000

复制这个 encoded call data。

Step 3:发送 XCM 消息到 Relay Chain

你现在要做的不是直接在 Relay Chain 调用。

而是:让 Parachain 2500 通过 XCM 去请求 Relay Chain 执行这笔交易。

需要构造一个 XCM Message。

XCM 指令包含:

指令

作用

WithdrawAsset

从主权账户取钱

BuyExecution

购买执行权重(gas)

Transact

执行 hrmpInitOpenChannel

RefundSurplus

退还剩余费用

DepositAsset

把剩余资金退回账户

本质过程:

从平行链主权账户 → Relay Chain → 执行通道创建 → 扣费 → 退款

然后:
    1.    连接 Parachain 2500
    2.    在 polkadotXcm.send 中填入 encoded call
    3.    提交交易

Step 4:验证请求是否成功

连接 Relay Chain:

Developer → Chain state

查询:

hrmp → hrmpOpenChannelRequests

如果成功:

你会看到 2500 → 2600 的待处理请求。这说明:Relay Chain 已记录你的通道申请,正在等待对方同意。

五、接收方:接受 HRMP 通道

现在轮到 Parachain 2600。

Step 1:为接收链主权账户充值

和发送链一样:必须给 2600 的 Sovereign Account 充值,否则接受操作会失败。

Step 2:构造接受通道的 Extrinsic

进入:

Relay Chain → Developer → Extrinsics

选择:

hrmp → hrmpAcceptOpenChannel

参数:

参数

含义

sender

请求链 ID(2500)

encoded call data:

0x3c01c4090000

复制。

Step 3:发送接受请求的 XCM

现在,由 Parachain 2600 向 Relay Chain 发送 XCM。与之前类似,但注意:在最后 DepositAsset 中,beneficiary 必须填写 2600 的 Sovereign Account 提交交易。

Step 4:验证通道建立

再次进入:

Relay Chain → Developer → Chain state

查询:

hrmp → hrmpChannels

如果成功,你将看到一个正式通道记录。这意味着:HRMP 通道已经创建完成。

六、建立双向通信

目前你只有:

parachain 2500 → parachain 2600

如果你希望双向

2500 ↔ 2600

需要再做一次流程:由 2600 发起 → 2500 接受。

七、常见错误(非常重要)

最常见失败原因:
    1.    没给 Sovereign Account 充值
    2.    权限 origin 不正确(sudo)
    3.    XCM weight 不够
    4.    beneficiary 地址填错
    5.    Relay Chain 没连接对

八、你刚刚完成了什么?

完成以上步骤后,你实际上实现了:
    •    平行链级别跨链通信
    •    XCM 执行能力
    •    跨链远程调用
    •    跨链资产传输基础

这一步在 Polkadot 里非常关键,因为:没有 HRMP,就没有真正意义上的多链生态。

原文链接:https://docs.polkadot.com/parachains/interoperability/channels-between-parachains/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐