[![Try on playground](https://img.shields.io/badge/Playground-node-templates-brightgreen?logo=Parity%20Substrate)](https://playground-staging.substrate.dev/?deploy=node-templates) # Substrate Node Template A new FRAME-based Substrate node, ready for hacking. ## Build Install Rust: ```bash curl https://sh.rustup.rs -sSf | sh ``` Initialize your Wasm Build environment: ```bash ./scripts/init.sh ``` Build Wasm and native code: ```bash cargo build --release ``` ## Run ### Single Node Development Chain Purge any existing developer chain state: ```bash ./target/release/node-template purge-chain --dev ``` Start a development chain with: ```bash ./target/release/node-template --dev ``` Detailed logs may be shown by running the node with the following environment variables set: `RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`. ### Multi-Node Local Testnet If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with testnet units. Optionally, give each node a name and expose them so they are listed on the Polkadot [telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open. We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: ```bash cargo run -- \ --base-path /tmp/alice \ --chain=local \ --alice \ --node-key 0000000000000000000000000000000000000000000000000000000000000001 \ --telemetry-url 'ws://telemetry.polkadot.io:1024 0' \ --validator ``` In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's bootnode ID on TCP port 30333: ```bash cargo run -- \ --base-path /tmp/bob \ --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ --chain=local \ --bob \ --port 30334 \ --telemetry-url 'ws://telemetry.polkadot.io:1024 0' \ --validator ``` Additional CLI usage options are available and may be shown by running `cargo run -- --help`. ### Run in Docker First, install [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/). Then run the following command to start a single node development chain. ```bash ./scripts/docker_run.sh ``` This command will firstly compile your code, and then start a local development network. You can also replace the default command (`cargo build --release && ./target/release/node-template --dev --ws-external`) by appending your own. A few useful ones are as follow. ```bash # Run Substrate node without re-compiling ./scripts/docker_run.sh ./target/release/node-template --dev --ws-external # Purge the local dev chain ./scripts/docker_run.sh ./target/release/node-template purge-chain --dev # Check whether the code is compilable ./scripts/docker_run.sh cargo check ``` ## Advanced: Generate Your Own Substrate Node Template A substrate node template is always based on a certain version of Substrate. You can inspect it by opening [Cargo.toml](Cargo.toml) and see the template referred to a specific Substrate commit( `rev` field), branch, or version. You can generate your own Substrate node-template based on a particular Substrate version/commit by running following commands: ```bash # git clone from the main Substrate repo git clone https://github.com/paritytech/substrate.git cd substrate # Switch to a particular branch or commit of the Substrate repo your node-template based on git checkout # Run the helper script to generate a node template. # This script compiles Substrate and takes a while to complete. It takes a relative file path # from the current dir. to output the compressed node template. .maintain/node-template-release.sh ../node-template.tar.gz ``` Noted though you will likely get faster and more thorough support if you stick with the releases provided in this repository.