From 2524668e92d9f9a89fd666f2081fed0f6f2ef2ad Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Mon, 9 Dec 2024 20:50:30 -0500 Subject: [PATCH 01/10] updates so far --- tutorials/polkadot-sdk/parachains/.pages | 3 +- .../parachains/connect-to-relay-chain/.pages | 7 ++- .../prepare-relay-chain.md | 2 +- .../parachains/deploy-to-relay-chain/.pages | 5 ++ .../deploy-on-paseo.md} | 49 +++++++++++++------ .../parachains/deploy-to-relay-chain/index.md | 24 +++++++++ .../deploy-to-relay-chain/obtain-coretime.md | 4 ++ 7 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages rename tutorials/polkadot-sdk/parachains/{connect-to-relay-chain/acquire-a-testnet-slot.md => deploy-to-relay-chain/deploy-on-paseo.md} (73%) create mode 100644 tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md create mode 100644 tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md diff --git a/tutorials/polkadot-sdk/parachains/.pages b/tutorials/polkadot-sdk/parachains/.pages index d89baef69..138c119fb 100644 --- a/tutorials/polkadot-sdk/parachains/.pages +++ b/tutorials/polkadot-sdk/parachains/.pages @@ -2,4 +2,5 @@ title: Parachains nav: - index.md - local-chain - - connect-to-relay-chain \ No newline at end of file + - connect-to-relay-chain + - deploy-to-relay-chain \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages index a2d468201..80c6bbd03 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages @@ -1,6 +1,5 @@ -title: Connect to a Relay Chain +title: Connect to a Local Relay Chain nav: - index.md - - 'Prepare Relay Chain': prepare-relay-chain.md - - 'Prepare Parachain': prepare-parachain.md - - 'Acquire a TestNet Slot': acquire-a-testnet-slot.md + - 'Prepare A Local Relay Chain': prepare-relay-chain.md + - 'Prepare Local Parachain': prepare-parachain.md \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md index f4aaaa4cf..6b3c32ffa 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md @@ -165,4 +165,4 @@ To start the validator nodes, follow these steps: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/prepare-relay-chain-2.html' -Once the relay chain nodes are running, you can proceed to the next tutorial to [set up a test parachain node and connect it](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain) to the relay chain. +Once the relay chain nodes are running, you can proceed to the next tutorial to [set up a test parachain node and connect it](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain) to the relay chain. \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages new file mode 100644 index 000000000..f3a769c02 --- /dev/null +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages @@ -0,0 +1,5 @@ +title: Deploy to a Relay Chain +nav: + - index.md + - 'Deploy on Paseo': deploy-on-paseo.md + - 'Obtaining Coretime': obtain-coretime.md \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md similarity index 73% rename from tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot.md rename to tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 3e2d229ac..a876b7a42 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -1,9 +1,9 @@ --- -title: Acquire a TestNet Slot -description: This guide walks you through the journey of securing a TestNet slot on Paseo for your parachain, detailing each step to a successful registration. +title: Deploy on Paseo +description: This guide walks you through the journey of deploying your Polkadot SDK blockchain on Paseo, detailing each step to a successful TestNet deployment. --- -# Acquire a TestNet Slot +# Deploy on Paseo ## Introduction @@ -14,18 +14,22 @@ This tutorial demonstrates deploying a parachain on a public test network like t Before you start, you need to have the following prerequisites: - You know how to generate and modify chain specification files as described in the [Generate Chain Specs](/develop/parachains/deployment/generate-chain-specs){target=\_blank} section +- You have installed the `polkadot-omni-node` and `chain-spec-builder` binaries - You know how to generate and store keys as described in the [Spin Your Nodes](/tutorials/polkadot-sdk/parachains/local-chain/spin-your-nodes){target=\_blank} tutorial - You have completed the [Prepare a Local Relay Chain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/){target=\_blank} and the [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/){target=\_blank} tutorials on your local computer ## Get Started with an Account and Tokens -To perform any action on Paseo, you need PAS tokens, which can be requested from the [Polkadot Faucet](https://faucet.polkadot.io/){target=\_blank}. Also, to store the tokens, you must have access to a Substrate-compatible digital currency wallet. Development keys and accounts should never hold assets of actual value and should not be used for production. Many options are available for holding digital currency—including hardware wallets and browser-based applications—and some are more reputable than others. You should do your own research before selecting one. +To perform any action on Paseo, you need PAS tokens, which can be requested from the [Polkadot Faucet](https://faucet.polkadot.io/){target=\_blank}. To store the tokens, you must have access to a Substrate-compatible wallet. Go to the [Wallets and Extensions](https://wiki.polkadot.network/docs/wallets-and-extensions){target=\_blank} page on the Polkadot Wiki to view different options for a wallet, or use the [Polkadot.js browser extension](https://polkadot.js.org/extension/){target=\_blank}, which is suitable for development purposes. -However, you can use the [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface to get you started for testing purposes. +!!!warning + Development keys and accounts should never hold assets of actual value and should not be used for production. + +The [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface can be used to get you started for testing purposes. To prepare an account, follow these steps: -1. Open the [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface and connect to the Paseo network +1. Open the [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface and connect to the Paseo network. Alternatively use this link to connect directly to Paseo: [Polkadot.js Apps: Paseo](https://polkadot.js.org/apps/?rpc=wss://paseo.dotters.network#/explorer){target=\_blank} ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.webp) @@ -45,9 +49,9 @@ To prepare an account, follow these steps: After a few seconds, you will receive 100 PAS tokens in your account. -## Reserve a Parachain Identifier +## Reserve a Parachain Identifier (ID) -You must reserve a parachain identifier before registering a parathread on Paseo. The steps are similar to the ones you followed in [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain){target=_\blank} to reserve an identifier on the local relay chain. However, for the public TestNet, you'll be assigned the next available identifier. +You must reserve a parachain identifier (ID) before registering your parachain on Paseo. The steps are similar to the ones you followed in [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain){target=_\blank} to reserve an identifier on the local relay chain. However, for the public TestNet, you'll be assigned the next available identifier. To reserve a parachain identifier, follow these steps: @@ -73,18 +77,21 @@ To reserve a parachain identifier, follow these steps: ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-8.webp) -## Modify the Chain Specification File +## Generate the Chain Specification The files required to register a parachain must specify the correct relay chain to connect to and the parachain identifier you have been assigned. To make these changes, you must build and modify the chain specification file for your parachain. In this tutorial, the relay chain is `paseo`, and the parachain identifier is `4508`. To modify the chain specification: -1. Generate the plain text chain specification for the parachain template node by running the following command: +1. Generate the plain chain specification for the parachain template node by running the following command. You should find your runtime's Wasm file inside `target/release/wbuild`: ```bash - ./target/release/parachain-template-node build-spec \ - --disable-default-bootnode > plain-parachain-chainspec.json + chain-spec-builder create --relay-chain paseo \ + --para-id 4508 \ + -r ``` +!!!info + Be sure to use the `*.compact.compressed.wasm` version of your file when generating your chain specification. 2. Open the plain text chain specification for the parachain template node in a text editor @@ -133,23 +140,35 @@ To prepare the parachain collator to be registered on Paseo, follow these steps: 1. Export the Wasm runtime for the parachain by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-wasm \ + polkadot-omni-node export-genesis-wasm \ --chain raw-parachain-chainspec.json para-4508-wasm ``` 2. Export the genesis state for the parachain by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-state \ + polkadot-omni-node export-genesis-state \ --chain raw-parachain-chainspec.json para-4508-state ``` +## Register a Parathread + +Once you have the genesis state and runtime, you can now register these with your parachain ID. + +1. Go to the [Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads) tab, and select **+ Parathread** + +2. You should see fields to place your runtime Wasm and genesis state respectively, along with the parachain ID. Select your parachain ID, and upload `para-4508-wasm` in the "code" field and `para-4508-state` in the "initial state" field: + +3. Confirm your details and **+ Submit** button, where there should be a new Parathread with your parachain ID and an active **Deregister** button: + +Your parachain's runtime logic and genesis are now part of the relay chain. The next step is to ensure you have a reliable collator to produce blocks, and to obtain coretime. + ## Start the Collator Node You must have the ports for the collator publicly accessible and discoverable to enable parachain nodes to peer with Paseo validator nodes to produce blocks. You can specify the ports with the `--port` command-line option. For example, you can start the collator with a command similar to the following: ```bash -./target/release/parachain-template-node --collator \ +polkadot-omni-node --collator \ --chain raw-parachain-chainspec.json \ --base-path /tmp/parachain/pubs-demo \ --port 50333 \ diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md new file mode 100644 index 000000000..77317b07b --- /dev/null +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md @@ -0,0 +1,24 @@ +--- +title: Deploy on a Relay Chain +description: Learn how to deploy on a live relay chain including, how to acquire Coretime, manage / setup collators, and what artifacts are needed to deploy your parachain. + - feedback +template: index-page.html +--- + +# Deploy to a Relay Chain + +Deploying to a relay chain generally involves the following steps: + +1. Reserving your Parachain's ID +2. Uploading the genesis state and runtime +3. Ensuring you have collators ready to deploy (or at least one running locally to produce blocks) +4. Obtaining Coretime - Either Bulk (long term block production) or On Demand (ordering blocks as you need) + +Depending on the relay chain you are deploying on, the costs for registering the runtime and genesis state will vary. If you are registering on a TestNet like [Paseo](../../../../develop/networks.md#paseo), you will have to apply for a slot through a form, or ask for enough PAS to register your runtime code: + +- [Paseo Parachain Onboarding Form](https://github.com/paseo-network/support/issues/new?assignees=al3mart%2Chbulgarini%2Ceduclerici-zondax&labels=onboard-para&projects=&template=onboard-parachain.yaml&title=%5BParachain+Onboarding+%7C+Slot+Request%5D+ParaId%3A+%3Cyour_paraId%3E){target=_\blank} +- [Paseo Support Matrix Chat Room](https://matrix.to/#/#paseo-testnet-support:parity.io){target=_\blank} + +## In This Section + +:::INSERT_IN_THIS_SECTION::: \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md new file mode 100644 index 000000000..a8e0f3c50 --- /dev/null +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md @@ -0,0 +1,4 @@ +--- +title: Obtain Coretime +description: This guide shows you how to obtain coretime for block production, either using on-demand or bulk options. +--- From 56e3773231100ad4e52e9646553a65e787e5c5d0 Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Tue, 10 Dec 2024 16:54:12 -0500 Subject: [PATCH 02/10] Add finishing touches --- .../acquire-a-testnet-slot-2.html | 2 +- .../deploy-on-paseo-3.html | 8 +++ .../acquire-a-testnet-slot-10.webp | Bin 0 -> 17120 bytes .../acquire-a-testnet-slot-9.webp | Bin 0 -> 56782 bytes .../parachains/deploy-to-relay-chain/.pages | 3 +- .../deploy-to-relay-chain/deploy-on-paseo.md | 48 +++++++++++------- .../deploy-to-relay-chain/obtain-coretime.md | 4 -- 7 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 .snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html create mode 100644 images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp create mode 100644 images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-9.webp delete mode 100644 tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html index 19e9bba40..1fc6f4c01 100644 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html @@ -1,5 +1,5 @@
- ./target/release/parachain-template-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json + polka-omni-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json
2024-09-11 09:48:15 Building chain spec 2024-09-11 09:48:15 assembling new collators for new session 0 at #0 diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html new file mode 100644 index 000000000..2bf570722 --- /dev/null +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html @@ -0,0 +1,8 @@ +
+ polkadot-omni-node key generate-node-key --base-path /tmp/parachain/pubs-demo --chain raw-parachain-chainspec.json +
+ 2024-09-11 09:48:15 Building chain spec + Generating key in "/tmp/parachain/pubs-demo/chains/live/network/secret_ed25519" + 12D3KooWJH816dWizsft7MXVrv1nH3dHnGsHxD1qdyQm9mMAbo7Z +
+ \ No newline at end of file diff --git a/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp b/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp new file mode 100644 index 0000000000000000000000000000000000000000..2222c3b3bcd5ef5b58d7c574c33f8d3b17caeda5 GIT binary patch literal 17120 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

xY^ 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 literal 0 HcmV?d00001 diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages index f3a769c02..b477c5370 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages @@ -1,5 +1,4 @@ title: Deploy to a Relay Chain nav: - index.md - - 'Deploy on Paseo': deploy-on-paseo.md - - 'Obtaining Coretime': obtain-coretime.md \ No newline at end of file + - 'Deploy on Paseo TestNet': deploy-on-paseo.md \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index a876b7a42..8c592211a 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -1,5 +1,5 @@ --- -title: Deploy on Paseo +title: Deploy on Paseo TestNet description: This guide walks you through the journey of deploying your Polkadot SDK blockchain on Paseo, detailing each step to a successful TestNet deployment. --- @@ -49,7 +49,7 @@ To prepare an account, follow these steps: After a few seconds, you will receive 100 PAS tokens in your account. -## Reserve a Parachain Identifier (ID) +## Reserve a Parachain Identifier You must reserve a parachain identifier (ID) before registering your parachain on Paseo. The steps are similar to the ones you followed in [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain){target=_\blank} to reserve an identifier on the local relay chain. However, for the public TestNet, you'll be assigned the next available identifier. @@ -61,7 +61,7 @@ To reserve a parachain identifier, follow these steps: ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-5.webp) -2. Register a parathread +2. Register a ParaId 1. Select the **Parathreads** tab 2. Click on the **+ ParaId** button @@ -95,14 +95,7 @@ To modify the chain specification: 2. Open the plain text chain specification for the parachain template node in a text editor -3. Set `relay_chain` to `paseo` and `para_id` to the identifier you've been assigned. For example, if your reserved identifier is 4508, set the `para_id` field to `4508`: - - ```json - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:1:4' - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:23:25' - ``` - -4. Set the `parachainId` to the parachain identifier that you previously reserved: +3. Set the `parachainId` to the parachain identifier that you previously reserved: ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json::2' @@ -110,7 +103,7 @@ To modify the chain specification: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:22:25' ``` -5. Add the public key for your account to the session keys section. Each configured session key will require a running collator: +4. Add the public key for your account to the session keys section. Each configured session key will require a running collator: ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json::2' @@ -118,12 +111,12 @@ To modify the chain specification: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:11:25' ``` -6. Save your changes and close the plain text chain specification file +5. Save your changes and close the plain text chain specification file -7. Generate a raw chain specification file from the modified chain specification file: +6. Generate a raw chain specification file from the modified chain specification file: ```bash - ./target/release/parachain-template-node build-spec \ + polkadot-omni-node build-spec \ --chain plain-parachain-chainspec.json \ --disable-default-bootnode \ --raw > raw-parachain-chainspec.json @@ -155,16 +148,32 @@ To prepare the parachain collator to be registered on Paseo, follow these steps: Once you have the genesis state and runtime, you can now register these with your parachain ID. -1. Go to the [Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads) tab, and select **+ Parathread** +1. Go to the [Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads){target=\_blank} tab, and select **+ Parathread** 2. You should see fields to place your runtime Wasm and genesis state respectively, along with the parachain ID. Select your parachain ID, and upload `para-4508-wasm` in the "code" field and `para-4508-state` in the "initial state" field: + +![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-9.webp) 3. Confirm your details and **+ Submit** button, where there should be a new Parathread with your parachain ID and an active **Deregister** button: -Your parachain's runtime logic and genesis are now part of the relay chain. The next step is to ensure you have a reliable collator to produce blocks, and to obtain coretime. +![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp) + +Your parachain's runtime logic and genesis are now part of the relay chain. The next step is to ensure you are able to run a collator to produce blocks for your parachain. ## Start the Collator Node +Before starting a collator, generate a node key. A node key is responsible for communicating with other nodes over Libp2p: + +```bash +polkadot-omni-node key generate-node-key \ + --base-path /tmp/parachain/pubs-demo \ + --chain raw-parachain-chainspec.json +``` + +After running the command, you should see the following output, indicating the base path now has a suitable node key: + +--8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html' + You must have the ports for the collator publicly accessible and discoverable to enable parachain nodes to peer with Paseo validator nodes to produce blocks. You can specify the ports with the `--port` command-line option. For example, you can start the collator with a command similar to the following: ```bash @@ -174,7 +183,6 @@ polkadot-omni-node --collator \ --port 50333 \ --rpc-port 8855 \ -- \ - --execution wasm \ --chain paseo \ --port 50343 \ --rpc-port 9988 @@ -182,11 +190,13 @@ polkadot-omni-node --collator \ In this example, the first `--port` setting specifies the port for the collator node and the second `--port` specifies the embedded relay chain node port. The first `--rpc-port` setting specifies the port you can connect to the collator. The second `--rpc-port` specifies the port for connecting to the embedded relay chain. -## Obtain Coretime +## Producing Blocks With your parachain collator operational, the next step is acquiring coretime. This is essential for ensuring your parachain's security through the relay chain. [Agile Coretime](https://wiki.polkadot.network/docs/learn-agile-coretime){target=\_blank} enhances Polkadot's resource management, offering developers greater economic adaptability. Once you have configured your parachain, you can follow two paths: - Bulk coretime is purchased via the Broker pallet on the respective coretime system parachain. You can purchase bulk coretime on the coretime chain and assign the purchased core to the registered `ParaID` - On-demand coretime is ordered via the `OnDemandAssignment` pallet, which is located on the respective relay chain +Once coretime is correctly assigned to your parachain, whether bulk or on-demand, blocks should be produced (provided your collator is running). + For more information on coretime, refer to the [Coretime](/polkadot-protocol/architecture/system-chains/coretime/){target=\_blank} documentation. diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md deleted file mode 100644 index a8e0f3c50..000000000 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/obtain-coretime.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Obtain Coretime -description: This guide shows you how to obtain coretime for block production, either using on-demand or bulk options. ---- From efa9306c3cbe8dafc7cdf98059a80ab9d3eb469a Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Thu, 12 Dec 2024 08:05:50 -0500 Subject: [PATCH 03/10] comments --- .../parachains/deploy-to-relay-chain/deploy-on-paseo.md | 2 +- .../polkadot-sdk/parachains/deploy-to-relay-chain/index.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 8c592211a..3e7029f0a 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -14,7 +14,7 @@ This tutorial demonstrates deploying a parachain on a public test network like t Before you start, you need to have the following prerequisites: - You know how to generate and modify chain specification files as described in the [Generate Chain Specs](/develop/parachains/deployment/generate-chain-specs){target=\_blank} section -- You have installed the `polkadot-omni-node` and `chain-spec-builder` binaries +- You have installed the [`polkadot-omni-node`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/omni_node/index.html){target=\_blank} and [`chain-spec-builder`](https://docs.rs/staging-chain-spec-builder/latest/staging_chain_spec_builder/){target=\_blank} binaries - You know how to generate and store keys as described in the [Spin Your Nodes](/tutorials/polkadot-sdk/parachains/local-chain/spin-your-nodes){target=\_blank} tutorial - You have completed the [Prepare a Local Relay Chain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/){target=\_blank} and the [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/){target=\_blank} tutorials on your local computer diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md index 77317b07b..a4fecab4b 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md @@ -1,6 +1,7 @@ --- title: Deploy on a Relay Chain description: Learn how to deploy on a live relay chain including, how to acquire Coretime, manage / setup collators, and what artifacts are needed to deploy your parachain. +hide: - feedback template: index-page.html --- From 9a9943e0a1c2fc6fbfd71e3ced235ac986796949 Mon Sep 17 00:00:00 2001 From: bader y Date: Thu, 12 Dec 2024 08:06:06 -0500 Subject: [PATCH 04/10] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolás Hussein <80422357+nhussein11@users.noreply.github.com> --- .../polkadot-sdk/parachains/deploy-to-relay-chain/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md index a4fecab4b..d58493cec 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md @@ -15,10 +15,10 @@ Deploying to a relay chain generally involves the following steps: 3. Ensuring you have collators ready to deploy (or at least one running locally to produce blocks) 4. Obtaining Coretime - Either Bulk (long term block production) or On Demand (ordering blocks as you need) -Depending on the relay chain you are deploying on, the costs for registering the runtime and genesis state will vary. If you are registering on a TestNet like [Paseo](../../../../develop/networks.md#paseo), you will have to apply for a slot through a form, or ask for enough PAS to register your runtime code: +Depending on the relay chain you are deploying on, the costs for registering the runtime and genesis state will vary. If you are registering on a TestNet like [Paseo](/develop/networks/#paseo), you will have to apply for a slot through a form or ask for enough PAS to register your runtime code: -- [Paseo Parachain Onboarding Form](https://github.com/paseo-network/support/issues/new?assignees=al3mart%2Chbulgarini%2Ceduclerici-zondax&labels=onboard-para&projects=&template=onboard-parachain.yaml&title=%5BParachain+Onboarding+%7C+Slot+Request%5D+ParaId%3A+%3Cyour_paraId%3E){target=_\blank} -- [Paseo Support Matrix Chat Room](https://matrix.to/#/#paseo-testnet-support:parity.io){target=_\blank} +- [Paseo Parachain Onboarding Form](https://github.com/paseo-network/support/issues/new?assignees=al3mart%2Chbulgarini%2Ceduclerici-zondax&labels=onboard-para&projects=&template=onboard-parachain.yaml&title=%5BParachain+Onboarding+%7C+Slot+Request%5D+ParaId%3A+%3Cyour_paraId%3E){target=\_blank} +- [Paseo Support Matrix Chat Room](https://matrix.to/#/#paseo-testnet-support:parity.io){target=\_blank} ## In This Section From 0182e2b68fff8b9f751d9795f79678be2dea68b4 Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Thu, 12 Dec 2024 10:55:04 -0500 Subject: [PATCH 05/10] change to chain-spec-builder --- .../acquire-a-testnet-slot-2.html | 7 ------- .../deploy-to-relay-chain/deploy-on-paseo.md | 13 ++++--------- 2 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 .snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html deleted file mode 100644 index 1fc6f4c01..000000000 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html +++ /dev/null @@ -1,7 +0,0 @@ -

- polka-omni-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json -
- 2024-09-11 09:48:15 Building chain spec - 2024-09-11 09:48:15 assembling new collators for new session 0 at #0 - 2024-09-11 09:48:15 assembling new collators for new session 1 at #0 -
diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 3e7029f0a..dcfd38353 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -113,18 +113,13 @@ To modify the chain specification: 5. Save your changes and close the plain text chain specification file -6. Generate a raw chain specification file from the modified chain specification file: +6. Convert the modified plain chain specification file to a raw chain specification file: ```bash - polkadot-omni-node build-spec \ - --chain plain-parachain-chainspec.json \ - --disable-default-bootnode \ - --raw > raw-parachain-chainspec.json - ``` - - After running the command, you will see the following output: + chain-spec-builder convert-to-raw chain_spec.json + ```` - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html' + You should now see your chain specification containing SCALE-encoded hex values versus plain text. ## Export Required Files From f61b0c6ab7eca7ff2246edc09469889b61a27edc Mon Sep 17 00:00:00 2001 From: bader y Date: Thu, 12 Dec 2024 11:04:24 -0500 Subject: [PATCH 06/10] Update tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> --- .../parachains/deploy-to-relay-chain/deploy-on-paseo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index dcfd38353..1ccbbad91 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -14,7 +14,7 @@ This tutorial demonstrates deploying a parachain on a public test network like t Before you start, you need to have the following prerequisites: - You know how to generate and modify chain specification files as described in the [Generate Chain Specs](/develop/parachains/deployment/generate-chain-specs){target=\_blank} section -- You have installed the [`polkadot-omni-node`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/omni_node/index.html){target=\_blank} and [`chain-spec-builder`](https://docs.rs/staging-chain-spec-builder/latest/staging_chain_spec_builder/){target=\_blank} binaries +- You have installed the [`polkadot-omni-node`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/omni_node/index.html){target=\_blank} and [`chain-spec-builder`](https://crates.io/crates/staging-chain-spec-builder){target=\_blank} binaries - You know how to generate and store keys as described in the [Spin Your Nodes](/tutorials/polkadot-sdk/parachains/local-chain/spin-your-nodes){target=\_blank} tutorial - You have completed the [Prepare a Local Relay Chain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/){target=\_blank} and the [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/){target=\_blank} tutorials on your local computer From 660e117d61c7baeefddb00b6b4a4748016aced38 Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Thu, 12 Dec 2024 14:25:44 -0500 Subject: [PATCH 07/10] feedback --- .../parachains/deploy-to-relay-chain/deploy-on-paseo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 1ccbbad91..6dfa0e3a2 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -14,7 +14,7 @@ This tutorial demonstrates deploying a parachain on a public test network like t Before you start, you need to have the following prerequisites: - You know how to generate and modify chain specification files as described in the [Generate Chain Specs](/develop/parachains/deployment/generate-chain-specs){target=\_blank} section -- You have installed the [`polkadot-omni-node`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/omni_node/index.html){target=\_blank} and [`chain-spec-builder`](https://crates.io/crates/staging-chain-spec-builder){target=\_blank} binaries +- You have installed the [`polkadot-omni-node`](https://github.com/paritytech/polkadot-sdk/blob/master/cumulus/polkadot-omni-node/README.md){target=\_blank} and [`chain-spec-builder`](https://crates.io/crates/staging-chain-spec-builder){target=\_blank} binaries - You know how to generate and store keys as described in the [Spin Your Nodes](/tutorials/polkadot-sdk/parachains/local-chain/spin-your-nodes){target=\_blank} tutorial - You have completed the [Prepare a Local Relay Chain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/){target=\_blank} and the [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/){target=\_blank} tutorials on your local computer From 1e27654b50d1e467ed9805b2bcee637f7e266902 Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Thu, 12 Dec 2024 14:34:46 -0500 Subject: [PATCH 08/10] replace parachain-template-node --- .../prepare-parachain.md | 22 +++++++++---------- .../prepare-relay-chain.md | 11 ++++------ .../deploy-to-relay-chain/deploy-on-paseo.md | 2 +- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md index 623d77613..c251c6fe9 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md @@ -108,8 +108,9 @@ To modify the default chain specification, follow these steps: 1. Generate the plain text chain specification for the parachain template node by running the following command ```bash - ./target/release/parachain-template-node build-spec \ - --disable-default-bootnode > plain-parachain-chainspec.json + chain-spec-builder create --relay-chain paseo \ + --para-id 4508 \ + -r ``` 2. Open the plain text chain specification for the parachain template node in a text editor @@ -142,10 +143,7 @@ To modify the default chain specification, follow these steps: 7. Generate a raw chain specification file from the modified chain specification file by running the following command ```bash - ./target/release/parachain-template-node build-spec \ - --chain plain-parachain-chainspec.json \ - --disable-default-bootnode \ - --raw > raw-parachain-chainspec.json + chain-spec-builder convert-to-raw plain-parachain-chainspec.json ``` After running the command, you will see the following output: @@ -163,8 +161,8 @@ To prepare the parachain collator to be registered: The relay chain needs the parachain-specific runtime validation logic to validate parachain blocks. You can export the Wasm runtime for a parachain collator node by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-wasm \ - --chain raw-parachain-chainspec.json para-2000-wasm + polkadot-omni-node export-genesis-wasm \ + --chain raw-parachain-chainspec.json para-2000-wasm ``` 2. Generate a parachain genesis state @@ -172,8 +170,8 @@ To prepare the parachain collator to be registered: To register a parachain, the relay chain needs to know the genesis state of the parachain. You can export the entire genesis state—hex-encoded—to a file by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-state \ - --chain raw-parachain-chainspec.json para-2000-genesis-state + polkadot-omni-node export-genesis-state \ + --chain raw-parachain-chainspec.json para-2000-state ``` After running the command, you will see the following output: @@ -186,7 +184,7 @@ To prepare the parachain collator to be registered: 3. Start a collator node with a command similar to the following ```bash - ./target/release/parachain-template-node \ + polkadot-omni-node \ --charlie \ --collator \ --force-authoring \ @@ -273,7 +271,7 @@ To reset the blockchain state, follow these steps: 2. Purge the parachain collator state by running the following command ```bash - ./target/release/parachain-template-node purge-chain \ + polkadot-omni-node purge-chain \ --chain raw-parachain-chainspec.json ``` diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md index 6b3c32ffa..2d6ed8036 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md @@ -100,8 +100,7 @@ To start the validator nodes, follow these steps: 1. Generate the plain text chain specification file: ```bash - ./target/release/polkadot build-spec \ - --chain rococo-local-testnet > /tmp/plain-local-chainspec.json + chain-spec-builder create -r ``` !!! note @@ -109,11 +108,9 @@ To start the validator nodes, follow these steps: 2. Convert the plain text chain specification file to the raw format: - ```bash - ./target/release/polkadot build-spec \ - --chain plain-local-chainspec.json \ - --raw > /tmp/raw-local-chainspec.json - ``` + ```bash + chain-spec-builder convert-to-raw plain-parachain-chainspec.json + ```` 2. Start the first validator using the `alice` account by running the following command: diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 6dfa0e3a2..869ef11dc 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -116,7 +116,7 @@ To modify the chain specification: 6. Convert the modified plain chain specification file to a raw chain specification file: ```bash - chain-spec-builder convert-to-raw chain_spec.json + chain-spec-builder convert-to-raw plain-parachain-chainspec.json ```` You should now see your chain specification containing SCALE-encoded hex values versus plain text. From ab256f1cd5a0fe01104fd5d0b748a511449b62a0 Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Thu, 12 Dec 2024 14:44:29 -0500 Subject: [PATCH 09/10] fix most instructions --- .../prepare-parachain-3.html | 10 ++----- .../prepare-parachain-4.html | 19 +++++++++++-- .../prepare-parachain-5.html | 20 -------------- .../prepare-parachain.md | 27 ++++++------------- .../prepare-relay-chain.md | 2 +- .../deploy-to-relay-chain/deploy-on-paseo.md | 3 ++- 6 files changed, 30 insertions(+), 51 deletions(-) delete mode 100644 .snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html index 48ed76714..6b10cbea1 100644 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html @@ -1,11 +1,5 @@
- ./target/release/parachain-template-node build-spec \ - --chain plain-parachain-chainspec.json \ - --disable-default-bootnode \ - --raw > raw-parachain-chainspec.json - - 2024-09-10 14:34:58 Building chain spec - 2024-09-10 14:34:59 assembling new collators for new session 0 at #0 - 2024-09-10 14:34:59 assembling new collators for new session 1 at #0 + polkadot-omni-node export-genesis-state --chain raw-parachain-chainspec.json para-2000-genesis-state + 2024-09-10 14:41:13 🔨 Initializing Genesis block/state (state: 0xb089…1830, header-hash: 0x6b0b…bd69)
diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html index c5bb4cef7..3f7098e42 100644 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html @@ -1,5 +1,20 @@
- ./target/release/parachain-template-node export-genesis-state \ --chain raw-parachain-chainspec.json para-2000-genesis-state - 2024-09-10 14:41:13 🔨 Initializing Genesis block/state (state: 0xb089…1830, header-hash: 0x6b0b…bd69) + polkadot-omni-node \ + --charlie \ + --collator \ + --force-authoring \ + --chain raw-parachain-chainspec.json \ + --base-path /tmp/charlie-parachain/ \ + --unsafe-force-node-key-generation \ + --port 40333 \ + --rpc-port 8844 \ + -- \ + --chain INSERT_RELAY_CHAIN_PATH/local-raw-spec.json \ + --port 30333 \ + --rpc-port 9946 + + 2024-09-10 16:26:30 [Parachain] PoV size { header: 0.21875kb, extrinsics: 3.6103515625kb, storage_proof: 3.150390625kb } + 2024-09-10 16:26:30 [Parachain] Compressed PoV size: 6.150390625kb + 2024-09-10 16:26:33 [Relaychain] 💤 Idle (2 peers), best: #1729 (0x3aa4…cb6b), finalized #1726 (0xff7a…4352), ⬇ 9.1kiB/s ⬆ 3.8kiB/s
diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html deleted file mode 100644 index d02f4ce36..000000000 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html +++ /dev/null @@ -1,20 +0,0 @@ -
- ./target/release/parachain-template-node \ - --charlie \ - --collator \ - --force-authoring \ - --chain raw-parachain-chainspec.json \ - --base-path /tmp/charlie-parachain/ \ - --unsafe-force-node-key-generation \ - --port 40333 \ - --rpc-port 8844 \ - -- \ - --chain INSERT_RELAY_CHAIN_PATH/local-raw-spec.json \ - --port 30333 \ - --rpc-port 9946 - - 2024-09-10 16:26:30 [Parachain] PoV size { header: 0.21875kb, extrinsics: 3.6103515625kb, storage_proof: 3.150390625kb } - 2024-09-10 16:26:30 [Parachain] Compressed PoV size: 6.150390625kb - 2024-09-10 16:26:33 [Relaychain] 💤 Idle (2 peers), best: #1729 (0x3aa4…cb6b), finalized #1726 (0xff7a…4352), ⬇ 9.1kiB/s ⬆ 3.8kiB/s - -
diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md index c251c6fe9..cb784f92b 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md @@ -110,27 +110,20 @@ To modify the default chain specification, follow these steps: ```bash chain-spec-builder create --relay-chain paseo \ --para-id 4508 \ - -r + -r \ + default ``` 2. Open the plain text chain specification for the parachain template node in a text editor -3. Set the `para_id` to the parachain identifier that you previously reserved. For example, if your reserved identifier is `2000`, set the `para_id` field to `2000`: - - ```json - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:1:4' - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:6:6' - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:13:15' - ``` - -4. Set the `parachainId` to the parachain identifier that you previously reserved. For example, if your reserved identifier is `2000`, set the `parachainId` field to `2000` +3. Set the `parachainId` to the parachain identifier that you previously reserved. For example, if your reserved identifier is `2000`, set the `parachainId` field to `2000` ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:1:2' --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:6:15' ``` -5. If you complete this tutorial simultaneously as anyone on the same local network, an additional step is needed to prevent accidentally peering with their nodes. Find the following line and add characters to make your `protocolId` unique +4. If you complete this tutorial simultaneously as anyone on the same local network, an additional step is needed to prevent accidentally peering with their nodes. Find the following line and add characters to make your `protocolId` unique ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:1:2' @@ -138,18 +131,14 @@ To modify the default chain specification, follow these steps: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:13:15' ``` -6. Save your changes and close the plain text chain specification file +5. Save your changes and close the plain text chain specification file -7. Generate a raw chain specification file from the modified chain specification file by running the following command +6. Generate a raw chain specification file from the modified chain specification file by running the following command ```bash chain-spec-builder convert-to-raw plain-parachain-chainspec.json ``` - After running the command, you will see the following output: - - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html' - ## Prepare the Parachain Collator With the local relay chain running and the raw chain specification for the parachain template updated, you can start the parachain collator node and export information about its runtime and genesis state. @@ -176,7 +165,7 @@ To prepare the parachain collator to be registered: After running the command, you will see the following output: - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html' + --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html' !!!note You should note that the runtime and state you export must be for the genesis block. You can't connect a parachain with any previous state to a relay chain. All parachains must start from block 0 on the relay chain. See [Convert a Solo Chain](https://docs.substrate.io/reference/how-to-guides/parachains/convert-a-solo-chain/){target=\_blank} for details on how the parachain template was created and how to convert the chain logic—not its history or state migrations—to a parachain. @@ -204,7 +193,7 @@ To prepare the parachain collator to be registered: After running the command, you will see the following output: - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html' + --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html' ## Register With the Local Relay Chain diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md index 2d6ed8036..d5477897f 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md @@ -100,7 +100,7 @@ To start the validator nodes, follow these steps: 1. Generate the plain text chain specification file: ```bash - chain-spec-builder create -r + chain-spec-builder create -r default ``` !!! note diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 869ef11dc..795a870d4 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -88,7 +88,8 @@ To modify the chain specification: ```bash chain-spec-builder create --relay-chain paseo \ --para-id 4508 \ - -r + -r \ + default ``` !!!info Be sure to use the `*.compact.compressed.wasm` version of your file when generating your chain specification. From fabd1fbbbb7409dac3ae7a31f395bb18c200fc08 Mon Sep 17 00:00:00 2001 From: Bader Youssef Date: Fri, 13 Dec 2024 07:41:54 -0500 Subject: [PATCH 10/10] few things --- .../parachains/connect-to-relay-chain/prepare-parachain.md | 2 +- .../parachains/deploy-to-relay-chain/deploy-on-paseo.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md index cb784f92b..105370c44 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md @@ -40,7 +40,7 @@ To build the parachain template, follow these steps: 2. Change the directory to the cloned repository ```bash - cd polkadot-sdk-solochain-template + cd polkadot-sdk-parachain-template ``` 3. Build the parachain template collator diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 795a870d4..456b960a7 100644 --- a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -130,14 +130,14 @@ To prepare the parachain collator to be registered on Paseo, follow these steps: ```bash polkadot-omni-node export-genesis-wasm \ - --chain raw-parachain-chainspec.json para-4508-wasm + --chain raw-parachain-chainspec.json para-wasm ``` 2. Export the genesis state for the parachain by running a command similar to the following: ```bash polkadot-omni-node export-genesis-state \ - --chain raw-parachain-chainspec.json para-4508-state + --chain raw-parachain-chainspec.json para-state ``` ## Register a Parathread @@ -146,7 +146,7 @@ Once you have the genesis state and runtime, you can now register these with you 1. Go to the [Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads){target=\_blank} tab, and select **+ Parathread** -2. You should see fields to place your runtime Wasm and genesis state respectively, along with the parachain ID. Select your parachain ID, and upload `para-4508-wasm` in the "code" field and `para-4508-state` in the "initial state" field: +2. You should see fields to place your runtime Wasm and genesis state respectively, along with the parachain ID. Select your parachain ID, and upload `para-wasm` in the "code" field and `para-state` in the "initial state" field: ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-9.webp)