原文作者:PaperMoon团队

平行链锁定机制(Parachain Lock) 是 Polkadot 生态中的一项重要安全设计,用于在平行链生命周期的早期阶段防止潜在的中心化风险,从而维护网络的去中心化特性。

在平行链刚上线运行时,如果控制权过度集中于单一账户或管理者,容易带来安全与治理风险。锁定机制通过多方权限约束,确保平行链在关键阶段受到合理约束。

锁定系统遵循以下明确规则:
    •    中继链治理(Relay Chain Governance)有权锁定任意平行链
    •    平行链可以锁定自身
    •    平行链管理者(Parachain Manager)有权锁定平行链
    •    当平行链成功生成第一个区块时,系统会自动加锁

对应地,解锁流程也受到严格控制:
    •    中继链治理可以解锁任意平行链
    •    平行链可以解锁自身的锁定状态

本文将介绍:
    •    如何查询平行链的锁定状态
    •    如何从平行链侧通过 XCM 安全执行解锁操作
    •    如何准备解锁调用与资金
    •    如何构造并发送解锁用 XCM 消息

检查平行链是否被锁定

在执行解锁操作前,必须先确认当前平行链的锁定状态。可以通过 Polkadot.js Apps 进行查询。

查询步骤
    1.    打开 Polkadot.js Apps,连接到中继链(Relay Chain)
    2.    进入 Developer → Chain State
    3.    查询锁定状态:

    •    选择 registrar
    •    选择 paras
    •    输入要查询的平行链 ID(例如:2006)
    •    点击 + 执行查询

返回字段说明

查询结果中包含以下关键字段:
    •    manager:为该平行链注册并提供押金的账户
    •    deposit:注册时预留的保证金数量
    •    locked:是否处于锁定状态,若为 true 表示当前无法由 manager 控制

通过该字段可确认是否需要执行解锁操作。

如何解锁平行链

解锁平行链需要向中继链发送一条 XCM(Cross-Consensus Message),并以 Root 权限执行解锁调用;或者通过中继链治理系统执行 Root 调用。

如果使用 XCM 方式:
    •    发起方必须具备足够授权
    •    通常通过 sudo pallet(测试环境)或治理系统(生产环境)实现

本文以启用了 sudo 的平行链为示例进行说明。若使用治理系统,则需相应调整 XCM 的提交方式。

准备解锁调用

在发送 XCM 之前,需要先构造将在中继链上执行的解锁交易,即 registrar.removeLock extrinsic。

构造 removeLock 调用步骤
    1.    在 Polkadot.js Apps 连接中继链
    2.    进入 Developer → Extrinsics
    3.    构建 registrar.removeLock:

    •    选择 registrar pallet
    •    选择 removeLock extrinsic
    •    填写 parachain ID(例如:2006)
    •    复制 encoded call data(编码后的调用数据)

校验编码数据

可以参考官方提供的 removeLock 解码示例进行比对,确保你的编码数据格式正确。

计算交易 Weight

需要估算执行该调用所需的 weight:
    •    使用 transactionPaymentCallApi.queryCallInfo
    •    输入刚才获得的 encoded call data

该 weight 将用于后续 XCM 中的执行参数配置,是保证 XCM 成功执行的关键参数。

为主权账户准备资金

为了让 XCM 成功执行,你的平行链在中继链上的 Sovereign Account(主权账户) 必须具备足够余额用于支付交易费用。

该账户地址由平行链 ID 确定性派生而来。

获取 Sovereign Account 的方式

可以通过以下方式获取:

方式一:Runtime API
调用:

locationToAccountApi.convertLocation

将平行链 Location 转换为中继链上的账户地址。

方式二:Substrate Utilities
使用工具直接计算 ParaID 对应的 sovereign account。

Use the "Para ID" to Address section in Substrate Utilities with the Child option selected.

方式三:手动计算
按照官方规则计算(适用于高级用户场景)。

Identify the appropriate prefix:

For parent/child chains use the prefix 0x70617261 (which decodes to b"para").
Encode your parachain ID as a u32 SCALE value:

For parachain 2006, this would be d6070000.
Combine the prefix with the encoded ID to form the sovereign account address:

Hex: 0x70617261d6070000000000000000000000000000000000000000000000000000
SS58 format: 5Ec4AhPW97z4ZyYkd3mYkJrSeZWcwVv4wiANES2QrJi1x17F

充值方式

可以从中继链任意账户向该 sovereign account 发起普通转账。

具体充值金额需参考 XCM Payment API,并结合后续构造的 XCM 消息确定。

构造并提交 XCM

当解锁调用准备完成、主权账户已充值后,即可从平行链向中继链发送 XCM。

该 XCM 需要按顺序完成以下操作:
    1.    从 sovereign account 中提取 DOT
    2.    支付执行费用
    3.    执行 registrar.removeLock
    4.    将剩余资金退回 sovereign account

示例:以 Astar(Parachain 2006)为例提交 XCM

以下示例展示如何使用 Polkadot.js Apps 构造解锁 XCM。

Root 权限说明

本示例使用 sudo pallet 进行 Root 执行,仅适用于测试环境。

生产链应通过治理系统发起 Root 调用。

步骤一:构造 sudo.sudo + polkadotXcm.send
    1.    在 Polkadot.js Apps 连接平行链
    2.    进入 Developer → Extrinsics
    3.    构造调用:

    •    使用 sudo.sudo
    •    内部执行 polkadotXcm.send
    •    选择 polkadotXcm pallet
    •    选择 send extrinsic
    •    将 dest 设置为 Relay Chain

步骤二:构造 XCM 指令并提交

按照以下顺序构造 XCM:

1)WithdrawAsset
    •    提取 DOT 资产

2)BuyExecution
支付执行费用:
    •    fees:
    •    id:用于支付费用的资产 Location(示例中使用中继链原生资产)
    •    fun:选择 Fungible,数量与 WithdrawAsset 相同
    •    weightLimit:设为 Unlimited

3)Transact
执行解锁调用:
    •    originKind:使用 Native
    •    requireWeightAtMost:使用前面计算的 weight
    •    call:使用之前复制的 encoded call data

4)RefundSurplus
退回多余费用

5)DepositAsset
将剩余资金转回 sovereign account

特殊说明

如果 WithdrawAsset 中提取的金额正好等于执行费用,则可以省略步骤 4 和 5。

提交交易

确认参数无误后,点击 Submit Transaction 提交。

验证解锁是否成功(Verification)

交易完成并最终确认后,需要重新检查平行链状态。

验证方式

重复第二节中的查询流程:
    •    Developer → Chain State
    •    registrar → paras
    •    输入 parachain ID

如果 locked 字段为 false,说明解锁成功。

异常处理建议

若仍显示锁定状态:
    •    检查 XCM 是否成功执行
    •    查看相关事件日志
    •    核对 weight 参数是否正确
    •    检查 sovereign account 是否余额不足
    •    确认 XCM 指令顺序与参数格式

必要时重新构造并提交 XCM。

总结与实操要点

解锁平行链的关键流程包括:
    1.    查询锁定状态(registrar.paras)
    2.    构造 registrar.removeLock 调用并获取 encoded data
    3.    计算执行 weight
    4.    为 sovereign account 充值
    5.    构造 XCM:WithdrawAsset → BuyExecution → Transact → RefundSurplus → DepositAsset
    6.    通过 Root 权限提交 XCM
    7.    验证解锁状态

核心注意事项:
    •    解锁必须使用 Root 权限
    •    Weight 估算必须准确
    •    Sovereign Account 余额必须充足
    •    XCM 指令顺序不可错误
    •    生产环境应通过治理系统提交

原文链接:https://docs.polkadot.com/parachains/runtime-maintenance/unlock-parachains/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐