From 8dff730939a35d7669055656b3ce1d79f9a3925c Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Tue, 18 Jan 2022 12:57:05 +0800 Subject: [PATCH 1/7] init --- zkevm-circuits/src/evm_circuit/table.rs | 2 +- .../evm_circuit/util/constraint_builder.rs | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/table.rs b/zkevm-circuits/src/evm_circuit/table.rs index 825155fd88..e468d5e8d4 100644 --- a/zkevm-circuits/src/evm_circuit/table.rs +++ b/zkevm-circuits/src/evm_circuit/table.rs @@ -237,7 +237,7 @@ pub(crate) enum Lookup { /// all tags. tag: Expression, /// Values corresponding to the tag. - values: [Expression; 5], + values: [Expression; 7], }, /// Lookup to bytecode table, which contains all used creation code and /// contract code. diff --git a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs index aa190bf639..ac37304247 100644 --- a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs +++ b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs @@ -460,7 +460,7 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { counter: Expression, is_write: Expression, tag: RwTableTag, - values: [Expression; 5], + values: [Expression; 7], ) { self.add_lookup(Lookup::Rw { counter, @@ -476,7 +476,7 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { &mut self, is_write: Expression, tag: RwTableTag, - values: [Expression; 5], + values: [Expression; 7], ) { self.rw_lookup_with_counter( self.curr.state.rw_counter.expr() + self.rw_counter_offset.expr(), @@ -490,7 +490,7 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { fn state_write_with_reversion( &mut self, tag: RwTableTag, - mut values: [Expression; 5], + mut values: [Expression; 7], is_persistent: Expression, rw_counter_end_of_reversion: Expression, ) { @@ -503,6 +503,7 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { + cb.state_write_counter_offset.expr(); // Swap value and value_prev respect to tag match tag { + // TODO: RwTableTag::TxAccessListAccount => values.swap(2, 3), RwTableTag::TxAccessListStorageSlot => values.swap(3, 4), RwTableTag::Account => values.swap(2, 3), @@ -534,7 +535,7 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { self.rw_lookup( true.expr(), RwTableTag::TxAccessListAccount, - [tx_id, account_address, value, value_prev, 0.expr()], + [tx_id, account_address, 0.expr(), value, value_prev, 0.expr(), 0.expr()], ); } @@ -552,9 +553,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ account_address, field_tag.expr(), + 0.expr(), value.clone(), value, 0.expr(), + 0.expr(), ], ); } @@ -572,9 +575,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ account_address, field_tag.expr(), + 0.expr(), value, value_prev, 0.expr(), + 0.expr(), ], ); } @@ -593,9 +598,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ account_address, field_tag.expr(), + 0.expr(), value, value_prev, 0.expr(), + 0.expr(), ], is_persistent, rw_counter_end_of_reversion, @@ -626,9 +633,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ call_id.unwrap_or_else(|| self.curr.state.call_id.expr()), field_tag.expr(), + 0.expr(), value, 0.expr(), 0.expr(), + 0.expr(), ], ); } @@ -661,9 +670,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ self.curr.state.call_id.expr(), self.curr.state.stack_pointer.expr() + stack_pointer_offset, + 0.expr(), value, 0.expr(), 0.expr(), + 0.expr(), ], ); } @@ -682,9 +693,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ self.curr.state.call_id.expr(), memory_address, + 0.expr(), byte, 0.expr(), 0.expr(), + 0.expr(), ], ); } @@ -703,9 +716,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ self.curr.state.call_id.expr(), memory_address, + 0.expr(), byte, 0.expr(), 0.expr(), + 0.expr(), ], ); } From 45a2c196e599f5a31f8d8d9a24e12dd940be3236 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Tue, 18 Jan 2022 15:05:57 +0800 Subject: [PATCH 2/7] cargo fmt --- .../src/evm_circuit/util/constraint_builder.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs index ac37304247..c8a86bac99 100644 --- a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs +++ b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs @@ -535,7 +535,15 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { self.rw_lookup( true.expr(), RwTableTag::TxAccessListAccount, - [tx_id, account_address, 0.expr(), value, value_prev, 0.expr(), 0.expr()], + [ + tx_id, + account_address, + 0.expr(), + value, + value_prev, + 0.expr(), + 0.expr(), + ], ); } From 647703489416a70084c3151d586fa96baf3d9a0e Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Tue, 18 Jan 2022 15:10:46 +0800 Subject: [PATCH 3/7] fix state_write_with_reversion --- zkevm-circuits/src/evm_circuit/util/constraint_builder.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs index c8a86bac99..cc4bf1e8de 100644 --- a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs +++ b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs @@ -503,12 +503,12 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { + cb.state_write_counter_offset.expr(); // Swap value and value_prev respect to tag match tag { - // TODO: - RwTableTag::TxAccessListAccount => values.swap(2, 3), + RwTableTag::TxAccessListAccount => values.swap(3, 4), RwTableTag::TxAccessListStorageSlot => values.swap(3, 4), - RwTableTag::Account => values.swap(2, 3), + RwTableTag::Account => values.swap(3, 4), RwTableTag::AccountStorage => values.swap(3, 4), - RwTableTag::AccountDestructed => values.swap(2, 3), + RwTableTag::AccountDestructed => values.swap(3, 4), + RwTableTag::TxRefund => values.swap(3, 4), _ => {} } From 32684d8320ed8ac8484da110178018bc109c7275 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Tue, 18 Jan 2022 15:52:16 +0800 Subject: [PATCH 4/7] fix table_assignment --- circuit-benchmarks/src/evm_circuit.rs | 2 +- integration-tests/tests/circuits.rs | 4 ++-- zkevm-circuits/src/evm_circuit.rs | 6 +++--- zkevm-circuits/src/evm_circuit/execution.rs | 4 ++-- zkevm-circuits/src/evm_circuit/witness.rs | 12 +++++++++++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/circuit-benchmarks/src/evm_circuit.rs b/circuit-benchmarks/src/evm_circuit.rs index a950d506fc..6ac9c86f8a 100644 --- a/circuit-benchmarks/src/evm_circuit.rs +++ b/circuit-benchmarks/src/evm_circuit.rs @@ -22,7 +22,7 @@ impl Circuit for TestCircuit { fn configure(meta: &mut ConstraintSystem) -> Self::Config { let tx_table = [(); 4].map(|_| meta.advice_column()); - let rw_table = [(); 8].map(|_| meta.advice_column()); + let rw_table = [(); 10].map(|_| meta.advice_column()); let bytecode_table = [(); 4].map(|_| meta.advice_column()); let block_table = [(); 3].map(|_| meta.advice_column()); // Use constant expression to mock constant instance column for a more diff --git a/integration-tests/tests/circuits.rs b/integration-tests/tests/circuits.rs index c46c1c882a..754fca5440 100644 --- a/integration-tests/tests/circuits.rs +++ b/integration-tests/tests/circuits.rs @@ -34,7 +34,7 @@ mod test_evm_circuit { #[derive(Clone)] struct TestCircuitConfig { tx_table: [Column; 4], - rw_table: [Column; 8], + rw_table: [Column; 10], bytecode_table: [Column; 4], evm_circuit: EvmCircuit, } @@ -185,7 +185,7 @@ mod test_evm_circuit { fn configure(meta: &mut ConstraintSystem) -> Self::Config { let tx_table = [(); 4].map(|_| meta.advice_column()); - let rw_table = [(); 8].map(|_| meta.advice_column()); + let rw_table = [(); 10].map(|_| meta.advice_column()); let bytecode_table = [(); 4].map(|_| meta.advice_column()); let block_table = [(); 3].map(|_| meta.advice_column()); diff --git a/zkevm-circuits/src/evm_circuit.rs b/zkevm-circuits/src/evm_circuit.rs index 929fdfec78..267be0ed82 100644 --- a/zkevm-circuits/src/evm_circuit.rs +++ b/zkevm-circuits/src/evm_circuit.rs @@ -34,7 +34,7 @@ impl EvmCircuit { ) -> Self where TxTable: LookupTable, - RwTable: LookupTable, + RwTable: LookupTable, BytecodeTable: LookupTable, BlockTable: LookupTable, { @@ -160,7 +160,7 @@ mod test { #[derive(Clone)] pub(crate) struct TestCircuitConfig { tx_table: [Column; 4], - rw_table: [Column; 8], + rw_table: [Column; 10], bytecode_table: [Column; 4], block_table: [Column; 3], evm_circuit: EvmCircuit, @@ -353,7 +353,7 @@ mod test { fn configure(meta: &mut ConstraintSystem) -> Self::Config { let tx_table = [(); 4].map(|_| meta.advice_column()); - let rw_table = [(); 8].map(|_| meta.advice_column()); + let rw_table = [(); 10].map(|_| meta.advice_column()); let bytecode_table = [(); 4].map(|_| meta.advice_column()); let block_table = [(); 3].map(|_| meta.advice_column()); diff --git a/zkevm-circuits/src/evm_circuit/execution.rs b/zkevm-circuits/src/evm_circuit/execution.rs index 299b82c3d4..4244fdb937 100644 --- a/zkevm-circuits/src/evm_circuit/execution.rs +++ b/zkevm-circuits/src/evm_circuit/execution.rs @@ -116,7 +116,7 @@ impl ExecutionConfig { ) -> Self where TxTable: LookupTable, - RwTable: LookupTable, + RwTable: LookupTable, BytecodeTable: LookupTable, BlockTable: LookupTable, { @@ -309,7 +309,7 @@ impl ExecutionConfig { independent_lookups: Vec>>, ) where TxTable: LookupTable, - RwTable: LookupTable, + RwTable: LookupTable, BytecodeTable: LookupTable, BlockTable: LookupTable, { diff --git a/zkevm-circuits/src/evm_circuit/witness.rs b/zkevm-circuits/src/evm_circuit/witness.rs index 3409c9ede3..90470ea5db 100644 --- a/zkevm-circuits/src/evm_circuit/witness.rs +++ b/zkevm-circuits/src/evm_circuit/witness.rs @@ -444,7 +444,7 @@ impl Rw { } } - pub fn table_assignment(&self, randomness: F) -> [F; 8] { + pub fn table_assignment(&self, randomness: F) -> [F; 10] { match self { Self::TxAccessListAccount { rw_counter, @@ -459,9 +459,11 @@ impl Rw { F::from(RwTableTag::TxAccessListAccount as u64), F::from(*tx_id as u64), account_address.to_scalar().unwrap(), + F::zero(), F::from(*value as u64), F::from(*value_prev as u64), F::zero(), + F::zero(), ], Self::Account { rw_counter, @@ -484,9 +486,11 @@ impl Rw { F::from(RwTableTag::Account as u64), account_address.to_scalar().unwrap(), F::from(*field_tag as u64), + F::zero(), to_scalar(value), to_scalar(value_prev), F::zero(), + F::zero(), ] } Self::CallContext { @@ -501,6 +505,7 @@ impl Rw { F::from(RwTableTag::CallContext as u64), F::from(*call_id as u64), F::from(*field_tag as u64), + F::zero(), match field_tag { CallContextFieldTag::OpcodeSource | CallContextFieldTag::Value => { @@ -516,6 +521,7 @@ impl Rw { }, F::zero(), F::zero(), + F::zero(), ], Self::Stack { rw_counter, @@ -529,12 +535,14 @@ impl Rw { F::from(RwTableTag::Stack as u64), F::from(*call_id as u64), F::from(*stack_pointer as u64), + F::zero(), RandomLinearCombination::random_linear_combine( value.to_le_bytes(), randomness, ), F::zero(), F::zero(), + F::zero(), ], Self::Memory { rw_counter, @@ -548,9 +556,11 @@ impl Rw { F::from(RwTableTag::Memory as u64), F::from(*call_id as u64), F::from(*memory_address), + F::zero(), F::from(*byte as u64), F::zero(), F::zero(), + F::zero(), ], _ => unimplemented!(), } From f6740187a0ff775386eb2241d196cf4d54efed38 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 26 Jan 2022 13:12:22 +0800 Subject: [PATCH 5/7] update --- zkevm-circuits/src/evm_circuit/table.rs | 14 ++++++++++++++ .../src/evm_circuit/util/constraint_builder.rs | 12 +++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/table.rs b/zkevm-circuits/src/evm_circuit/table.rs index e468d5e8d4..c9db6f42bd 100644 --- a/zkevm-circuits/src/evm_circuit/table.rs +++ b/zkevm-circuits/src/evm_circuit/table.rs @@ -153,6 +153,20 @@ pub enum RwTableTag { Memory, } +impl RwTableTag { + pub fn can_write_with_reversion(self) -> bool { + return match self { + RwTableTag::TxAccessListAccount => true, + RwTableTag::TxAccessListStorageSlot => true, + RwTableTag::TxRefund => true, + RwTableTag::Account => true, + RwTableTag::AccountStorage => true, + RwTableTag::AccountDestructed => true, + _ => false, + }; + } +} + #[derive(Clone, Copy, Debug)] pub enum AccountFieldTag { Nonce = 1, diff --git a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs index cc4bf1e8de..09e333cd90 100644 --- a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs +++ b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs @@ -502,15 +502,9 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { let state_write_counter = cb.curr.state.state_write_counter.expr() + cb.state_write_counter_offset.expr(); // Swap value and value_prev respect to tag - match tag { - RwTableTag::TxAccessListAccount => values.swap(3, 4), - RwTableTag::TxAccessListStorageSlot => values.swap(3, 4), - RwTableTag::Account => values.swap(3, 4), - RwTableTag::AccountStorage => values.swap(3, 4), - RwTableTag::AccountDestructed => values.swap(3, 4), - RwTableTag::TxRefund => values.swap(3, 4), - _ => {} - } + if tag.can_write_with_reversion() { + values.swap(3, 4) + }; cb.rw_lookup_with_counter( rw_counter_end_of_reversion - state_write_counter, From c2627113f8710d1a9c59487edf8fc316b68e0542 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 26 Jan 2022 13:36:05 +0800 Subject: [PATCH 6/7] cargo clippy --- zkevm-circuits/src/evm_circuit/table.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/table.rs b/zkevm-circuits/src/evm_circuit/table.rs index c9db6f42bd..1054d7a8a8 100644 --- a/zkevm-circuits/src/evm_circuit/table.rs +++ b/zkevm-circuits/src/evm_circuit/table.rs @@ -155,15 +155,15 @@ pub enum RwTableTag { impl RwTableTag { pub fn can_write_with_reversion(self) -> bool { - return match self { - RwTableTag::TxAccessListAccount => true, - RwTableTag::TxAccessListStorageSlot => true, - RwTableTag::TxRefund => true, - RwTableTag::Account => true, - RwTableTag::AccountStorage => true, - RwTableTag::AccountDestructed => true, - _ => false, - }; + return matches!( + self, + RwTableTag::TxAccessListAccount + | RwTableTag::TxAccessListStorageSlot + | RwTableTag::TxRefund + | RwTableTag::Account + | RwTableTag::AccountStorage + | RwTableTag::AccountDestructed + ); } } From da4021ef3cca649cd7daa7c656c571f825af8e00 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 26 Jan 2022 14:35:12 +0800 Subject: [PATCH 7/7] rename --- zkevm-circuits/src/evm_circuit/table.rs | 2 +- zkevm-circuits/src/evm_circuit/util/constraint_builder.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/table.rs b/zkevm-circuits/src/evm_circuit/table.rs index 1054d7a8a8..ef584aa3bd 100644 --- a/zkevm-circuits/src/evm_circuit/table.rs +++ b/zkevm-circuits/src/evm_circuit/table.rs @@ -154,7 +154,7 @@ pub enum RwTableTag { } impl RwTableTag { - pub fn can_write_with_reversion(self) -> bool { + pub fn is_reversible(self) -> bool { return matches!( self, RwTableTag::TxAccessListAccount diff --git a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs index 09e333cd90..9dbd1c576d 100644 --- a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs +++ b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs @@ -501,8 +501,9 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { // Calculate state_write_counter so far let state_write_counter = cb.curr.state.state_write_counter.expr() + cb.state_write_counter_offset.expr(); + // Swap value and value_prev respect to tag - if tag.can_write_with_reversion() { + if tag.is_reversible() { values.swap(3, 4) };