Build InfraRelayChain
Before You Begin
Before you start, make sure to:
Review the Rust and Rust Toolchain to set up the Substrate development environment.
Familiarize yourself with Multi-Chain Architecture and Terms.
Tutorial Objectives
By completing this tutorial, you will achieve the following objectives:
Learn how to build the InfraRelayChain runtime as a binary.
Extract the plain chain spec and the SCALE-encoded raw chain spec from the binary.
Start nodes from the chain spec.
Build the Relay Chain Node
Clone the latest InfraBlockchain SDK:
git clone --branch master https://github.com/InfraBlockchain/infrablockchain-substrate.git
Build the InfraBlockchain runtime by executing the following three commands:
1. cargo build --release --bin infra-relaychain 2. cargo build --release --bin infra-relaychain-execute-worker 3. cargo build --release --bin infra-relaychain-prepare-worker
Verify that the node has been built correctly by running the following command in the same directory:
./target/release/infra-relaychain --help
If the command displays the command-line help, the node is ready for configuration.
Chain Specs
All Substrate-based chains require a chain spec. The chain spec specifies the initial state of the network (genesis state) and various network settings. For deterministic network configuration, all nodes participating in the network have the same chain spec.
Extracting the Plain Chain Spec
Use the following command in the same directory to extract the plain chain spec. After running the command, the plain-infra-relay-chainspec.json
file is created in the same path.
./target/release/infra-relaychain build-spec --chain infra-relay-local --disable-default-bootnode > plain-infra-relay-chainspec.json
In this tutorial, a sample chain spec file for the InfraRelayChain with four Seed Trust Validators is used. For actual network configuration, only alice
and bob
validators are started for simulation purposes.
Relay Chain must have at least one validator node running for each connected parachain collator. Therefore, to connect two parachains with one collator each, you need to run at least three Relay Chain validator nodes.
Extracting the Raw Chain Spec File
Extract a SCALE-encoded raw JSON file. After running the command, the raw-infra-relay-chainspec.json
file is created in the same path.
./target/release/infra-relaychain build-spec --chain plain-infra-relay-chainspec.json --disable-default-bootnode --raw > raw-infra-relay-chainspec.json
You can read and edit the plain text version of the chain spec file. However, to use the chain spec file to start a node, it needs to be converted to the SCALE-encoded raw format. The sample chain spec represents a network with four validators. If you want to add different validators, multiple relay chains, or use custom account keys instead of predefined accounts, you will need to create a custom chain spec file.
If someone else is completing this tutorial concurrently on the same local network, modify the plain chain spec to avoid connecting nodes. In the plain chain spec JSON file, find the protocolId
key and change it to a unique value:
"protocolId": "infrablockchain"
Start the Relay Chain Node
To build the InfraBlockchain, you need to start the InfraRelayChain, which can connect parachains.
Start a validator node for alice
account:
./target/release/infra-relaychain \
--alice \
--validator \
--base-path /tmp/relay/alice \
--chain ./raw-infra-relay-chainspec.json \
--port 30333 \
--rpc-port 9944
--validator
: Option to start a validator node.--base_path
: Specifies the location where chain data is stored.--chain
: Path to the raw chain spec file.--port, --rpc-port
: Specifies the ports for communication with the chain.Ensure that the same ports are not used by other nodes on the local computer.
After starting the node, you should see logs similar to the following:
2023-11-16 18:05:43 bclabs InfraBlockchain 2023-11-16 18:05:43 ✌️ version 1.1.0-e146a06602e 2023-11-16 18:05:43 ❤️ by blockchain labs, 2017-2023 2023-11-16 18:05:43 📋 Chain specification: Infra Relay Devnet 2023-11-16 18:05:43 🏷 Node name: Alice 2023-11-16 18:05:43 👤 Role: AUTHORITY 2023-11-16 18:05:43 💾 Database: RocksDb at /tmp/relay/alice/chains/infra_relay_devnet/db/full 2023-11-16 18:05:44 BEEFY is still experimental, usage on Polkadot network is discouraged. 2023-11-16 18:05:45 👶 Creating empty BABE epoch changes on what appears to be first startup. 2023-11-16 18:05:45 🏷 Local node identity is: 12D3KooWBJyq6nyn6JJSmdy5QmemYBCofKvWh6w5Am6p33tYzxu1 ...
Record the
peerid
for thealice
node so that other nodes can connect:🏷 Local node identity is: 12D3KooWBJyq6nyn6JJSmdy5QmemYBCofKvWh6w5Am6p33tYzxu1
Open a new terminal and start the second validator node for the
bob
account:./target/release/infra-relaychain \ --bob \ --validator \ --base-path /tmp/relay/bob \ --chain ./raw-infra-relay-chainspec.json \ --port 30334 \ --rpc-port 9945
The command used to start the first node is similar to the one used for starting the second node, but there are some important differences..
Use a command similar to the one used for the first node, but with a different base path (
/tmp/relay/bob
), validator key (--bob
), and ports (30334 and 9945).Since both validators are running on the same local computer, there is no need to specify the IP address and peer identifier of the first node as specified in the chain spec file. The
bootnodes
option is necessary when connecting to nodes running outside the local network or nodes not identified in the chain spec file.If the relay chain is not producing blocks, try disabling the firewall or start the node with the address of the
alice
node in the--bootnodes
option:Example,
./target/release/infra-relaychain \ --bob \ --validator \ --base-path /tmp/relay/bob \ --chain ./raw-infra-relay-chainspec.json \ --port 30334 \ --rpc-port 9945 --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWGjsmVmZCM1jPtVNp6hRbbkGBK3LADYNniJAKJ19NUYiq
Once the
bob
node is started, you can confirm that blocks are being generated.2023-11-16 18:08:57 discovered: 12D3KooWP2vgMARpeD9H5innUPaBR7LFQqJSP6dX4TRS9DtkqsBQ /ip4/172.16.72.194/tcp/30334 2023-11-16 18:09:00 💤 Idle (1 peers), best: #0 (0xe521…3cca), finalized #0 (0xe521…3cca), ⬇ 1.5kiB/s ⬆ 1.5kiB/s 2023-11-16 18:09:05 💤 Idle (1 peers), best: #0 (0xe521…3cca), finalized #0 (0xe521…3cca), ⬇ 0.2kiB/s ⬆ 0.2kiB/s 2023-11-16 18:09:10 💤 Idle (1 peers), best: #0 (0xe521…3cca), finalized #0 (0xe521…3cca), ⬇ 0 ⬆ 0 2023-11-16 18:09:12 🙌 Starting consensus session on top of parent 0xe5212b368879d4a38e84693a0f1582402ac100948a895217823de534cf753cca 🎁 Prepared block for proposing at 1 (2 ms) [hash: 0x2a02735687bb7ec53f34e17424a313b8b05ecce8ac855216dfae3c254980efdc; parent_hash: 0xe521…3cca; extrinsics (2): [0x62c3…6593, 0xf265…0515]
Next Steps
Last updated