Verify a Wasm binary
The subwasm tool provides a way to expose the features of the runtime for any Substrate chain. This guide shows you how to use Subwasm to do the following:
- Get a snapshot of the modules in a runtime.
- Expose verifiable historical information of a chain's runtime for front end applications.
- Check for changes between two runtimes using a diff.
Before you begin
Make sure you have the following:
- The latest release of Subwasm installed.
- A chain running locally that is executing the runtime you wish to examine.
- JQ installed in your environment to enable filtering the metadata.
Get information about a runtime of a local chain
Launch a local node from inside your chain's directory. This example launches a node template in dev mode.
./target/release/node-template --tmp --dev
In a new terminal, create a temporary folder called
Inside the new folder, use Subwasm to get and save the Wasm of your local chain.
cd TempWasms subwasm get --chain local -o mychain.wasm
-oflag will save the Wasm file to
Run the following command to save your chain's metadata to a JSON file:
subwasm --json meta mychain.wasm | jq 'del( .. | .documentation? )' > mychain-metadata.json
You can use JQ to filter the metadata details from the
subwasm --json meta mychain.wasmcommand. This example ignores all documentation metadata. For information about the metadata fields that a Substrate chain exposes, see the documentation on Substrate Metadata.
- After you have saved the metadata in a JSON file, you can use it in a front-end application.
Compare two different runtimes of a live chain
You can also use Subwasm to compare the runtimes of a chain at different blocks. Subwasm uses a function that takes the URL of common Substrate chains such as Polkadot, Kusama and Westend, and returns the node's endpoint. The following example compares the Polkadot runtime at block 500,000 with its latest runtime.
Go to a block explorer and retrieve the block hash for the runtime you want to compare against.
For example, go to PolkadotJS Apps and retrieve the block hash at block 500000.
Save the Wasm blob of a previous state.
BLOCK_HASH=0xfdeab19649426aadbdab046c9b5dac0a5b0c850b8fd0927e3b4e6c896d5fb0b7 subwasm get --chain polkadot --block $BLOCK_HASH -o polkadot-500000.wasm
Get the latest Wasm blob of the runtime.
subwasm get --chain polkadot -o polkadot-latest.wasm
Compare the two runtimes and put the output into a JSON file.
subwasm diff polkadot-latest.wasm polkadot-500000.wasm --json > polkadot-wasm-diff.json
There are many use cases for
subwasm as outlined above.
Some additional examples include:
- Compressing and decompressing a Wasm file.
- Inspecting a Wasm file to verify a runtime upgrade in governance.