Fix `state_subscribeRuntimeVersion` for parachains (#9617)
The old implementation was listening for storage changes and every time a block changed the `CODE` storage field, it checked if the runtime version changed. It used the best block to compare against the latest known runtime version. It could happen that you processed the storage notification of block Y and checked the runtime version of block X (the current best block). This is also what happened on parachains. Parachains import blocks and set the new best block in a later step. This means we imported the block that changed the code, got notified and checked the runtime version of the current best block (which would still be the parent of the block that changed the runtime). As the parent did not changed the runtime, the runtime version also did not changed and we never notified the subscribers. The new implementation now switches to listen for best imported blocks. Every time we import a new best block, we check its runtime version against the latest known runtime version. As we also send a notification when the parachains sets a block as new best block, we will trigger this code path correctly. It moves some computation from checking if the key was modified to getting the runtime version. As fetching the runtime version is a rather common pattern, it should not make any big difference performancewise.
parent
f92e5c5e
Please register or sign in to comment