从 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/

相关推荐
清水白石0082 小时前
依赖注入的优雅:不用框架,在 Python 中实现轻量级依赖注入
开发语言·python
游乐码2 小时前
c#里氏替换
开发语言·c#
未来之窗软件服务2 小时前
AI人工智能(十二)C# 运行sensevoice onnx—东方仙盟练气期
开发语言·人工智能·c#·仙盟创梦ide·东方仙盟
weixin_440401692 小时前
Python数据分析-合并清洗与转换(concat+lambda函数+apply+删除drop/替换数据replace)
开发语言·python·数据分析
Dxy12393102162 小时前
Python如果遇见乱码可以通过二进制判断是什么编码吗?
开发语言·python
TTBIGDATA2 小时前
【Atlas】Atlas 搜索时报 `__AtlasUserProfile` 不存在导致事务回滚
开发语言·python·ambari·kerberos·ranger·atlas·bigtop
devmoon2 小时前
区块链预言机(Oracle)解析:Polkadot、以太坊与 Solana 如何把现实世界带入链上?
开发语言·oracle·区块链·信息与通信·以太坊·polkadot·solana
Lsir10110_2 小时前
【Linux】生产者-消费者模型及条件变量
linux·运维·开发语言·c++
Coding茶水间2 小时前
基于深度学习的鸡数量统计系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习