From 71dff6e9827f501bc59416dc25ce06c4aec030ab Mon Sep 17 00:00:00 2001 From: Hamy Ratoanina Date: Wed, 13 Dec 2023 18:35:17 -0500 Subject: [PATCH] Constrain MSTORE_32BYTES new offset limbs (#1415) --- evm/src/cpu/byte_unpacking.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/evm/src/cpu/byte_unpacking.rs b/evm/src/cpu/byte_unpacking.rs index aed3bc4e..14518bfa 100644 --- a/evm/src/cpu/byte_unpacking.rs +++ b/evm/src/cpu/byte_unpacking.rs @@ -16,7 +16,7 @@ pub(crate) fn eval_packed( // The MSTORE_32BYTES opcodes are differentiated from MLOAD_32BYTES // by the 5th bit set to 0. let filter = lv.op.m_op_32bytes * (lv.opcode_bits[5] - P::ONES); - let new_offset = nv.mem_channels[0].value[0]; + let new_offset = nv.mem_channels[0].value; let virt = lv.mem_channels[2].value[0]; // Read len from opcode bits and constrain the pushed new offset. let len_bits: P = lv.opcode_bits[..5] @@ -25,7 +25,10 @@ pub(crate) fn eval_packed( .map(|(i, &bit)| bit * P::Scalar::from_canonical_u64(1 << i)) .sum(); let len = len_bits + P::ONES; - yield_constr.constraint(filter * (new_offset - virt - len)); + yield_constr.constraint(filter * (new_offset[0] - virt - len)); + for &limb in &new_offset[1..] { + yield_constr.constraint(filter * limb); + } } pub(crate) fn eval_ext_circuit, const D: usize>( @@ -38,7 +41,7 @@ pub(crate) fn eval_ext_circuit, const D: usize>( // by the 5th bit set to 0. let filter = builder.mul_sub_extension(lv.op.m_op_32bytes, lv.opcode_bits[5], lv.op.m_op_32bytes); - let new_offset = nv.mem_channels[0].value[0]; + let new_offset = nv.mem_channels[0].value; let virt = lv.mem_channels[2].value[0]; // Read len from opcode bits and constrain the pushed new offset. let len_bits = lv.opcode_bits[..5].iter().enumerate().fold( @@ -47,8 +50,12 @@ pub(crate) fn eval_ext_circuit, const D: usize>( builder.mul_const_add_extension(F::from_canonical_u64(1 << i), bit, cumul) }, ); - let diff = builder.sub_extension(new_offset, virt); + let diff = builder.sub_extension(new_offset[0], virt); let diff = builder.sub_extension(diff, len_bits); let constr = builder.mul_sub_extension(filter, diff, filter); yield_constr.constraint(builder, constr); + for &limb in &new_offset[1..] { + let constr = builder.mul_extension(filter, limb); + yield_constr.constraint(builder, constr); + } }