From 05ab3d79331c7f7fd2a9ff4275e10c0737a7d8e4 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Thu, 1 Dec 2022 16:23:39 -0800 Subject: [PATCH] Fixes --- evm/src/all_stark.rs | 10 ++++++++-- evm/src/cpu/kernel/asm/main.asm | 3 ++- evm/src/logic.rs | 11 ++++++++--- evm/src/memory/memory_stark.rs | 13 ------------- evm/src/witness/operation.rs | 4 ++-- evm/src/witness/traces.rs | 7 +++++-- plonky2/src/hash/merkle_tree.rs | 4 +++- 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/evm/src/all_stark.rs b/evm/src/all_stark.rs index 26840c5f..7b94bc6b 100644 --- a/evm/src/all_stark.rs +++ b/evm/src/all_stark.rs @@ -242,6 +242,7 @@ mod tests { fn make_logic_trace( num_rows: usize, logic_stark: &LogicStark, + config: &StarkConfig, rng: &mut R, ) -> Vec> { let all_ops = [logic::Op::And, logic::Op::Or, logic::Op::Xor]; @@ -253,7 +254,11 @@ mod tests { Operation::new(op, input0, input1) }) .collect(); - logic_stark.generate_trace(ops, &mut TimingTree::default()) + logic_stark.generate_trace( + ops, + config.fri_config.num_cap_elements(), + &mut TimingTree::default(), + ) } fn make_memory_trace( @@ -705,7 +710,8 @@ mod tests { let keccak_trace = make_keccak_trace(num_keccak_perms, &all_stark.keccak_stark, &mut rng); let keccak_memory_trace = make_keccak_memory_trace(&all_stark.keccak_memory_stark, config); - let logic_trace = make_logic_trace(num_logic_rows, &all_stark.logic_stark, &mut rng); + let logic_trace = + make_logic_trace(num_logic_rows, &all_stark.logic_stark, config, &mut rng); let mem_trace = make_memory_trace(num_memory_ops, &all_stark.memory_stark, &mut rng); let mut memory_trace = mem_trace.0; let num_memory_ops = mem_trace.1; diff --git a/evm/src/cpu/kernel/asm/main.asm b/evm/src/cpu/kernel/asm/main.asm index 41cb8079..3541d21b 100644 --- a/evm/src/cpu/kernel/asm/main.asm +++ b/evm/src/cpu/kernel/asm/main.asm @@ -1,8 +1,9 @@ global main: // First, initialise the shift table %shift_table_init + // Second, load all MPT data from the prover. - PUSH txn_loop + PUSH hash_initial_tries %jump(load_all_mpts) hash_initial_tries: diff --git a/evm/src/logic.rs b/evm/src/logic.rs index 1a6c3daa..47900ba3 100644 --- a/evm/src/logic.rs +++ b/evm/src/logic.rs @@ -138,12 +138,13 @@ impl LogicStark { pub(crate) fn generate_trace( &self, operations: Vec, + min_rows: usize, timing: &mut TimingTree, ) -> Vec> { let trace_rows = timed!( timing, "generate trace rows", - self.generate_trace_rows(operations) + self.generate_trace_rows(operations, min_rows) ); let trace_polys = timed!( timing, @@ -153,9 +154,13 @@ impl LogicStark { trace_polys } - fn generate_trace_rows(&self, operations: Vec) -> Vec<[F; NUM_COLUMNS]> { + fn generate_trace_rows( + &self, + operations: Vec, + min_rows: usize, + ) -> Vec<[F; NUM_COLUMNS]> { let len = operations.len(); - let padded_len = len.next_power_of_two(); + let padded_len = len.max(min_rows).next_power_of_two(); let mut rows = Vec::with_capacity(padded_len); for op in operations { diff --git a/evm/src/memory/memory_stark.rs b/evm/src/memory/memory_stark.rs index 6f0e565e..fefc2723 100644 --- a/evm/src/memory/memory_stark.rs +++ b/evm/src/memory/memory_stark.rs @@ -43,19 +43,6 @@ pub struct MemoryStark { pub(crate) f: PhantomData, } -// TODO: Remove -// #[derive(Clone, Debug)] -// pub(crate) struct MemoryOp { -// /// true if this is an actual memory operation, or false if it's a padding row. -// pub filter: bool, -// pub timestamp: usize, -// pub is_read: bool, -// pub context: usize, -// pub segment: Segment, -// pub virt: usize, -// pub value: U256, -// } - impl MemoryOp { /// Generate a row for a given memory operation. Note that this does not generate columns which /// depend on the next operation, such as `CONTEXT_FIRST_CHANGE`; those are generated later. diff --git a/evm/src/witness/operation.rs b/evm/src/witness/operation.rs index 4f397013..a778d827 100644 --- a/evm/src/witness/operation.rs +++ b/evm/src/witness/operation.rs @@ -110,7 +110,7 @@ pub(crate) fn generate_keccak_general( stack_pop_with_log_and_fill::<4, _>(state, &mut row)?; let len = len.as_usize(); - let mut base_address = MemoryAddress::new_u256s(context, segment, base_virt); + let base_address = MemoryAddress::new_u256s(context, segment, base_virt); let input = (0..len) .map(|i| { let address = MemoryAddress { @@ -156,7 +156,7 @@ pub(crate) fn generate_prover_input( pub(crate) fn generate_pop( state: &mut GenerationState, - mut row: CpuColumnsView, + row: CpuColumnsView, ) -> Result<(), ProgramError> { if state.registers.stack_len == 0 { return Err(ProgramError::StackUnderflow); diff --git a/evm/src/witness/traces.rs b/evm/src/witness/traces.rs index 05540ed7..ef754e5e 100644 --- a/evm/src/witness/traces.rs +++ b/evm/src/witness/traces.rs @@ -99,6 +99,7 @@ impl Traces { where T: RichField + Extendable, { + let cap_elements = config.fri_config.num_cap_elements(); let Traces { cpu, logic_ops, @@ -114,10 +115,12 @@ impl Traces { let keccak_trace = all_stark.keccak_stark.generate_trace(keccak_inputs, timing); let keccak_memory_trace = all_stark.keccak_memory_stark.generate_trace( keccak_memory_inputs, - config.fri_config.num_cap_elements(), + cap_elements, timing, ); - let logic_trace = all_stark.logic_stark.generate_trace(logic_ops, timing); + let logic_trace = all_stark + .logic_stark + .generate_trace(logic_ops, cap_elements, timing); let memory_trace = all_stark.memory_stark.generate_trace(memory_ops, timing); [ diff --git a/plonky2/src/hash/merkle_tree.rs b/plonky2/src/hash/merkle_tree.rs index 92f1dca0..86871701 100644 --- a/plonky2/src/hash/merkle_tree.rs +++ b/plonky2/src/hash/merkle_tree.rs @@ -135,7 +135,9 @@ impl> MerkleTree { let log2_leaves_len = log2_strict(leaves.len()); assert!( cap_height <= log2_leaves_len, - "cap height should be at most log2(leaves.len())" + "cap_height={} should be at most log2(leaves.len())={}", + cap_height, + log2_leaves_len ); let num_digests = 2 * (leaves.len() - (1 << cap_height));