This script allows bootstrapping a new substrate chain with the current state of a live chain. Using this, you can create a fork of Polkadot, Kusama and other substrate chain for development purposes.
Clone this repository and install dependencies
git clone https://github.com/maxsam4/fork-off-substrate.git
cd fork-off-substrate
npm i
Create a folder called data
inside the top folder (fork-off-substrate
).
mkdir data
Copy the executable/binary of your substrate based node inside the data folder and rename it to binary
.
Copy the runtime WASM blob of your substrate based blockchain to the data folder and rename it to runtime.wasm
. To get the WASM blob, compile your blockchain and look for ./target/release/wbuild/runtime/runtime.compact.wasm
. If you are forking Polkadot/Kusama/Westend, you can download the WASM blobs from Polkadot's release page.
If your substrate chain uses additional custom types than what are available in polkadot.js, define them in a JSON file of format { "types": { <YOUR_TYPES> } }
. Copy the file to the data
folder and rename it to schema.json
.
Either run a full node for your blockchain locally(Recommended) or have an external endpoint handy.
Run the script
If using a local node, simply run the script using
npm start
If you are using an external/non-default endpoint, you need to provide it to the script via the HTTP_RPC_ENDPOINT
environment variable
HTTP_RPC_ENDPOINT=https://example.com npm start
You should have the genesis file for the forked chain inside the data
folder. It will be called fork.json
.
You can now run a new chain using this genesis file
./binary --chain fork.json --alice
The script can be tweaked and configured using various environment variables -
Environment Variable | Effects | Default value |
---|---|---|
HTTP_RPC_ENDPOINT | HTTP RPC endpoint that should be used to query state | http://localhost:9933 |
FORK_CHUNKS_LEVEL | Determines how many chunks to split the RPC download in. Effect is exponential, recommended value for most is 1. You can try 0 for small chains and 2 for large chains for potential speed improvements | 1 |
ORIG_CHAIN | Chain to use as the original chain. | $default_of_the_binary |
FORK_CHAIN | Chain to use as base for the forked chain. | dev |
ALICE | If set, the script will replace the chain's sudo account with //Alice |
NULL |
QUICK_MODE | If set, it parallelizes the data download from the RPC endpoint | NULL |
If you would like to understand how this script works, please read this blog post
docker build -t fork-off-substrate .
BINARY=/full/path/to/your/linux/binary
HTTP_RPC_ENDPOINT=http://localhost:9933
docker run --rm -it \
-e HTTP_RPC_ENDPOINT=$HTTP_RPC_ENDPOINT \
-v "$BINARY":/data/binary
fork-off-substrate
This script is based on a script shared in the substrate riot channel