桥接其它链

本教程深入探讨了超越单链开发的更高级主题,包括如何将当前链连接到其它链。

准备一个本地平行链的测试网(准备一个本地中继链)

在本教程中,你将配置一个本地中继链并连接一个平行链模板,以便在本地测试环境中使用。

重点注意匹配版本

你必须使用本教程中规定的确切版本。平行链与它们所连接的中继链代码库紧密耦合,因为它们共享许多共同的依赖项。在使用整个 Substrate 文档中的任一示例时,请确保在任何其他软件中使用 Polkadot 的相应版本。你必须与中继链同步升级,你的平行链才能继续成功运行。如果你没有保持中继链的更新,很可能你的网络将停止生产区块。

文档示例中的版本

文档中的所有教程都经过了测试,可以使用:

构建中继链节点

rococo-local 网络配置中稍加修改的 Polkadot 内置版本将作为本节教程的中继链。

# Clone the Polkadot Repository, with correct version
git clone --depth 1 --branch release-v0.9.26 https://github.com/paritytech/polkadot.git

# Switch into the Polkadot directory
cd polkadot

# Build the relay chain Node
cargo b -r

编译节点可能需要十五分钟到六十分钟才能完成。

# Check if the help page prints to ensure the node is built correctly
./target/release/polkadot --help

如果打印了帮助页面,则说明你已经成功构建了 Polkadot 节点。

中继链specification

你需要一个中继链网络的 chain specification。当我们想要使用本地测试网时,可能需要一个自定义配置来为验证者、引导节点地址等设置开发或自定义键。

**一个中继链上运行的验证者(validator)节点必须比连接的平行链核对者(collator)的总数多一个。**为了测试,这些通常必须硬编码到你的 chain spec 中。例如,如果你想用一个 collator 连接两个平行链,请运行三个或更多的中继链验证者节点,并确保它们都在 chain spec 中指定。

无论你选择使用哪个 chain spec 文件,在下面的说明中,我们都将该文件简单地称为 chain-spec.json。你将需要为你正在使用的 chain spec 提供正确的路径。

预先配置的chain spec文件

本节教程包括一个示例 chain specification 文件,其中两个验证者中继链节点 Alice 和 Bob 作为授权。你无需任何修改就可以对本地测试网络和单个平行链使用此示例 chain specification。这对于注册单个平行链非常有用:

你可以读取和编辑普通 chain specification 文件。然而 chain specification 文件必须被融合为 SCALE-encoded 编码的原始格式,然后才能用于启动节点。有关将 chain specification 转换为使用原始格式的信息,请参见Customize a chain specification指南。

示例 chain specification 仅对具有两个验证者节点的单个平行链有效。如果你添加其他验证者,向中继链添加额外的平行链,或者希望使用自定义的 non-development keys,你将需要创建一个适合你需求的自定义 chain specification。

启动你的中继链

在开始对一个平行链进行区块生产之前,你需要启动一个中继链来连接它们。本节描述如何使用 two-validator raw chain spec 启动两个节点,启动其他节点的步骤与此类似。

启动alice验证者

# Start Relay `Alice` node
./target/release/polkadot \
--alice \
--validator \
--base-path /tmp/relay/alice \
--chain <path to spec json> \
--port 30333 \
--ws-port 9944

命令中指定的端口(port)和 websocket 端口(ws-port)使用默认值,可以省略。但是,这里包含这些值是为了提醒你可以检查这些值。节点启动后,同一台本地计算机上的其他节点不能使用这些端口。

🏷 Local node identity is: 12D3KooWGjsmVmZCM1jPtVNp6hRbbkGBK3LADYNniJAKJ19NUYiq

当节点启动时,你将看到一些日志消息,包括节点的 Peer ID。要注意这一点,因为在将其他节点连接到它时将需要它。

启动bob验证者

启动第二个节点的命令类似于启动第一个节点的命令,但有一些重要的区别。

./target/release/polkadot \
--bob \
--validator \
--base-path /tmp/relay-bob \
--chain <path to spec json> \
--bootnodes /ip4/<Alice IP>/tcp/30333/p2p/<Alice Peer ID> \
--port 30334 \
--ws-port 9945

注意,该命令使用不同的基本路径(/tmp/relay-bob)、验证器密钥(--bob)和端口(303349945)。

启动第二个节点的命令还包括 --bootnodes 命令行选项,用于指定第一个节点的 IP 地址和 peer 标识符。如果你在单个本地计算机上运行整个网络,那么 bootnodes 选项不是必须一定要的,但是当使用到非本地网络的连接而在 chain spec 中没有任何指定的 bootnodes 时,该选项是必要的,正如我们正在使用的 rococo-custom-2-plain.json 示例一样。

在本节教程中,你的最终 chain spec 文件名必须以 rococo 开头,否则节点将不知道要怎样包含运行时逻辑。

其它资源

手动构建和配置中继链是一个很好的练习。然而,在你完成了几次之后,你可能希望自动化该过程。有很多方法可以做到这一点,这里有一些方法可供参考:

  • parachain-launch 是一个生成 docker compose 文件的脚本,允许你启动多个区块链节点的测试网络。
  • zombienet 是一个 CLI 工具,使你能够生成短暂的 Polkadot/Substrate 网络并对其执行测试。

连接本地平行链

本节教程演示了如何使用本地中继链预留平行链标识符,以及如何将本地平行链连接到该中继链。

构建平行链模板

本节教程使用 Substrate parachain template 来演示如何启动一个平行链去连接一个本地中继链。平行链模板类似于单链开发中使用的 node template。你可以使用平行链模板作为开发自定义平行链项目的起点。

要构建平行链模板,下载用来配置中继链 release 分支相匹配的 substrate-parachain-template 存储库的分支。例如,如果你使用 release-v0.9.28 Polkadot release 分支来配置本地中继链,那么对应平行链模板的分支则使用 polkadot-v0.9.28

git clone --depth 1 --branch polkadot-v0.9.28 https://github.com/substrate-developer-hub/substrate-parachain-template.git

cd substrate-parachain-template

#你现在有一个分离的分支。如果要保存更改并使分支易于识别,可以通过运行类似于以下的命令创建新分支:
git switch -c my-branch-v0.9.28

cargo build --release

编译节点最多需要60分钟,具体取决于硬件和软件配置。

预留唯一标识符

每个平行链必须预留一个唯一的标识符 ParaID,使其能够连接到指定的中继链上。每个中继链为连接到它的平行链管理它的唯一标识符集合。该标识符被称为 ParaID,因为同一标识符可用于标识 parachain 占用的插槽或标识 parathread 占用的插槽。

你应该注意到,你必须有一个账户有足够的资金,以便在中继链上预留一个插槽。你可以通过检查该中继链的 paras_registrar pallet 中的 ParaDeposit 配置来确定指定中继链需要的 tokens 数量。例如,Rococo 需要 5 ROC 预留一个标识符:

parameter_types! {
	pub const ParaDeposit: Balance = 5 * DOLLARS;
	pub const DataDepositPerByte: Balance = deposit(0, 1);
}

impl paras_registrar::Config for Runtime {
	type Event = Event;
	type Origin = Origin;
	type Currency = Balances;
	type OnSwap = (Crowdloan, Slots);
	type ParaDeposit = ParaDeposit;
	type DataDepositPerByte = DataDepositPerByte;
	type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo<Runtime>;
}

每个中继链分配自己的标识符从 2000 开始递增,为所有的非 common good parachains。common good parachains 使用不同的方法来分配插槽标识符。

要预留平行链标识符,验证本地中继链的验证器是否正常运行,在浏览器中打开 Polkadot/Substrate Portal,连接一个本地中继链节点,点击 Network 并选择 Parachains

点击 Parathreads,再点击 ParaId

查看交易的设置以预留标识符,然后点击 Submit。用于预留该标识符的帐户将是该交易的收费帐户,并且也是与该标识符关联的 parathread 的 origin 帐户。

点击 Sign and Submit 对交易进行授权。提交交易之后,点击 Network 并选择 Explorer

检查最近成功的 registrar.Reserved 事件列表,点击事件以查看有关交易的详细信息。

现在可以准备 chain specification 并生成平行链使用预留标识符(paraId 2000)连接到中继链所需的文件。

修改默认的chain specification

要在本地中继链中注册平行链,必须修改默认的 chain specification 以使用预留的平行链标识符。

通过运行以下命令为平行链模板节点生成纯文本 chain specification:

./target/release/parachain-template-node build-spec --disable-default-bootnode > plain-parachain-chainspec.json

打开纯文本 chain specification 文件,将 para_id 设置为之前预留的平行链标识符。例如,如果你预留的标识符是 2000,那么就设置 para_id 的字段为 2000

...
"relay_chain": "rococo-local",
"para_id": 2000,
"codeSubstitutes": {},
"genesis": {
  ...
}

parachainId 设置为先前保留的平行链标识符。例如,如果你预留的标识符为 2000,则将 parachainId 字段设置为 2000

...
  "parachainSystem": null,
  "parachainInfo": {
    "parachainId": 2000
  },
...

保存代码并关闭纯文本 chain specification 文件。

通过运行以下命令,从修改的 chain specification 文件生成原始 chain specification 文件:

./target/release/parachain-template-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json

该命令生成一个新的原始 chain specification 文件,其中包含两个 collator。

2022-08-30 13:00:50 Building chain spec    
2022-08-30 13:00:50 assembling new collators for new session 0 at #0    
2022-08-30 13:00:50 assembling new collators for new session 1 at #0

准备平行链的collator

随着本地中继链的运行和对平行链链模板的原始 chain specification 的更新,你就可以启动平行链 collator 节点并导出其运行时和初始状态的信息。

准备要注册的平行链 collator,导出平行链的 WebAssembly 运行时。中继链需要 parachain-specific 的运行时验证逻辑来验证平行链区块,通过运行类似于以下的命令,你可以导出 parachain collator 节点的 WebAssembly 运行时:

./target/release/parachain-template-node export-genesis-wasm --chain raw-parachain-chainspec.json para-2000-wasm

生成一个平行链的初始状态。为了注册一个平行链,中继链需要知道平行链的初始状态;通过运行类似于以下的命令,可以将整个初始状态(十六进制编码)导出到一个文件中:

./target/release/parachain-template-node export-genesis-state --chain raw-parachain-chainspec.json para-2000-genesis-state

你应该注意到了导出的运行时和状态必须是针对 genesis 块的,你不能将前一个状态的平行链连接到中继器上。所有平行链必须从中继链上的块 0 开始。有关如何创建平行链模板以及如何将这个链逻辑(而不是它的历史状态迁移)转换为平行链的详细信息,请参见 Convert a solo chain

使用类似于以下的命令启动 collator 节点:

./target/release/parachain-template-node \
--alice \
--collator \
--force-authoring \
--chain raw-parachain-chainspec.json \
--base-path /tmp/parachain/alice \
--port 40333 \
--ws-port 8844 \
-- \
--execution wasm \
--chain ../polkadot/raw-local-chainspec.json \
--port 30343 \
--ws-port 9977

在这个命令中,在惟一的 -- 参数之前传递的参数是用于平行链模板 collator 的。-- 后面的参数用于嵌入式中继链节点。注意,这个命令同时指定了平行链的原始 chain specification 和中继链的原始 chain specification。在本例中,本地中继链的原始 chain specification 为 polkadot 目录中的 raw-local-chainspec.json。确保第二个 --chain 命令行为本地中继链指定了原始 chain specification 的路径。

如果你为平行链启动另一个节点,你将使用相同的中继链 chain specification 文件,但是使用不同的基本路径和端口号。

在启动平行链模板节点的终端中,你应该能看到类似以下输出:

2022-08-30 13:49:17 Parachain Collator Template    
2022-08-30 13:49:17 ✌️  version 0.1.0-fd9771eed9c    
2022-08-30 13:49:17 ❤️  by Anonymous, 2020-2022    
2022-08-30 13:49:17 📋 Chain specification: Local Parachain Testnet    
2022-08-30 13:49:17 🏷  Node name: Alice    
2022-08-30 13:49:17 👤 Role: AUTHORITY    
2022-08-30 13:49:17 💾 Database: RocksDb at /tmp/parachain/alice/chains/local_testnet/db/full    
2022-08-30 13:49:17 ⛓  Native runtime: template-parachain-1 (template-parachain-0.tx1.au1)
2022-08-30 13:51:58 Parachain id: Id(2000)    
2022-08-30 13:51:58 Parachain Account: 5Ec4AhPUwPeyTFyuhGuBbD224mY85LKLMSqSSo33JYWCazU4    
2022-08-30 13:51:58 Parachain genesis state: 0x0000000000000000000000000000000000000000000000000000000000000000003c28ac319eab2cac949139fd0376f16bc97f698d1cde1bc3f46c2ec0edd1b9fb03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c11131400    
2022-08-30 13:51:58 Is collating: yes    
2022-08-30 13:52:00 [Relaychain] 🏷  Local node identity is: 12D3KooWNNP9Z1D86KKgrzht6Pvd3WjKqxQaNkC6HpW5wVTUEEKR
...

你应该看到模板 collator 节点作为独立节点运行,它的中继节点作为对等节点与本地中继链验证器节点连接。如果你没有看到嵌入式中继链与本地中继链节点对接,请尝试禁用防火墙或添加带有中继节点地址的 bootnodes 参数。

它还没有开始创建平行链区块,创建块将在 collator 实际注册到中继链上时才开始。

向本地中继链注册

当本地中继链和 collator 节点都正常运行时,你就可以在本地中继链上注册平行链了。在实时公共网络中,注册通常涉及平行链插槽拍卖。在本节教程和本地测试中,你可以使用 Sudo 交易和 Polkadot/Substrate Portal。使用 Sudo 交易可以绕过获取平行链或平行线程插槽所需的步骤。

要注册平行链,验证本地中继链验证器是否正常运行,在浏览器中打开 Polkadot/Substrate Portal,如果需要连接到本地中继链节点,点击 Developer 并选择 Sudo

选择 paraSudoWrapper,然后选择 sudoScheduleParaInitialize(id, genesis) 来在下一个中继链会话开始时初始化预留的 paraID。

对于交易参数:

  • id:输入你预留的 ParaId。对于本节教程,保留标识符是 2000。
  • genesisHead:点击 file upload,上传你为 parachain 导出的初始状态。对于本节教程,选择 para-2000-genesis 文件。
  • validationCode:点击 file upload 并上传你为平行链导出的 WebAssembly 运行时。对于本节教程,选择 para-2000-wasm 文件。
  • parachain:选择 Yes

点击 Submit Sudo

查看交易详细信息,然后点击 Sign and Submit 对交易进行授权。提交交易之后,点击 Network 并选择 Explorer

检查最近的事件列表是否有成功的 sudo.Suid 和点击事件查看交易的详细信息。

初始化平行链后,通过点击 Network 然后选择 Parachains,你可以在 Polkadot/Substrate Portal 中看到它。

点击 Network,选择 Parachains,等待新的 epic 开始。中继链跟踪每个平行链最近区块的块头。当一个中继链区块完成时,已经完成验证过程的平行链区块也完成了。这就是 Polkadot 为平行链实现 pooled, shared security 的方式。在平行链连接到下一个 epoch 的中继链并完成其第一个区块之后,你可以在 Polkadot/Substrate Portal 中看到有关它的信息。

运行平行链的终端会显示类似如下的详细信息:

2022-09-01 12:58:12 [Parachain] Starting collation. relay_parent=0x1ba093a16f8276459629b29b2bcee2b40e360a72a15a714cb208a5f6be576262 at=0x99951a12bbb25bad6e8878b517601a0fb65741189903d503789e12cd6d81810b
2022-09-01 12:58:16 [Relaychain] 💤 Idle (2 peers), best: #117 (0x1ba0…6262), finalized #113 (0x0798…07c2), ⬇ 0.6kiB/s ⬆ 0.4kiB/s    
2022-09-01 12:58:16 [Parachain] 💤 Idle (0 peers), best: #2 (0x9995…810b), finalized #1 (0x50e8…5acb), ⬇ 0 ⬆ 0    
...
2022-09-01 12:58:24 [Parachain] 🙌 Starting consensus session on top of parent 0x99951a12bbb25bad6e8878b517601a0fb65741189903d503789e12cd6d81810b    
2022-09-01 12:58:24 [Parachain] 🎁 Prepared block for proposing at 3 (0 ms) [hash: 0x614a7f68290d68ec8b441886dbc6bda95593028c856cf32a46a64ca85af5b51f; parent_hash: 0x9995…810b; extrinsics (2): [0xe698…6c13, 0x5225…a083]]    
2022-09-01 12:58:24 [Parachain] 🔖 Pre-sealed block for proposal at 3. Hash now 0x7ea49c65781d6c9a04bd8ae4f89b0c7bd84c7b3302233024ffa54909dc977a32, previously 0x614a7f68290d68ec8b441886dbc6bda95593028c856cf32a46a64ca85af5b51f.    
2022-09-01 12:58:24 [Parachain] ✨ Imported #3 (0x7ea4…7a32)    
2022-09-01 12:58:24 [Parachain] PoV size { header: 0.1787109375kb, extrinsics: 2.7470703125kb, storage_proof: 2.6123046875kb }
2022-09-01 12:58:24 [Parachain] Compressed PoV size: 4.802734375kb
2022-09-01 12:58:24 [Parachain] Produced proof-of-validity candidate. block_hash=0x7ea49c65781d6c9a04bd8ae4f89b0c7bd84c7b3302233024ffa54909dc977a32
2022-09-01 12:58:26 [Relaychain] 💤 Idle (2 peers), best: #119 (0x20a1…5579), finalized #116 (0x0c12…2ba3), ⬇ 0.7kiB/s ⬆ 1.4kiB/s    
2022-09-01 12:58:26 [Parachain] 💤 Idle (0 peers), best: #2 (0x9995…810b), finalized #1 (0x50e8…5acb), ⬇ 0 ⬆ 0    
...
2022-09-01 12:58:36 [Relaychain] 👶 New epoch 12 launching at block 0xa2a3…253c (block slot 277010386 >= start slot 277010386).    
2022-09-01 12:58:36 [Relaychain] 👶 Next epoch starts at slot 277010396    
2022-09-01 12:58:36 [Relaychain] ✨ Imported #121 (0xa2a3…253c)    
2022-09-01 12:58:36 [Relaychain] Advanced session window for approvals update=Advanced { prev_window_start: 6, prev_window_end: 11, new_window_start: 7, new_window_end: 12 }
2022-09-01 12:58:36 [Parachain] Starting collation. relay_parent=0xa2a3fabb974f673d49cc6b50605e6d90595234ce16fd7bd01bce808bbdf0253c at=0x7ea49c65781d6c9a04bd8ae4f89b0c7bd84c7b3302233024ffa54909dc977a32
2022-09-01 12:58:36 [Relaychain] 💤 Idle (2 peers), best: #121 (0xa2a3…253c), finalized #117 (0x1ba0…6262), ⬇ 1.0kiB/s ⬆ 0.6kiB/s    
2022-09-01 12:58:36 [Parachain] 💤 Idle (0 peers), best: #3 (0x7ea4…7a32), finalized #2 (0x9995…810b), ⬇ 0 ⬆ 0    
...

连接并提交交易

到目前为止,你已经使用 Polkadot/Substrate Portal 连接到本地网络,并将交易提交到本地中继链。现在已经有了一个运行的平行链并连接到中继链,你可以使用 Polkadot/Substrate Portal 向平行链提交交易。

要连接到平行链并提交交易,在浏览器中打开 Polkadot/Substrate Portal,点击应用程序左上角的网络选择器。

将自定义端点更改为连接到平行链的 WebSocket 端口。如果你按照本节教程中的设置,则连接到 8844 端口。

点击 Account,选择 Transfer,将资金从Alice账户转到另一个账户:

  • 选择要将资金发送到的帐户。
  • 打印金额。
  • 点击 Make Transfer
  • 查看交易记录,然后点击 Sign and Submit 以授权转账。

点击 Accounts 以验证转账已完成且平行链交易成功。如果交易成功,你就有了一个正常工作的平行链。

重置区块链状态

本节教程中连接到中继链的平行链 collator 包含平行链的所有区块链数据。在这个平行链网络中只有一个节点,所以你提交的任何交易都只存储在这个节点上。中继链不存储任何平行链状态。中继链只存储与之相连的平行链的区块头信息。

出于测试目的,你可能希望定期清除区块链状态以重新开始。但是应该记住,如果清除链状态或手动删除数据库,你将无法恢复数据或恢复链状态。如果你有想要保存的数据,那么在清除平行链状态之前应该确保有一个副本。

如果你想重新使用一个干净的环境进行测试,你应该完全删除本地中继链节点和平行链节点的链状态。

要重置区块状态,在运行平行链模板节点的终端中,按 Control-c,通过运行以下命令清除平行链 collator 状态:

rm -rf /tmp/parachain

alice 验证者节点或 bob 验证者节点正在运行的终端中,按 Control-c,通过运行以下命令清除验证程序状态:

rm -rf /tm/relay

连接Rococo测试网(获取测试网插槽)

本节教程演示如何在公共测试网络(例如 Rococo 测试网络)上部署一个平行链。公共测试网络比私有网络有更高的使用门槛,但也表示准备将一个平行链项目转移到生产网络的重要一步。

从帐户和代币开始

要对 Rococo 执行任何操作,你需要 ROC 代币并存储代币,你必须能够访问与 Substrate-compatible 的数字货币钱包。你不能在任何公共设置中使用开发密钥和帐户进行操作。想要持有数字货币有很多选择,包括硬件钱包和基于浏览器的应用程序,其中一些比其他更有信誉。在选择一个之前,你应该自己做好调查。

但是,你可以使用 Polkadot/Substrate Portal 网站开始测试。

要准备一个账户,将Polkadot/Substrate Portal连接到 Rococo 网络,点击并选择 Accounts,点击 Add Account,复制你的 secret seed phrase,并把它放在一个安全的地方,然后点击 Next,输出一个账户的名称和密码,然后点击 Next,点击 Save,加入 Rococo Element channel,并使用 !drip 发送消息,为你的 Rococo 在钱包中获得 100 ROC 的公共地址。例如,发送类似以下内容的消息:

!drip 5CVYesFxbDBU5rkZXYTAA6BnADbCoSpQkvexBQZvbtvyGTP1

预留平行链标识符

你必须预留一个平行链标识符,然后才能注册为 Rococo 上的平行链。步骤与连接本地平行链以保留本地中继链上的标识符中的步骤类似。但是,对于公共测试网,你将会被分配到下一个真实可用的标识符。

要预留一个标识符,将Polkadot/Substrate Portal连接到 Rococo 网络,点击 Network 并选择 Parachains

点击 Parathreads,然后点击 ParaId,检查交易并注意分配给你的平行链标识符,然后点击 Submit。输入您的密码以验证你的身份,然后点击 Sign and Submit

点击 Network 并选择 Explorer ,检查成功的 registrar.Reserved 的最近事件列表。

修改chain specification文件

注册平行链所需的文件必须指定要连接的正确的中继链和已分配给你的平行链标识符。要进行这些修改,必须为平行链构建和修改 chain specification 文件。在本节教程中,中继链是 rococo,而不是在连接本地平行链教程中使用的 rococo-local,平行链标识符是 4105

要修改 chain specification,通过运行以下命令生成平行链模板节点的纯文本chain specification:

./target/release/parachain-template-node build-spec --disable-default-bootnode > plain-parachain-chainspec.json

打开平行链模板节点的纯文本chain specification文件,将 relay-chain 设置为 rococo, para_id 设置为已分配的标识符。例如,如果你预留的标识符是 4105,则将 para_id 字段设置为 4105

...
"relay_chain": "rococo",
"para_id": 4105,
"codeSubstitutes": {},
"genesis": {
  ...
}

parachainId 设置为你之前预留的平行链标识符。

...
  "parachainSystem": null,
  "parachainInfo": {
    "parachainId": 4105
  },
...

将你的帐户公钥添加到会话密钥部分。

...
  "session": {
    "keys": [
     [
       "5CVYesFxbDBU5rkZXYTAA6BnADbCoSpQkvexBQZvbtvyGTP1",
       "5CVYesFxbDBU5rkZXYTAA6BnADbCoSpQkvexBQZvbtvyGTP1",
       {
        "aura": "5CVYesFxbDBU5rkZXYTAA6BnADbCoSpQkvexBQZvbtvyGTP1"
       }
     ],
    ]
  }
...

保存代码并关闭纯文本 chain specification 文件。

通过运行以下命令,从修改后的 chain specification 文件生成原始 chain specification 文件:

./target/release/parachain-template-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json

导出必要的文件

准备要注册的平行链 collator,通过运行类似如下的命令导出平行链的 WebAssembly 运行时:

./target/release/parachain-template-node export-genesis-wasm --chain raw-parachain-chainspec.json para-4105-wasm

通过运行类似如下的命令生成一个平行链初始状态:

./target/release/parachain-template-node export-genesis-state --chain raw-parachain-chainspec.json para-4105-genesis-state

启动collator节点

你必须具有 collator 公开可访问并且可发现的端口,以便使平行链节点与 Rococo 验证器节点进行 peer 连接,从而生成块。你可以使用 --port 命令行选项指定要使用的端口。例如,可以使用类似于以下的命令启动 collator:

  --chain raw-parachain-chainspec.json \
  --base-path /tmp/parachain/pubs-demo \
  --port 50333 \
  --ws-port 8855 \
  -- \
  --execution wasm \
  --chain rococo \
  --port 50343 \
  --ws-port 9988

在此示例中,第一个 --port 为 collator 节点设置指定的端口,第二个 --port 指定嵌入式中继链节点的端口。第一个 --ws-port 设置指定可以使用 Polkadot-JS API 调用或 Polkadot/Substrate Portal 应用程序连接到 collator 的端口。第二个 --ws-port 指定使用 Polkadot-JS API 调用或 Polkadot/Substrate Portal 应用程序连接到嵌入式中继链的端口。

注册为一个平行线程

你在公共中继链上租赁一个插槽,成为一个平行链之前,首先必须注册为 Rococo 上的平行线程。

要注册为一个平行线程,将Polkadot/Substrate Portal连接到 Rococo 网络。点击 Network 并选择 Parachains。点击 Parathread,然后点击 ParaThread

验证平行链的所有者和平行链的标识符,并上传包含 WebAssembly 验证函数和平行链初始状态的文件,然后点击 Submit。输入密码验证你的身份,然后点击 Sign and Submit。向下滚动平行线程列表,并验证你的平行线程注册是否为 Onboarding

你也可以通过在 Network Explorer 中 registrar.Registered 的事件来验证你的注册请求。提交注册请求后,需要两个会话才能完成平行线程的加载。

请求一个平行链插槽

在平行链作为一个平行线程被激活后,相关的项目团队应该在 Rococo 上打开一个永久临时平行链插槽请求

  • 永久插槽通常分配给成功完成插槽租赁拍卖并在 Polkadot 上部署有插槽的平行链的团队。永久插槽使这些团队能够在实时公共环境中持续测试他们的代码库与最新 Polkadot 特性的兼容性。目前只有有限数量的永久插槽可用。
  • 临时插槽是以连续轮循的方式动态分配的平行链插槽。从每个租期开始时,在一定的租期内如果不超过中继链配置中定义的最大平行线程数,将自动升级为平行链。在租期结束时活跃的平行链将自动降级为平行线程,以释放槽位供其他人在随后的租期使用。具有动态分配的临时插槽使在 Polkadot 上没有平行链插槽的团队能够在现实的网络环境中更频繁地测试他们的运行时。

提交一个插槽请求

Rococo 运行时需要 sudo 访问来分配插槽。例如,Rococo 运行时指定用于分配插槽的帐户必须具有 root 级别权限:

AssignSlotOrigin = EnsureRoot<Self::AccountId>;

最终,插槽分配将通过 Rococo 治理方式由社区驱动。然而,Rococo sudo 的密钥目前是由 Parity 公司控制。因此,你必须提交 Rococo Slot Request 接收插槽分配。分配插槽后,你将收到通知,并准备连接。

使用管理帐户分配一个插槽

如果你有一个具有 AssignSlotOrigin origin 帐户,你可以使用该帐户在 Rococo 网络上分配一个临时插槽。

要分配一个临时插槽,将Polkadot/Substrate Portal连接到 Rococo 网络。点击 Developer 并选择 Extrinsics。选择要用于提交交易的帐户。选择 assignedSlots pallet。选择 assignTempParachainSlot 函数。输入分配给你的预留平行链标识符。为 LeasePeriodStart 选择 Current,如果当前的插槽已满,你将被分配到下一个可用的插槽。点击 Submit Transaction。输入密码以验证你的身份,然后点击 Sign and Submit。如果你的帐户没有足够的权限,则交易将失败,并出现 BadOrigin 错误。

租赁期限

为在 Rococo 上分配的平行链插槽,当前租赁期限和插槽可用配置是:

  • 永久插槽至少持续时间:1年(365天)
  • 临时插槽至少持续时间:3天
  • 永久插槽的最大数量:最多25个永久插槽
  • 临时插槽的最大数量:最多20个临时插槽
  • 每个租赁期分配的最大临时插槽:每3天临时租赁期最多5个临时插槽

这些配置可能会根据社区的需求进行改变。

测试你的平行链

在一个插槽被分配并被激活后,你可以在 Rococo 测试网络上测试你的平行链。注意当临时插槽租期结束时,平行链会自动降级为平行线程。已注册和已批准的插槽以轮询的方式自动循环,因此你可以继续不断地以平行链的形式重新连接。