* Initial network interface preparations * Implement get_storage_by_key * Implement `validators` and `session_index_for_child` * Implement persisted_validation_data and candidate_pending_availability * Fix method name for persisted_validation_data and add encoded params * Implement `retrieve_dmq_contents` and `retrieve_all_inbound_hrmp_channel_contents` * Implement `prove_read` * Introduce separate RPC client, expose JsonRpSee errors * Simplify closure in call_remote_runtime_function * Implement import stream, upgrade JsonRpSee * Implement finality stream * Remove unused method from interface * Implement `is_major_syncing` * Implement `wait_on_block` * Fix tests * Unify error handling `ApiError` * Replace WaitError with RelayChainError * Wrap BlockChainError in RelayChainError * Unify error handling in relay chain intefaces * Fix return type of proof method * Improve error handling of new methods * Improve error handling and move logging outside of interface * Clean up * Remove unwanted changes, clean up * Remove unused import * Add format for StatemachineError and remove nused From trait * Use 'thiserror' crate to simplify error handling * Expose error for overseer, further simplify error handling * Reintroduce network interface * Implement cli option * Adjust call_state method to use hashes * Disable PoV recovery when RPC is used * Add integration test for network full node * Use Hash instead of BlockId to ensure compatibility with RPC interface * Fix cargo check warnings * Implement retries * Remove `expect` statements from code * Update jsonrpsee to 0.8.0 and make collator keys optional * Make cli arguments conflicting * Remove unused `block_status` method * Add clippy fixes * Cargo fmt * Validate relay chain rpc url * Clean up dependencies and add one more integration test * Clean up * Clean up dependencies of relay-chain-network * Use hash instead of blockid for rpc methods * Fix tests * Update client/cli/src/lib.rs Co-authored-by: Koute <koute@users.noreply.github.com> * Improve error message of cli validation * Add rpc client constructor * Do not use debug formatting for errors * Improve logging for remote runtime methods * Only retry on transport problems * Use PHash by value, rename test * Improve tracing, return error on relay-chain-interface build * Fix naming, use generics instead of deserializing manually * Rename RelayChainLocal and RelayChainNetwork * lock * Format * Use impl trait for encodable runtime payload * Only instantiate full node in tests when we need it * Upgrade scale-codec to 3.0.0 * Improve expect log Co-authored-by: Koute <koute@users.noreply.github.com>
Cumulus ☁️
This repository contains both the Cumulus SDK and also specific chains implemented on top of this SDK.
Cumulus SDK
A set of tools for writing Substrate-based Polkadot parachains. Refer to the included overview for architectural details, and the Cumulus tutorial for a guided walk-through of using these tools.
It's easy to write blockchains using Substrate, and the overhead of writing parachains' distribution, p2p, database, and synchronization layers should be just as low. This project aims to make it easy to write parachains for Polkadot by leveraging the power of Substrate.
Cumulus clouds are shaped sort of like dots; together they form a system that is intricate, beautiful and functional.
Consensus
parachain-consensus is a
consensus engine for Substrate
that follows a Polkadot
relay chain. This will run
a Polkadot node internally, and dictate to the client and synchronization algorithms which chain
to follow,
finalize,
and treat as best.
Collator
A Polkadot collator for the parachain is
implemented by the polkadot-collator binary.
Statemint 🪙
This repository also contains the Statemint runtime (as well as the canary runtime Statemine and the test runtime Westmint). Statemint is a common good parachain providing an asset store for the Polkadot ecosystem.
Build & Launch a Node
To run a Statemine or Westmint node (Statemint is not deployed, yet) you will need to compile the
polkadot-collator binary:
cargo build --release --locked -p polkadot-collator
Once the executable is built, launch the parachain node via:
CHAIN=westmint # or statemine
./target/release/polkadot-collator --chain $CHAIN
Refer to the setup instructions below to run a local network for development.
Canvas 🧑🎨
This is a node implementation of Canvas, a common good parachain for pallet-contracts
based wasm smart contracts. Right now this repository only contains the canvas-kusama runtime
which we plan to use for both Rococo and Kusama.
If you have any questions, feel free to talk to us on Element or on Discord
(in the ink_smart-contracts channel).
Developing Smart Contracts for Canvas
This node contains Substrate's smart contracts module ‒ the
contracts pallet.
This contracts pallet takes smart contracts as WebAssembly blobs and defines an API
for everything a smart contract needs (storage access, …).
As long as a programming language compiles to WebAssembly and there exists an implementation
of this API in it, you can write a smart contract for this pallet ‒ and thus for Canvas ‒ in
that language.
This is a list of languages you can currently choose from:
- Parity's ink! for Rust
- ask! for Assembly Script
- The Solang compiler for Solidity
There are also different user interfaces and command-line tools you can use to deploy or interact with contracts:
- polkadot-js
- Canvas UI (outdated)
If you are looking for a quickstart, we can recommend ink!'s Guided Tutorial for Beginners.
Build & Launch a Node
To run a Canvas node that connects to Rococo (Kusama and Polkadot parachains are not deployed, yet)
you will need to compile the polkadot-collator binary:
cargo build --release --locked -p polkadot-collator
Once the executable is built, launch the parachain node via:
./target/release/polkadot-collator --chain rocanvas
Refer to the setup instructions below to run a local network for development.
Rococo Deployment
We have a live deployment of the Canvas parachain on Rococo ‒ a testnet for Polkadot and Kusama parachains. You can interact with the network through Polkadot JS Apps, click here for a direct link to Canvas.
The Canvas parachain uses the Rococo relay chain's native token (ROC) instead of having its own token. Due to this you'll need ROC in order to deploy contracts on Canvas.
As a first step, you should create an account. See here for a detailed guide.
As a second step, you have to get ROC testnet tokens through the Rococo Faucet. This is a chat room in which you need to write:
!drip YOUR_SS_58_ADDRESS:1002
The number 1002 is the parachain id of Canvas on Rococo, by supplying it the faucet will teleport ROC
tokens directly to your account on the parachain.
If everything worked out, the teleported ROC tokens will show up under the "Accounts" tab for Canvas.
Once you have ROC on Canvas you can deploy a contract as you would normally. If you're unsure about this, our guided tutorial will clarify that for you in no time.
Rococo 👑
Rococo is becoming a Community Parachain Testbed for parachain teams in the Polkadot ecosystem. It supports multiple parachains with the differentiation of long-term connections and recurring short-term connections, to see which parachains are currently connected and how long they will be connected for see here.
Rococo is an elaborate style of design and the name describes the painstaking effort that has gone into this project.
Build & Launch Rococo Collators
Collators are similar to validators in the relay chain. These nodes build the blocks that will eventually be included by the relay chain for a parachain.
To run a Rococo collator you will need to compile the following binary:
cargo build --release --locked -p polkadot-collator
Otherwise you can compile it with Parity CI docker image:
docker run --rm -it -w /shellhere/cumulus \
-v $(pwd):/shellhere/cumulus \
paritytech/ci-linux:production cargo build --release --locked -p polkadot-collator
sudo chown -R $(id -u):$(id -g) target/
If you want to reproduce other steps of CI process you can use the following guide.
Once the executable is built, launch collators for each parachain (repeat once each for chain
tick, trick, track):
./target/release/polkadot-collator --chain $CHAIN --validator
Parachains
The network uses horizontal message passing (HRMP) to enable communication between parachains and the relay chain and, in turn, between parachains. This means that every message is sent to the relay chain, and from the relay chain to its destination parachain.
Local Setup
Launch a local setup including a Relay Chain and a Parachain.
Launch the Relay Chain
# Compile Polkadot with the real overseer feature
git clone https://github.com/paritytech/polkadot
cargo build --release
# Generate a raw chain spec
./target/release/polkadot build-spec --chain rococo-local --disable-default-bootnode --raw > rococo-local-cfde.json
# Alice
./target/release/polkadot --chain rococo-local-cfde.json --alice --tmp
# Bob (In a separate terminal)
./target/release/polkadot --chain rococo-local-cfde.json --bob --tmp --port 30334
Launch the Parachain
# Compile
git clone https://github.com/paritytech/cumulus
cargo build --release
# Export genesis state
./target/release/polkadot-collator export-genesis-state > genesis-state
# Export genesis wasm
./target/release/polkadot-collator export-genesis-wasm > genesis-wasm
# Collator1
./target/release/polkadot-collator --collator --alice --force-authoring --tmp --port 40335 --ws-port 9946 -- --execution wasm --chain ../polkadot/rococo-local-cfde.json --port 30335
# Collator2
./target/release/polkadot-collator --collator --bob --force-authoring --tmp --port 40336 --ws-port 9947 -- --execution wasm --chain ../polkadot/rococo-local-cfde.json --port 30336
# Parachain Full Node 1
./target/release/polkadot-collator --tmp --port 40337 --ws-port 9948 -- --execution wasm --chain ../polkadot/rococo-local-cfde.json --port 30337
Register the parachain
Containerize
After building polkadot-collator with cargo or with Parity CI image as documented in this chapter,
the following will allow producing a new docker image where the compiled binary is injected:
./docker/scripts/build-injected-image.sh
Alternatively, you can build an image with a builder pattern:
docker build --tag $OWNER/$IMAGE_NAME --file ./docker/polkadot-collator_builder.Containerfile .
You may then run your new container:
```bash
docker run --rm -it $OWNER/$IMAGE_NAME --collator --tmp --execution wasm --chain /specs/westmint.json
