substrate学习笔记13:连接parachain
1 说明
上一节,我们启动了relaychain的节点,本节将连接parachain到relaychain节点。
主要包括以下内容:
- 启动parachain;
- parachain注册;
- 和parachain交互;
- 连接到添加的parachain节点。
2 launch一个parachain
这里注意,需要先把relay chain的两个节点先起起来,具体的看上一节,启动relay chain。
2.1 保留para ID
要连接到任何relaychain,都必须为平行链保留一个para ID。relay chain负责分配para ID。在本练习中,我们将保留一个para ID病通过polkadot-js app连接到本地relay chain。
我们打开polkato-js apps(地址:https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/parachains/parathreads),然后选择parathreads,点击加号,添加para ID,点击提交(此处我们使用默认的2000)。
2.2 配置para chain
2.2.1 定制parachain的chain spec
打开para chain node的目录(即substrate-parachain-template目录下),执行如下命令:
./target/release/parachain-collator build-spec --disable-default-bootnode > rococo-local-parachain-plain.json
生成chain spec,然后修改其中的”para_id”和”parachainId”为2000.然后再执行如下命令,生成新的raw格式的chainspec:
./target/release/parachain-collator build-spec --chain rococo-local-parachain-plain.json --raw --disable-default-bootnode > rococo-local-parachain-2000-raw.json
2.2.2 获取wasm运行时验证函数
relayer chain需要特定于parachain的运行时验证逻辑来验证parachain的区块。parachain的collator节点有一个命令来生成这个wasm blob,如下:
./target/release/parachain-collator export-genesis-wasm --chain rococo-local-parachain-2000-raw.json > para-2000-wasm
2.2.3 生成parachain的genesis状态
为了注册parachain,relayer chain需要知道parachain的genesis状态。collator节点能够导出state到文件中,命令如下:
./target/release/parachain-collator export-genesis-state --chain rococo-local-parachain-2000-raw.json > para-2000-genesis
2.3 启动一个collator节点
启动的命令如下:
./target/release/parachain-collator \
--alice \
--collator \
--force-authoring \
--chain rococo-local-parachain-2000-raw.json \
--base-path /tmp/parachain/alice \
--port 40333 \
--ws-port 8844 \
-- \
--execution wasm \
--chain <relay chain raw chain spec> \ #此处注意,是relay chain目录下的raw chain spec
--port 30343 \
--ws-port 9977
启动成功后,可以看到如如下的打印:
...
2022-02-27 15:35:00 [Relaychain] 💤 Idle (2 peers), best: #113 (0x88d5…51b4), finalized #111 (0x3a69…1e18), ⬇ 24.5kiB/s ⬆ 3.4kiB/s
2022-02-27 15:35:00 [Parachain] 💤 Idle (0 peers), best: #0 (0x5ca9…e641), finalized #0 (0x5ca9…e641), ⬇ 2.0kiB/s ⬆ 1.7kiB/s
2022-02-27 15:35:05 [Relaychain] 💤 Idle (2 peers), best: #113 (0x88d5…51b4), finalized #111 (0x3a69…1e18), ⬇ 1.1kiB/s ⬆ 0.7kiB/s
2022-02-27 15:35:05 [Parachain] 💤 Idle (0 peers), best: #0 (0x5ca9…e641), finalized #0 (0x5ca9…e641), ⬇ 0.2kiB/s ⬆ 0.2kiB/s
2022-02-27 15:35:10 [Relaychain] 💤 Idle (2 peers), best: #113 (0x88d5…51b4), finalized #111 (0x3a69…1e18), ⬇ 0.9kiB/s ⬆ 0.6kiB/s
2022-02-27 15:35:10 [Parachain] 💤 Idle (0 peers), best: #0 (0x5ca9…e641), finalized #0 (0x5ca9…e641), ⬇ 0 ⬆ 0
2022-02-27 15:35:15 [Relaychain] 💤 Idle (2 peers), best: #113 (0x88d5…51b4), finalized #111 (0x3a69…1e18), ⬇ 0.7kiB/s ⬆ 0.7kiB/s
2022-02-27 15:35:15 [Parachain] 💤 Idle (0 peers), best: #0 (0x5ca9…e641), finalized #0 (0x5ca9…e641), ⬇ 0.2kiB/s ⬆ 0.2kiB/s
...
但是可以看到,parachain此时还没有产生区块。
3 parachain注册
3.1 使用sudo注册
我们现在注册parachain到relay chain上。在生产网络中,通常是通过拍卖进行的,在本教程中,我们使用sudo来进行。
3.2 注册交易
我们通过两种方式来注册交易。
3.2.1 paraSudoWrapper.sudoScheduleParaInitalize
该选项完全绕过插槽租用机制,为下一个中继链会话启动的保留paraID装载parachain或parathread。这是进行测试最简单、最快的方法。但需要注意的是,在下一个时段,parachain也将自动关闭,没有租约的parachain将降级为parathreads,因此下一个插槽结束时段,请确保根据需要重新注册。步骤如下:
- polkadot js apps,连接到relay chain;
- 选择Developer->sudo;
- 选择paraSudoWrapper -> sudoScheduleParaInitialize(id, genesis);
- 在交易中:
1、将```id:ParaId```设置为2000; 2、```genesisHead```:上传文件para-2000-genesis; 3、```validationCode```:上传文件para-2000-wasm 4、设置```parachain:Bool```为yes。
3.2.2 slots.forceLease
步骤如下:
- 打开polkadot-js-app,连接到relay chain;
- 选择Developer->sudo;
- 选择slots->forceLease(para, leaser, amount, period_begin, period_end)
3.3 区块生成
上面的步骤完成后,parachain将产生区块,但是值得注意的是,需要等到relay chain下一个epoch开始的时候才会产生。
4 和parachain交互
在浏览器打开此地址连接ui:polkadot.js.org/apps/?rpc=ws%3A%2F...
然后可以和parachain进行交互。
5 chain purging
要清除所有的数据,可以用如下命令:
# Purge the collator(s)
./target/release/parachain-collator purge-chain\
--base-path <your collator DB path set above>
# Purge the validator(s)
polkadot purge-chain\
--base-path <your relay chain DB path set above>
6 添加其它的parachain节点
添加collator节点,命令如下:
./target/release/parachain-collator \
--bob \
--collator \
--force-authoring \
--chain rococo-local-parachain-2000-raw.json \
--base-path /tmp/parachain/bob \
--bootnodes <a running collator node> \
--port 40334 \
--ws-port 9946 \
-- \
--execution wasm \
--chain <relay-chain chain spec> \
--port 30344 \
--ws-port 9978
--bootnodes <other relay chain node>
7 参考文档
docs.substrate.io/tutorials/v3/cum...
8 源码
github.com/anonymousGiga/substrate...
本作品采用《CC 协议》,转载必须注明作者和本文链接
令狐大佬你好,在注册parachain到relaychain的时候,gensis.json 以及runtime.wasm 都通过polkadot.js 上传了,但是在提交消息的时候显示。 也去尝试使用 sudo -> SudoUncheckWeight 的方式调用 该方法,依旧是这样的问题,请问有什么方法可以解决这个问题吗?