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

相关推荐
郝学胜-神的一滴几秒前
[简化版 GAMES 101] 计算机图形学 03:线性代数下
开发语言·c++·线性代数·图形渲染
Dxy12393102161 分钟前
如何使用 ECharts 绘制 K 线图
开发语言·javascript
fe7tQnVan2 分钟前
从玩具到生产:基于 ChromaDB 打造工程级 RAG 系统
开发语言·c#
Frank_refuel11 分钟前
QT->信号与槽详解下补充(概述、使用、自定义、连接方式、其他说明)
开发语言·qt
happymaker062611 分钟前
VueCli标准化工程中的组件通信操作
开发语言·前端·javascript
ySq0REx0115 分钟前
.NET 10 & C# 14 New Features 新增功能介绍-.NET CLI工具改进
开发语言·c#·.net
Howrun77718 分钟前
C++ 项目测试全指南:从 0 基础到落地实操
开发语言·c++·log4j
小灰灰搞电子19 分钟前
Qt UI 线程详解-阻塞与解决方案
开发语言·qt·ui
追光的蜗牛丿20 分钟前
C++传递参数时什么情况下传递引用
开发语言·javascript·c++
Pocker_Spades_A21 分钟前
Python快速入门专业版(五十六)——爬虫会话管理:Cookie与Session原理及实战(保持登录状态)
开发语言·爬虫·python