Replace parachain/parathread boolean by enum (#6198)

* Replace parachain/parathread boolean by enum

* Address PR comments

* Update dependencies

* ParaType -> ParaKind

* Swap enum field order to avoid migration

* Rename paratype field to parakind

* Manual en-/decocing of Parakind

* Manual TypeInfo for ParaKind

* rename field back to parachain

* minor

* Update runtime/parachains/src/paras/mod.rs

Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com>

* Manual serde Serialize and Deserialize for ParaKind

* cargo fmt

* Update runtime/parachains/src/paras/mod.rs

Co-authored-by: Andronik <write@reusable.software>

* Add test for serde_json encoding/decoding

* Move serde_json dep to dev-deps

Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com>
Co-authored-by: Andronik <write@reusable.software>
This commit is contained in:
alexgparity
2022-11-01 18:34:16 +01:00
committed by GitHub
parent be70e4456c
commit 6d83525b50
13 changed files with 240 additions and 101 deletions
@@ -140,7 +140,7 @@ where
&mut parachains,
id,
&ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: HeadData(vec![1, 2, 3, 4]),
validation_code: old_validation_code,
},
@@ -159,7 +159,7 @@ where
let r = Pallet::<T>::schedule_para_initialize(
id,
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: HeadData(vec![1, 2, 3, 4]),
validation_code: validation_code(),
},
+77 -8
View File
@@ -115,7 +115,7 @@ use primitives::v2::{
ConsensusLog, HeadData, Id as ParaId, PvfCheckStatement, SessionIndex, UpgradeGoAhead,
UpgradeRestriction, ValidationCode, ValidationCodeHash, ValidatorSignature,
};
use scale_info::TypeInfo;
use scale_info::{Type, TypeInfo};
use sp_core::RuntimeDebug;
use sp_runtime::{
traits::{AppVerify, One, Saturating},
@@ -291,8 +291,76 @@ pub struct ParaGenesisArgs {
pub genesis_head: HeadData,
/// The initial validation code to use.
pub validation_code: ValidationCode,
/// True if parachain, false if parathread.
pub parachain: bool,
/// Parachain or Parathread.
#[cfg_attr(feature = "std", serde(rename = "parachain"))]
pub para_kind: ParaKind,
}
/// Distinguishes between Parachain and Parathread
#[derive(PartialEq, Eq, Clone, RuntimeDebug)]
pub enum ParaKind {
Parathread,
Parachain,
}
#[cfg(feature = "std")]
impl Serialize for ParaKind {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self {
ParaKind::Parachain => serializer.serialize_bool(true),
ParaKind::Parathread => serializer.serialize_bool(false),
}
}
}
#[cfg(feature = "std")]
impl<'de> Deserialize<'de> for ParaKind {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
match serde::de::Deserialize::deserialize(deserializer) {
Ok(true) => Ok(ParaKind::Parachain),
Ok(false) => Ok(ParaKind::Parathread),
_ => Err(serde::de::Error::custom("invalid ParaKind serde representation")),
}
}
}
// Manual encoding, decoding, and TypeInfo as the parakind field in ParaGenesisArgs used to be a bool
impl Encode for ParaKind {
fn size_hint(&self) -> usize {
true.size_hint()
}
fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
match self {
ParaKind::Parachain => true.using_encoded(f),
ParaKind::Parathread => false.using_encoded(f),
}
}
}
impl Decode for ParaKind {
fn decode<I: parity_scale_codec::Input>(
input: &mut I,
) -> Result<Self, parity_scale_codec::Error> {
match bool::decode(input) {
Ok(true) => Ok(ParaKind::Parachain),
Ok(false) => Ok(ParaKind::Parathread),
_ => Err("Invalid ParaKind representation".into()),
}
}
}
impl TypeInfo for ParaKind {
type Identity = bool;
fn type_info() -> Type {
bool::type_info()
}
}
/// This enum describes a reason why a particular PVF pre-checking vote was initiated. When the
@@ -2021,11 +2089,12 @@ impl<T: Config> Pallet<T> {
id: ParaId,
genesis_data: &ParaGenesisArgs,
) {
if genesis_data.parachain {
parachains.add(id);
ParaLifecycles::<T>::insert(&id, ParaLifecycle::Parachain);
} else {
ParaLifecycles::<T>::insert(&id, ParaLifecycle::Parathread);
match genesis_data.para_kind {
ParaKind::Parachain => {
parachains.add(id);
ParaLifecycles::<T>::insert(&id, ParaLifecycle::Parachain);
},
ParaKind::Parathread => ParaLifecycles::<T>::insert(&id, ParaLifecycle::Parathread),
}
// HACK: see the notice in `schedule_para_initialize`.
+61 -23
View File
@@ -222,7 +222,7 @@ fn schedule_para_init_rejects_empty_code() {
Paras::schedule_para_initialize(
1000.into(),
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: dummy_head_data(),
validation_code: ValidationCode(vec![]),
}
@@ -233,7 +233,7 @@ fn schedule_para_init_rejects_empty_code() {
assert_ok!(Paras::schedule_para_initialize(
1000.into(),
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: dummy_head_data(),
validation_code: ValidationCode(vec![1]),
}
@@ -248,7 +248,7 @@ fn para_past_code_pruning_in_initialize() {
(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: dummy_validation_code(),
},
@@ -256,7 +256,7 @@ fn para_past_code_pruning_in_initialize() {
(
1u32.into(),
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: dummy_head_data(),
validation_code: dummy_validation_code(),
},
@@ -316,7 +316,7 @@ fn note_new_head_sets_head() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: dummy_validation_code(),
},
@@ -349,7 +349,7 @@ fn note_past_code_sets_up_pruning_correctly() {
(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: dummy_validation_code(),
},
@@ -357,7 +357,7 @@ fn note_past_code_sets_up_pruning_correctly() {
(
1u32.into(),
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: dummy_head_data(),
validation_code: dummy_validation_code(),
},
@@ -402,7 +402,7 @@ fn code_upgrade_applied_after_delay() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: original_code.clone(),
},
@@ -505,7 +505,7 @@ fn code_upgrade_applied_after_delay_even_when_late() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: original_code.clone(),
},
@@ -590,7 +590,7 @@ fn submit_code_change_when_not_allowed_is_err() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: vec![1, 2, 3].into(),
},
@@ -658,7 +658,7 @@ fn upgrade_restriction_elapsed_doesnt_mean_can_upgrade() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: vec![1, 2, 3].into(),
},
@@ -721,7 +721,7 @@ fn full_parachain_cleanup_storage() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: original_code.clone(),
},
@@ -827,7 +827,7 @@ fn cannot_offboard_ongoing_pvf_check() {
let paras = vec![(
para_id,
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: Default::default(),
validation_code: existing_code,
},
@@ -900,7 +900,7 @@ fn para_incoming_at_session() {
assert_ok!(Paras::schedule_para_initialize(
b,
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: vec![1].into(),
validation_code: code_b.clone(),
},
@@ -909,7 +909,7 @@ fn para_incoming_at_session() {
assert_ok!(Paras::schedule_para_initialize(
a,
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: vec![2].into(),
validation_code: code_a.clone(),
},
@@ -918,7 +918,7 @@ fn para_incoming_at_session() {
assert_ok!(Paras::schedule_para_initialize(
c,
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: vec![3].into(),
validation_code: code_c.clone(),
},
@@ -994,7 +994,7 @@ fn code_hash_at_returns_up_to_end_of_code_retention_period() {
let paras = vec![(
0u32.into(),
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: dummy_head_data(),
validation_code: vec![1, 2, 3].into(),
},
@@ -1084,7 +1084,7 @@ fn pvf_check_coalescing_onboarding_and_upgrade() {
let paras = vec![(
a,
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: Default::default(),
validation_code: existing_code,
},
@@ -1117,7 +1117,7 @@ fn pvf_check_coalescing_onboarding_and_upgrade() {
assert_ok!(Paras::schedule_para_initialize(
b,
ParaGenesisArgs {
parachain: true,
para_kind: ParaKind::Parachain,
genesis_head: vec![2].into(),
validation_code: validation_code.clone(),
},
@@ -1185,7 +1185,7 @@ fn pvf_check_onboarding_reject_on_expiry() {
assert_ok!(Paras::schedule_para_initialize(
a,
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: vec![2].into(),
validation_code: validation_code.clone(),
},
@@ -1224,7 +1224,7 @@ fn pvf_check_upgrade_reject() {
let paras = vec![(
a,
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: Default::default(),
validation_code: old_code,
},
@@ -1359,7 +1359,7 @@ fn pvf_check_submit_vote() {
assert_ok!(Paras::schedule_para_initialize(
1000.into(),
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: vec![2].into(),
validation_code: code_a.clone(),
},
@@ -1446,7 +1446,7 @@ fn include_pvf_check_statement_refunds_weight() {
let paras = vec![(
a,
ParaGenesisArgs {
parachain: false,
para_kind: ParaKind::Parathread,
genesis_head: Default::default(),
validation_code: old_code,
},
@@ -1723,3 +1723,41 @@ fn verify_upgrade_restriction_signal_is_externally_accessible() {
);
});
}
#[test]
fn parakind_encodes_decodes_to_bool_scale() {
let chain_kind = ParaKind::Parachain.encode();
let chain_bool = true.encode();
assert_eq!(chain_kind, chain_bool);
let chain_dec = ParaKind::decode(&mut chain_kind.as_slice());
assert_eq!(chain_dec, Ok(ParaKind::Parachain));
let thread_kind = ParaKind::Parathread.encode();
let thread_bool = false.encode();
assert_eq!(thread_kind, thread_bool);
let thread_dec = ParaKind::decode(&mut thread_kind.as_slice());
assert_eq!(thread_dec, Ok(ParaKind::Parathread));
assert_eq!(bool::type_info(), ParaKind::type_info());
}
#[test]
fn parakind_encodes_decodes_to_bool_serde() {
let chain = ParaKind::Parachain;
let ser_chain = serde_json::to_string(&ParaKind::Parachain).unwrap();
let de_chain: ParaKind = serde_json::from_str(&ser_chain).unwrap();
assert_eq!(chain, de_chain);
let ser_true = serde_json::to_string(&true).unwrap();
assert_eq!(ser_true, ser_chain);
let thread = ParaKind::Parathread;
let ser_thread = serde_json::to_string(&thread).unwrap();
let de_thread: ParaKind = serde_json::from_str(&ser_thread).unwrap();
assert_eq!(thread, de_thread);
let ser_false = serde_json::to_string(&false).unwrap();
assert_eq!(ser_false, ser_thread);
}