从 0 到 1 实现两条独立区块链Parachain的跨链通信能力之实操指南

原文作者: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/

相关推荐
2401_8898846615 小时前
嵌入式C++测试框架
开发语言·c++·算法
1104.北光c°15 小时前
我理解的Leaf号段模式:美团分布式ID生成系统
java·开发语言·笔记·分布式·github·leaf
DREW_Smile15 小时前
字符函数和字符串函数2
c语言·开发语言
wjs202415 小时前
CSS 颜色
开发语言
无巧不成书021815 小时前
Java数值字面量速查表
java·开发语言·python·开发者·字面量
小鸡吃米…15 小时前
测试线程应用程序
开发语言·python
python开发笔记15 小时前
python(79) 底层代码追踪工具
开发语言·python
kgduu15 小时前
js之错误处理
开发语言·前端·javascript
Bert.Cai15 小时前
Python函数的定义与调用
开发语言·python
美式请加冰15 小时前
模拟的介绍和使用
java·开发语言·算法