原文作者: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 前的准备条件
在开始之前,你必须满足以下条件:
-
一个包含 Relay Chain 的网络(例如 Rococo Local)
-
至少两条已连接的 Parachain
-
可操作的账户钱包
-
账户有足够余额(用于 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 执行费用。
你需要:
-
打开 Polkadot.js Apps
-
连接 Relay Chain
-
将资金转入 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 → 执行通道创建 → 扣费 → 退款
然后:
-
连接 Parachain 2500
-
在 polkadotXcm.send 中填入 encoded call
-
提交交易

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 接受。
七、常见错误(非常重要)
最常见失败原因:
-
没给 Sovereign Account 充值
-
权限 origin 不正确(sudo)
-
XCM weight 不够
-
beneficiary 地址填错
-
Relay Chain 没连接对
八、你刚刚完成了什么?
完成以上步骤后,你实际上实现了:
• 平行链级别跨链通信
• XCM 执行能力
• 跨链远程调用
• 跨链资产传输基础
这一步在 Polkadot 里非常关键,因为:没有 HRMP,就没有真正意义上的多链生态。
原文链接:https://docs.polkadot.com/parachains/interoperability/channels-between-parachains/