diff --git a/lee/state_machine/src/merkle_tree/mod.rs b/lee/state_machine/src/merkle_tree/mod.rs index ee8106c5..37e706f7 100644 --- a/lee/state_machine/src/merkle_tree/mod.rs +++ b/lee/state_machine/src/merkle_tree/mod.rs @@ -8,8 +8,8 @@ mod default_values; type Value = [u8; 32]; type Node = [u8; 32]; -#[cfg_attr(test, derive(Debug, PartialEq, Eq))] -#[derive(Clone, BorshSerialize, BorshDeserialize)] +#[cfg_attr(test, derive(Debug))] +#[derive(Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)] pub struct MerkleTree { nodes: Vec, capacity: usize, diff --git a/lee/state_machine/src/state/mod.rs b/lee/state_machine/src/state/mod.rs index 97a77978..612b2b84 100644 --- a/lee/state_machine/src/state/mod.rs +++ b/lee/state_machine/src/state/mod.rs @@ -20,8 +20,8 @@ use crate::{ pub const MAX_NUMBER_CHAINED_CALLS: usize = 10; -#[derive(Clone, BorshSerialize, BorshDeserialize)] -#[cfg_attr(test, derive(Debug, PartialEq, Eq))] +#[derive(Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)] +#[cfg_attr(test, derive(Debug))] pub struct CommitmentSet { merkle_tree: MerkleTree, commitments: HashMap, @@ -67,8 +67,8 @@ impl CommitmentSet { } } -#[cfg_attr(test, derive(Debug, PartialEq, Eq))] -#[derive(Clone)] +#[cfg_attr(test, derive(Debug))] +#[derive(Clone, PartialEq, Eq)] struct NullifierSet(BTreeSet); impl NullifierSet { @@ -109,8 +109,8 @@ impl BorshDeserialize for NullifierSet { } } -#[derive(Clone, BorshSerialize, BorshDeserialize)] -#[cfg_attr(test, derive(Debug, PartialEq, Eq))] +#[derive(Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)] +#[cfg_attr(test, derive(Debug))] pub struct V03State { public_state: HashMap, private_state: (CommitmentSet, NullifierSet), diff --git a/lez/sequencer/core/src/lib.rs b/lez/sequencer/core/src/lib.rs index 64a3ff3a..488f70dd 100644 --- a/lez/sequencer/core/src/lib.rs +++ b/lez/sequencer/core/src/lib.rs @@ -177,12 +177,10 @@ impl SequencerCore { }); } - // The replayed head must reproduce the persisted state byte-for-byte, - // else store and config disagree (e.g. edited genesis actions). - let replayed = borsh::to_vec(chain.head_state()).expect("state serializes"); - let stored = borsh::to_vec(stored_head_state).expect("state serializes"); - assert_eq!( - replayed, stored, + // The replayed head must reproduce the persisted state, else store + // and config disagree (e.g. edited genesis actions). + assert!( + chain.head_state() == stored_head_state, "Persisted state does not match the replayed chain; reset the store or restore the original config" );