平行链上线技术系列五:平行链通过orml-xcm打开hrmp

  • 实验环境

两条平行链 - 链A(2008)和链B(2009)

一条中继链

  • 实验目的

通过 orml-xcm 打开链A和链B之间的 hrmp channel

前提准备

平行链代理账户需要一定的中继链token,所以需要在中级链通过xcmPallet.limitedReserveTransferAssets()向指定的平行链发送代币

下图例子(向链A-2008,转一定的中继链token)

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

平行链代理账户,这是通过paraid生成的账户,他是确定的账户。

para-id=2115的平行链代理账户是:5Ec4AhNzgnZ7jXzsdUAEbGBWu2GNfwppYZdf6P1JqNq6BntW

Open HRMP

开通 HRMP channel 的步骤:

  • 发送方平行链发送一个初始化开放通道请求。

  • 接收方平行链接受请求。

两条链需要互相交替进行操作,因为hrmp是单向的,如果需要进行跨链资产转账就需要打开双向的hrmp通道。

下面通过链A为Sender,链B为Recipient,以打开链A->链B的Hrmp channel为例

链A Sender 2008

1. 在中继链构造hrmp.hrmpInitOpenChannel()的结构体,并获取encoded call data(0x1700d907000008000000e21f0000)。

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

这里有三个参数

  • Recipient 接收者的Para Id

  • proposeMaxCapacity 也是个限制的值

  • proposeMaxMessageSize xcm消息的大小限制

其中proposeMaxCapacity proposeMaxMessageSize的值不能设置的太大,必须要比中继链规定的最大配比要小,要不然会出错。通过中继链ChainState下的configuration.activeConfig()方法查找这项约束。

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

2.回到平行链,通过sudo构造ormlXcm.sendAsSovereign()

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

ormlXcm.sendAsSovereign(
  dest: XcmVersionedMultiLocation
  {
    V1: {
      parents: 1
      interior: Here
    }
  }
  
  message: XcmVersionedXcm
  {
    V2: [
      {
        WithdrawAsset: [
          {
            id: {
              Concrete: {
                parents: 0
                interior: Here
              }
            }
            fun: {
              Fungible: 1,000,000,000,000
            }
          }
        ]
      }
      {
        BuyExecution: {
          fees: {
            id: {
              Concrete: {
                parents: 0
                interior: Here
              }
            }
            fun: {
              Fungible: 40,000,000,000
            }
          }
          weightLimit: Unlimited
        }
      }
      {
        Transact: {
          originType: Native
          requireWeightAtMost: 1,000,000,000
          call: {
            encoded: 
          }
        }
      }
      {
        DepositAsset: {
          assets: {
            Wild: All
          }
          maxAssets: 1
          beneficiary: {
            parents: 0
            interior: {
              X1: {
                Parachain: 
              }
            }
          }
        }
      }
    ]
  }
)

-hex-call>为上面我们构造的encode call data:0x1700d907000008000000e21f0000

为我们当前平行链的para id:2008

交易成功之后,会在中继链执行encode call data的函数。

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

链B Recipient 2009

1. 在中继链构造hrmp.hrmpAcceptOpenChannel()的结构体,并获取encoded call data。(0x1701d8070000)

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

其中参数中的sender为发送者的paraid,也就是对应链A的paraid(2008)

2. 回到平行链,通过sudo构造ormlXcm.sendAsSovereign()

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

ormlXcm.sendAsSovereign(
  dest: XcmVersionedMultiLocation
  {
    V1: {
      parents: 1
      interior: Here
    }
  }
  
  message: XcmVersionedXcm
  {
    V2: [
      {
        WithdrawAsset: [
          {
            id: {
              Concrete: {
                parents: 0
                interior: Here
              }
            }
            fun: {
              Fungible: 1,000,000,000,000
            }
          }
        ]
      }
      {
        BuyExecution: {
          fees: {
            id: {
              Concrete: {
                parents: 0
                interior: Here
              }
            }
            fun: {
              Fungible: 40,000,000,000
            }
          }
          weightLimit: Unlimited
        }
      }
      {
        Transact: {
          originType: Native
          requireWeightAtMost: 1,000,000,000
          call: {
            encoded: 
          }
        }
      }
      {
        DepositAsset: {
          assets: {
            Wild: All
          }
          maxAssets: 1
          beneficiary: {
            parents: 0
            interior: {
              X1: {
                Parachain: 
              }
            }
          }
        }
      }
    ]
  }
)

为上面我们构造的encode call data:0x1701d8070000

为我们当前平行链的para id:2009

发起交易后,在中继链可以查看到执行成功的日志。

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

检查是否成功打开HRMP Channel

1. 查看中继链存储hrmp.hrmpOpenChannelRequestList()

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

2. 观察中继链页面中parachains的in/out内容(如果是1就说明打开了)

平行链上线技术系列五:平行链通过orml-xcm打开hrmp

参考链接

Open HRMP Channel:

https://wiki.acala.network/build/development-guide/composable-chains/open-hrmp-channel

如有疑问联系邮箱:
*本文转载自网络转载,版权归原作者所有。本站只是转载分享,不代表赞同其中观点。请自行判断风险,本文不构成投资建议。*