Quick start

  • Begin by visiting our repository. You can fork it, use it as a template, or simply clone it to your local directory.

git clone git@github.com:OpenZeppelin/polkadot-runtime-templates.git
  • Move to the directory of the template you want to use. We will use the generic runtime template for this tutorial.

cd generic-template
  • Build a release version of the runtime and node:

cargo build --release
  • Receive some ROC from the Rococo faucet

  • Reserve a ParaId on Rococo:

    • Go to PolkadotJS. Check that it points to Rococo testnet.

    • Go to Network > Parachains

    • Go to Parathreads tab

    • Click the + ParaId button

    • Save a parachain id for the further usage.

    • Click Submit and Sign and Submit.

  • Generate and customize a chainspec:

    • Generate a plain chainspec with this command:

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

      • Update name, id and protocolId to unique values.

      • Change relay_chain from rococo-local to rococo.

      • Change para_id and parachainInfo.parachainId from 1000 to the previously saved parachain id.

    • Generate a raw chainspec with this command:

      ./target/release/parachain-template-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json
  • Run two nodes and wait until it syncs with the Rococo relay chain. This can take a fairly long time(up to 2 days), so we can use the fast-unsafe flag to make the process faster since we are on a testnet(~ 3 hours). fast downloads the blocks without executing the transactions, and unsafe skips downloading the state proofs(which we are ok with since it is Rococo).

    ./target/release/parachain-template-node \
        --alice \
        --collator \
        --force-authoring \
        --chain raw-parachain-chainspec.json \
        --base-path <path to datadir> \
        --port 40333 \
        --rpc-port 8844 \
        -- \
        --execution wasm \
        --chain <path to the Rococo chainspec> \
        --port 30343 \
        --rpc-port 9977 \
        --sync fast-unsafe
    ./target/release/parachain-template-node \
        --bob \
        --collator \
        --force-authoring \
        --chain raw-parachain-chainspec.json \
        --base-path <path to datadir> \
        --port 40333 \
        --rpc-port 8845 \
        -- \
        --execution wasm \
        --chain <path to the Rococo chainspec> \
        --port 30343 \
        --rpc-port 9977 \
        --sync fast-unsafe
    • <path to datadir> is where the downloaded chain state will be stored. It can be any folder on your computer.

    • <path to the Rococo chainspec> is where your Rococo chainspec is stored. You can download this file from the official Polkadot sdk repository.

  • Register a parathread:

    • Generate a genesis state:

      ./target/release/parachain-template-node export-genesis-state --chain raw-parachain-chainspec.json para-<paraId>-genesis-state
    • Generate a genesis wasm:

      ./target/release/parachain-template-node export-genesis-wasm --chain raw-parachain-chainspec.json para-<paraId>-wasm
    • Go to PolkadotJS. Check that it points to Rococo testnet.

    • Go to Network > Parachains.

    • Go to Parathreads tab.

    • Click the + ParaThread button.

    • Insert para-<paraId>-wasm to code field.

    • Insert para-<paraId>-genesis-state to initial state field.

    • Click Submit and Sign and Submit.

  • When a parachain gets synced with a relaychain, you may start producing blocks as a parathread:

    • Create some transaction with a PolkadotJS pointing to your parachain setup.

    • With a PolkadotJS pointing to Rococo go to Developer > Extrinsics.

    • Submit an extrinsic onDemandAssignmentProvider.placeOrderAllowDeath or onDemandAssignmentProvider.placeOrderKeepAlive:

      • maxAmount should be not less than 10_000_000 and it is amount of 0.00001 ROC. It is an amount of ROC paid for the block.

      • paraId should be set to your parachain id.

      • Click Submit and Sign and Submit.

    • In some time your parathread will produce a block and in one of the next blocks of Rococo there will be an inclusion of this block

What’s next?

  • Read our general guides to understand more about the concepts of runtime development.

  • Learn more about the runtime configuration. Currently, we have two runtime templates: Generic Runtime Template and EVM Runtime Template.

  • Explore the documentation for pallets. It may be useful if you are considering building a frontend for your parachain.