Test Runtime Upgrades

How to test upgrades depending on a runtime upgrade not yet executed.

Overview

A scenario that frequently occurs is that we need to test a Snowbridge-related runtime upgrade that depends on a system parachain upgrade. Runtime upgrades for system parachains can take up to four weeks to execute. If we wait for the system parachain upgrade to complete first before initiating the Snowbridge upgrades, release cycles could take months.

Therefore, it is useful to be able to test system parachain upgrades that have not yet executed and then apply Snowbridge upgrades to ensure everything works.

Steps

In the following scenario, we will simulate execution of the 1.2.0 upgrade: https://github.com/polkadot-fellows/runtimes/releases/tag/v1.2.0.

  1. Install opengov-cli

  2. Build the preimage for the upgrade:

opengov-cli build-upgrade --network polkadot --relay-version 1.2.0 --filename preimage.hex
  1. Convert the preimage from hex to binary

cd upgrade-polkadot-1.2.0 
xxd -r -p preimage.hex > preimage.bin
  1. Determine the size of the of preimage, save as PREIMAGE_SIZE

On Linux:

$ stat -c%s preimage.bin
1567371
$ export PREIMAGE_SIZE=1567371

On Mac:

  1. Compute blake2-256 hash of preimage, save as PREIMAGE_HASH

  1. Prepend compact-encoded length prefix to preimage, and convert back to hex, save as PREIMAGE_WITH_LENGTH_PREFIX:

  1. Create a chopsticks configuration file for the Polkadot relay chain, substituting the values generated previously:

polkadot.yml

  1. Use these Chopstics config files for AssetHub and BridgeHub

polkadot-asset-hub.yml

polkadot-bridge-hub.yml

  1. Run Chopsticks

A verification step that can be performed to see if the preimage has been added successfully is to check the preimage storage in the chain state. The authorized preimage should be in the list of added preimages.

  1. Execute the upgrade on the relay chain using Polkadot-JS:

  1. Advance a few blocks on the relay chain

  1. Advance by one block on bridgehub (not sure if necessary, need to experiment)

  1. Now that the upgrade has been authorized on BridgeHub, we can execute the upgrade by calling parachainSystem.enactAuthorizedUpgrade, passing the parachain WASM blob previously generated by opengov-cli:

  1. Advance a few blocks on both bridgehub AND the relay chain

  1. The parachain should now be upgraded.

Caveats

Some polkadot API endpoints aggressively timeout connections, causing Chopsticks to die: Comment

The usual remedy is to restart chopsticks and pray the API connections don't die again.

Last updated