

This is a template for creating a parachain based on Polkadot SDK.
This template is automatically updated after releases in the main Polkadot SDK monorepo.
-
⏫ This template provides a starting point to build a parachain.
-
☁️ It is based on the Cumulus framework.
-
🔧 Its runtime is configured with a single custom pallet as a starting point, and a handful of ready-made pallets such as a Balances pallet.
-
👉 Learn more about parachains here
A Polkadot SDK based project such as this one consists of:
- 🧮 the Runtime - the core logic of the parachain.
- 🎨 the Pallets - from which the runtime is constructed.
- 💿 a Node - the binary application, not part of the project default-members list and not compiled unless
building the project with
--workspace
flag, which builds all workspace members, and is an alternative to Omni Node.
-
🦀 The template is using the Rust language.
-
👉 Check the Rust installation instructions for your system.
-
🛠️ Depending on your operating system and Rust version, there might be additional packages required to compile this template - please take note of the Rust compiler output.
Fetch parachain template code:
git clone https://github.com/paritytech/polkadot-sdk-parachain-template.git parachain-template
cd parachain-template
Omni Node can
be used to run the parachain template's runtime. polkadot-omni-node
binary crate usage is described at a high-level
on crates.io.
Please see the installation section at crates.io/omni-node
.
cargo build --release
Please see the installation section at crates.io/staging-chain-spec-builder
.
chain-spec-builder create --relay-chain "rococo-local" --para-id 1000 --runtime \
target/release/wbuild/parachain-template-runtime/parachain_template_runtime.wasm named-preset development
Note: the relay-chain
and para-id
flags are mandatory information required by
Omni Node, and for parachain template case the value for para-id
must be set to 1000
, since this
is also the value injected through ParachainInfo
pallet into the parachain-template-runtime
's storage. The relay-chain
value is set in accordance
with the relay chain ID where this instantiation of parachain-template will connect to.
Start Omni Node with the generated chain spec. We'll start it in development mode (without a relay chain config), producing and finalizing blocks based on manual seal, configured below to seal a block with each second.
polkadot-omni-node --chain <path/to/chain_spec.json> --dev --dev-block-time 1000
However, such a setup is not close to what would run in production, and for that we need to setup a local relay chain network that will help with the block finalization. In this guide we'll setup a local relay chain as well. We'll not do it manually, by starting one node at a time, but we'll use zombienet.
Follow through the next section for more details on how to do it.
Assuming we continue from the last step of the previous section, we have a chain spec and we need to setup a relay chain.
We can install zombienet
as described here, and
zombienet-omni-node.toml
contains the network specification we want to start.
Download the polkadot
(and the accompanying polkadot-prepare-worker
and polkadot-execute-worker
) binaries from
Polkadot SDK releases. Then expose them on PATH
like so:
export PATH="$PATH:<path/to/binaries>"
# ...
[[parachains]]
id = 1000
chain_spec_path = "<TO BE UPDATED WITH A VALID PATH>"
# ...
zombienet --provider native spawn zombienet-omni-node.toml
As mentioned in the Template Structure
section, the node
crate is optionally compiled and it is an alternative
to Omni Node
. Similarly, it requires setting up a relay chain, and we'll use zombienet
once more.
cargo install --path node
For setup, please consider the instructions for zombienet
installation here
and relay chain prerequisites.
We're left just with starting the network:
zombienet --provider native spawn zombienet.toml
-
🌐 You can interact with your local node using the hosted version of the Polkadot/Substrate Portal: relay chain and parachain.
-
🪐 A hosted version is also available on IPFS.
-
🧑🔧 You can also find the source code and instructions for hosting your own instance in the
polkadot-js/apps
repository.
Development parachains:
- 🔗 Connect to relay chains, and we showcased how to connect to a local one.
- 🧹 Do not persist the state.
- 💰 Are preconfigured with a genesis state that includes several prefunded development accounts.
- 🧑⚖️ Development accounts are used as validators, collators, and
sudo
accounts.
We recommend using chopsticks
when the focus is more on the runtime
development and OmniNode
is enough as is.
To use chopsticks
, please install the latest version according to the installation guide.
Build the parachain-template-runtime
as mentioned before in this guide and use chain-spec-builder
again but this time by passing --raw-storage
flag:
chain-spec-builder create --raw-storage --relay-chain "rococo-local" --para-id 1000 --runtime \
target/release/wbuild/parachain-template-runtime/parachain_template_runtime.wasm named-preset development
npx @acala-network/chopsticks@latest --chain-spec <path/to/chain_spec.json>
OmniNode
can be still used for runtime development if using the --dev
flag, while parachain-template-node
doesn't
support it at this moment. It can still be used to test a runtime in a full setup where it is started alongside a
relay chain network (see Parachain Template node setup).
-
🔄 This template is automatically updated after releases in the main Polkadot SDK monorepo.
-
➡️ Any pull requests should be directed to this source.
-
😇 Please refer to the monorepo's contribution guidelines and Code of Conduct.
-
🧑🏫 To learn about Polkadot in general, Polkadot.network website is a good starting point.
-
🧑🔧 For technical introduction, here are the Polkadot SDK documentation resources.
-
👥 Additionally, there are GitHub issues and Substrate StackExchange.