Skip to content
  • Daan van der Plas's avatar
    fix: GoAhead signal only set when runtime upgrade is enacted from parachain side (#1176) · 91c4360c
    Daan van der Plas authored
    The runtime code of a parachain can be replaced on the relay-chain via:
    
    [cumulus]:
    [enact_authorized_upgrade](https://github.com/paritytech/polkadot-sdk/blob/1a38d6d6/cumulus/pallets/parachain-system/src/lib.rs#L661);
    this is used for a runtime upgrade when a parachain is not bricked.
    
    [polkadot] (these are used when a parachain is bricked):
    -
    [force_set_current_code](https://github.com/paritytech/polkadot-sdk/blob/1a38d6d6/polkadot/runtime/parachains/src/paras/mod.rs#L823):
    immediately changes the runtime code of a given para without a pvf check
    (root).
    -
    [force_schedule_code_upgrade](https://github.com/paritytech/polkadot-sdk/blob/1a38d6d6/polkadot/runtime/parachains/src/paras/mod.rs#L864):
    schedules a change to the runtime code of a given para including a pvf
    check of the new code (root).
    -
    [schedule_code_upgrade](https://github.com/paritytech/polkadot-sdk/blob/1a38d6d6/polkadot/runtime/common/src/paras_registrar.rs#L395):
    schedules a change to the runtime code of a given para including a pvf
    check of the new code. Besides root, the parachain or parachain manager
    can call this extrinsic given that the parachain is unlocked.
    
    Polkadot signals a parachain to be ready for a runtime upgrade through
    the
    [GoAhead](https://github.com/paritytech/polkadot-sdk/blob/e4949344
    
    /polkadot/primitives/src/v5/mod.rs#L1229)
    signal.
    
    When in cumulus `enact_authorized_upgrade` is executed, the same
    underlying helper function of `force_schedule_code_upgrade` &
    `schedule_code_upgrade`:
    [schedule_code_upgrade](https://github.com/paritytech/polkadot/blob/09b61286da11921a3dda0a8e4015ceb9ef9cffca/runtime/parachains/src/paras/mod.rs#L1778),
    is called on the relay-chain, which sets the `GoAhead` signal (if the
    pvf is accepted).
    
    If Cumulus receives the `GoAhead` signal from polkadot without having
    the `PendingValidationCode` ready, it will panic
    ([ref](https://github.com/paritytech/polkadot/pull/7412)). For
    `enact_authorized_upgrade` we know for sure the `PendingValidationCode`
    is set. On the contrary, for `force_schedule_code_upgrade` &
    `schedule_code_upgrade` this is not the case.
    
    This PR includes a flag such that the `GoAhead` signal will only be set
    when a runtime upgrade is enacted by the parachain
    (`enact_authorized_upgrade`).
    
    additional info: https://github.com/paritytech/polkadot/pull/7412
    
    Closes #641
    
    ---------
    
    Co-authored-by: default avatarBastian Köcher <[email protected]>
    Co-authored-by: default avatarBastian Köcher <[email protected]>
    91c4360c