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/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..cc4bf1e8de 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,11 +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 { - 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), _ => {} } @@ -534,7 +535,15 @@ 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 +561,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ account_address, field_tag.expr(), + 0.expr(), value.clone(), value, 0.expr(), + 0.expr(), ], ); } @@ -572,9 +583,11 @@ impl<'a, F: FieldExt> ConstraintBuilder<'a, F> { [ account_address, field_tag.expr(), + 0.expr(), value, value_prev, 0.expr(), + 0.expr(), ], ); } @@ -593,9 +606,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 +641,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 +678,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 +701,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 +724,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(), ], ); } 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!(), }