I am updating the Substrate node from v2.0.1 to v3.0.0 in live network*.
The initial plan was to merge the v3 code by following the official guidelines, build the new wasm and use a forkless runtime upgrade to deliver it to all nodes in the network. But with this approach the following error appears on nodes: WARN Cannot create a runtime: Instantiation(“Instantiation: Export ext_default_child_storage_storage_kill_version_2 not found”)
. After research, I found that clients should be updated first.
I've started experiments around the clients' updates. I've up a cluster with 7 validator nodes on v2.0.1 and started 1 by 1 update clients to v3.0.0. The result is the following:
- Updated Node-1. The network is producing and finalizing blocks. Node-1 is not finalizing blocks but sometimes producing them.
- Updated Node-2. The same behaviour as after the Node-1 update.
- Updated Node-3. The network is producing blocks. The network is not finalizing blocks. Node-3 is sometimes producing blocks. The reason for the finalization stop looks clear - less than 2/3 of nodes are finalizing blocks.
- Updated Node-4. The same behaviour as after the Node-3 update.
- Updated Node-5. The network is producing blocks. Network finalization recovered and now is working as expected.
- Delivered the v3.0.0 with a forkless upgrade. It applied successfully to the nodes with updated clients (1-5).
Questions:
- Is it the correct way to update the clients in the live network*?
- Is it any way to avoid stopping finalization in the live network* during clients update?
* A live network is a network with 50+ validators.