From 2679c60005a96e0c603c0d19dbe10b3153e0c64e Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 11 Oct 2024 14:24:18 +0000 Subject: [PATCH] add assertion for post/pre image col --- crates/specs/src/brtable.rs | 8 ++++---- .../specs/src/external_host_call_table/mod.rs | 4 ++-- crates/specs/src/imtable.rs | 4 ++-- crates/specs/src/itable.rs | 4 ++-- crates/specs/src/jtable.rs | 10 +++++----- crates/specs/src/slice.rs | 4 ++-- crates/specs/src/state.rs | 15 +++++++++++++++ crates/zkwasm/src/loader/slice.rs | 19 +++++++++++++++++++ 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/crates/specs/src/brtable.rs b/crates/specs/src/brtable.rs index fe26cb7e0..df347ba51 100644 --- a/crates/specs/src/brtable.rs +++ b/crates/specs/src/brtable.rs @@ -1,7 +1,7 @@ use serde::Deserialize; use serde::Serialize; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct BrTableEntry { pub fid: u32, pub iid: u32, @@ -11,7 +11,7 @@ pub struct BrTableEntry { pub dst_pc: u32, } -#[derive(Serialize, Deserialize, Debug, Clone, Default)] +#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq)] pub struct BrTable(Vec); impl BrTable { @@ -24,7 +24,7 @@ impl BrTable { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct ElemEntry { pub table_idx: u32, pub type_idx: u32, @@ -32,7 +32,7 @@ pub struct ElemEntry { pub func_idx: u32, } -#[derive(Debug, Default, Serialize, Deserialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq)] pub struct ElemTable(Vec); impl ElemTable { diff --git a/crates/specs/src/external_host_call_table/mod.rs b/crates/specs/src/external_host_call_table/mod.rs index 1761ec53e..ff4124813 100644 --- a/crates/specs/src/external_host_call_table/mod.rs +++ b/crates/specs/src/external_host_call_table/mod.rs @@ -39,14 +39,14 @@ impl From for Signature { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, PartialEq)] pub struct ExternalHostCallEntry { pub op: usize, pub value: u64, pub is_ret: bool, } -#[derive(Default, Serialize, Deserialize)] +#[derive(Default, Serialize, Deserialize, PartialEq)] pub struct ExternalHostCallTable(pub(crate) Vec); impl ExternalHostCallTable { diff --git a/crates/specs/src/imtable.rs b/crates/specs/src/imtable.rs index 91d3be932..87c2915c5 100644 --- a/crates/specs/src/imtable.rs +++ b/crates/specs/src/imtable.rs @@ -5,7 +5,7 @@ use crate::mtable::VarType; use serde::Deserialize; use serde::Serialize; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct InitMemoryTableEntry { pub ltype: LocationType, pub is_mutable: bool, @@ -16,7 +16,7 @@ pub struct InitMemoryTableEntry { pub eid: u32, } -#[derive(Default, Debug, Serialize, Deserialize)] +#[derive(Default, Debug, Serialize, Deserialize, PartialEq)] pub struct InitMemoryTable(pub HashMap<(LocationType, u32), InitMemoryTableEntry>); impl InitMemoryTable { diff --git a/crates/specs/src/itable.rs b/crates/specs/src/itable.rs index a4ae73e8d..776f4c071 100644 --- a/crates/specs/src/itable.rs +++ b/crates/specs/src/itable.rs @@ -590,7 +590,7 @@ impl From<&Opcode> for OpcodeClassPlain { } } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct InstructionTableEntry { pub fid: u32, // pub function_name: String, @@ -648,7 +648,7 @@ impl InstructionTableInternal { } // Use Option because iid may be discontinuous -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)] pub struct InstructionTable(Arc>>>); impl InstructionTable { diff --git a/crates/specs/src/jtable.rs b/crates/specs/src/jtable.rs index 3cfb67d3e..3e0a8268f 100644 --- a/crates/specs/src/jtable.rs +++ b/crates/specs/src/jtable.rs @@ -21,7 +21,7 @@ pub const INHERITED_FRAME_TABLE_ENTRIES: usize = 4096; const JSON: bool = false; -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct FrameTableEntryInternal { // caller eid (unique) pub frame_id: u32, @@ -32,7 +32,7 @@ pub struct FrameTableEntryInternal { pub returned: bool, } -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct InheritedFrameTableEntry(pub Option); #[derive(Serialize, Deserialize, Clone, Debug)] @@ -44,7 +44,7 @@ impl From> for InheritedFrameEntries { } } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub struct InheritedFrameTable(pub Box<[InheritedFrameTableEntry; INHERITED_FRAME_TABLE_ENTRIES]>); impl Default for InheritedFrameTable { @@ -140,10 +140,10 @@ impl InheritedFrameTable { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] pub struct CalledFrameTableEntry(pub FrameTableEntryInternal); -#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct CalledFrameTable(Vec); impl CalledFrameTable { diff --git a/crates/specs/src/slice.rs b/crates/specs/src/slice.rs index 479f352d6..00fb8c402 100644 --- a/crates/specs/src/slice.rs +++ b/crates/specs/src/slice.rs @@ -26,7 +26,7 @@ use crate::mtable::MemoryTableEntry; use crate::state::InitializationState; use crate::CompilationTable; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] pub struct FrameTableSlice { pub inherited: Arc, pub called: CalledFrameTable, @@ -57,7 +57,7 @@ impl FrameTableSlice { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Clone)] pub struct Slice { pub itable: Arc, pub br_table: Arc, diff --git a/crates/specs/src/state.rs b/crates/specs/src/state.rs index 835052a2b..ac46d991f 100644 --- a/crates/specs/src/state.rs +++ b/crates/specs/src/state.rs @@ -17,6 +17,21 @@ pub struct InitializationState { pub maximal_memory_pages: T, } +impl PartialEq for InitializationState { + fn eq(&self, other: &Self) -> bool { + self.eid == other.eid + && self.fid == other.fid + && self.iid == other.iid + && self.frame_id == other.frame_id + && self.sp == other.sp + && self.host_public_inputs == other.host_public_inputs + && self.context_in_index == other.context_in_index + && self.context_out_index == other.context_out_index + && self.initial_memory_pages == other.initial_memory_pages + && self.maximal_memory_pages == other.maximal_memory_pages + } +} + impl InitializationState { // TODO: try to remove the magic number pub fn field_count() -> usize { diff --git a/crates/zkwasm/src/loader/slice.rs b/crates/zkwasm/src/loader/slice.rs index cb2b6827f..e010f8d3d 100644 --- a/crates/zkwasm/src/loader/slice.rs +++ b/crates/zkwasm/src/loader/slice.rs @@ -144,6 +144,8 @@ pub struct ZkWasmCircuitIter { initialization_state: Arc>, slices: Peekable>, + last_slice: Option, + mark: PhantomData, } @@ -166,6 +168,7 @@ impl IntoIterator for Slices { imtable: self.imtable, initialization_state: self.initialization_state, slices: SlicesWrap(self.slices).into_iter().peekable(), + last_slice: None, mark: PhantomData, } } @@ -275,6 +278,22 @@ impl Iterator for ZkWasmCircuitIter { is_last_slice: self.slices.peek().is_none(), }; + if let Some(last_slice) = self.last_slice.take() { + assert_eq!(last_slice.itable, slice.itable,); + assert_eq!(last_slice.br_table, slice.br_table,); + assert_eq!(last_slice.elem_table, slice.elem_table,); + assert_eq!( + last_slice.post_inherited_frame_table, + slice.frame_table.inherited, + ); + assert_eq!( + last_slice.post_initialization_state, + slice.initialization_state, + ); + assert_eq!(last_slice.post_imtable, slice.imtable,); + }; + self.last_slice = Some(slice.clone()); + self.imtable = post_imtable; self.initialization_state = post_initialization_state;