From 6117f85919ceb0416ff9f3298410514f2b26d092 Mon Sep 17 00:00:00 2001 From: Raphael Toledo Date: Fri, 30 Jun 2023 14:51:47 +0100 Subject: [PATCH] EVM/stop: supporting incomplete bytecodes --- .../src/evm_circuit/execution/stop.rs | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/stop.rs b/zkevm-circuits/src/evm_circuit/execution/stop.rs index 464b936f747..350f8ff9128 100644 --- a/zkevm-circuits/src/evm_circuit/execution/stop.rs +++ b/zkevm-circuits/src/evm_circuit/execution/stop.rs @@ -1,6 +1,7 @@ use crate::{ evm_circuit::{ execution::ExecutionGadget, + param::N_BYTES_PROGRAM_COUNTER, step::ExecutionState, util::{ common_gadget::RestoreContextGadget, @@ -8,7 +9,7 @@ use crate::{ ConstrainBuilderCommon, EVMConstraintBuilder, StepStateTransition, Transition::{Delta, Same}, }, - math_gadget::IsZeroGadget, + math_gadget::ComparisonGadget, CachedRegion, Cell, }, witness::{Block, Call, ExecStep, Transaction}, @@ -26,7 +27,7 @@ use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct StopGadget { code_length: Cell, - is_out_of_range: IsZeroGadget, + out_of_range: ComparisonGadget, opcode: Cell, restore_context: RestoreContextGadget, } @@ -39,12 +40,17 @@ impl ExecutionGadget for StopGadget { fn configure(cb: &mut EVMConstraintBuilder) -> Self { let code_length = cb.query_cell(); cb.bytecode_length(cb.curr.state.code_hash.to_word(), code_length.expr()); - let is_out_of_range = IsZeroGadget::construct( + + let out_of_range = ComparisonGadget::construct( cb, - code_length.expr() - cb.curr.state.program_counter.expr(), + code_length.expr(), + cb.curr.state.program_counter.expr(), ); + let (lt, eq) = out_of_range.expr(); + let is_out_of_range = lt + eq; + let opcode = cb.query_cell(); - cb.condition(1.expr() - is_out_of_range.expr(), |cb| { + cb.condition(1.expr() - is_out_of_range, |cb| { cb.opcode_lookup(opcode.expr(), 1.expr()); }); @@ -91,7 +97,7 @@ impl ExecutionGadget for StopGadget { Self { code_length, - is_out_of_range, + out_of_range, opcode, restore_context, } @@ -110,17 +116,13 @@ impl ExecutionGadget for StopGadget { .bytecodes .get(&call.code_hash.to_word()) .expect("could not find current environment's bytecode"); - self.code_length.assign( - region, - offset, - Value::known(F::from(code.bytes.len() as u64)), - )?; - - self.is_out_of_range.assign( - region, - offset, - F::from(code.bytes.len() as u64) - F::from(step.pc), - )?; + + let code_length = code.bytes.len() as u64; + self.code_length + .assign(region, offset, Value::known(F::from(code_length)))?; + + self.out_of_range + .assign(region, offset, F::from(code_length), F::from(step.pc))?; let opcode = step.opcode().unwrap(); self.opcode