diff --git a/evm/src/all_stark.rs b/evm/src/all_stark.rs index 4ef79314..a943e99c 100644 --- a/evm/src/all_stark.rs +++ b/evm/src/all_stark.rs @@ -49,6 +49,7 @@ impl Table { #[cfg(test)] mod tests { use anyhow::Result; + use itertools::Itertools; use plonky2::field::field_types::Field; use plonky2::field::polynomial::PolynomialValues; use plonky2::iop::witness::PartialWitness; @@ -62,7 +63,7 @@ mod tests { use crate::cpu; use crate::cpu::cpu_stark::CpuStark; use crate::cross_table_lookup::CrossTableLookup; - use crate::keccak::keccak_stark::KeccakStark; + use crate::keccak::keccak_stark::{KeccakStark, NUM_ROUNDS, INPUT_LIMBS}; use crate::proof::AllProof; use crate::prover::prove; use crate::recursive_verifier::{ @@ -80,29 +81,35 @@ mod tests { let cpu_stark = CpuStark:: { f: Default::default(), }; - let cpu_rows = 256; + let cpu_rows = 1 << 6; let keccak_stark = KeccakStark:: { f: Default::default(), }; - let keccak_rows = 256; - let keccak_looked_col = 3; + let keccak_rows = (NUM_ROUNDS + 1).next_power_of_two(); - let mut cpu_trace_rows = vec![]; - for i in 0..cpu_rows { - let mut cpu_trace_row = [F::ZERO; CpuStark::::COLUMNS]; - cpu_trace_row[cpu::columns::IS_CPU_CYCLE] = F::ONE; - cpu_trace_row[cpu::columns::OPCODE] = F::from_canonical_usize(i); - cpu_stark.generate(&mut cpu_trace_row); - cpu_trace_rows.push(cpu_trace_row); - } - let cpu_trace = trace_rows_to_poly_values(cpu_trace_rows); + let mut cpu_trace = vec![PolynomialValues::::zero(cpu_rows); 10]; + + let mut rng = ChaCha8Rng::seed_from_u64(0x6feb51b7ec230f25); - let mut keccak_trace = - vec![PolynomialValues::zero(keccak_rows); KeccakStark::::COLUMNS]; - keccak_trace[keccak_looked_col] = cpu_trace[cpu::columns::OPCODE].clone(); + let num_inpts = 1; + let keccak_inputs = (0..num_inpts) + .map(|_| [0u64; INPUT_LIMBS].map(|_| rng.gen())) + .collect_vec(); + let keccak_trace = keccak_stark.generate_trace(keccak_inputs); + + let vs0: Vec<_> = keccak_trace[3].values[..].into(); + let vs1: Vec<_> = keccak_trace[5].values[..].into(); + + let start = thread_rng().gen_range(0..cpu_rows - keccak_rows); + + let default = vec![F::ONE; 2]; + + cpu_trace[2].values = vec![default[0]; cpu_rows]; + cpu_trace[2].values[start..start + keccak_rows].copy_from_slice(&vs0); + cpu_trace[4].values = vec![default[1]; cpu_rows]; + cpu_trace[4].values[start..start + keccak_rows].copy_from_slice(&vs1); - let default = vec![F::ZERO; 2]; let cross_table_lookups = vec![CrossTableLookup { looking_tables: vec![Table::Cpu], looking_columns: vec![vec![cpu::columns::OPCODE]], diff --git a/evm/src/keccak/keccak_stark.rs b/evm/src/keccak/keccak_stark.rs index dfaca5cd..3fbc7b94 100644 --- a/evm/src/keccak/keccak_stark.rs +++ b/evm/src/keccak/keccak_stark.rs @@ -29,7 +29,7 @@ pub(crate) const NUM_ROUNDS: usize = 24; /// Number of 64-bit limbs in a preimage of the Keccak permutation. pub(crate) const INPUT_LIMBS: usize = 25; -pub(crate) const NUM_PUBLIC_INPUTS: usize = 4; +pub(crate) const NUM_PUBLIC_INPUTS: usize = 0; #[derive(Copy, Clone)] pub struct KeccakStark { @@ -39,14 +39,15 @@ pub struct KeccakStark { impl, const D: usize> KeccakStark { /// Generate the rows of the trace. Note that this does not generate the permuted columns used /// in our lookup arguments, as those are computed after transposing to column-wise form. - fn generate_trace_rows(&self, inputs: Vec<[u64; INPUT_LIMBS]>) -> Vec<[F; NUM_REGISTERS]> { + pub(crate) fn generate_trace_rows(&self, inputs: Vec<[u64; INPUT_LIMBS]>) -> Vec<[F; NUM_REGISTERS]> { let num_rows = (inputs.len() * NUM_ROUNDS).next_power_of_two(); info!("{} rows", num_rows); let mut rows = Vec::with_capacity(num_rows); - for input in inputs { - rows.extend(self.generate_trace_rows_for_perm(input)); + for input in inputs.iter().take(1) { + rows.extend(self.generate_trace_rows_for_perm(input.clone())); } + // Pad rows to power of two. for i in rows.len()..num_rows { let mut row = [F::ZERO; NUM_REGISTERS]; self.generate_trace_rows_for_round(&mut row, i % NUM_ROUNDS); @@ -59,8 +60,8 @@ impl, const D: usize> KeccakStark { fn generate_trace_rows_for_perm( &self, input: [u64; INPUT_LIMBS], - ) -> [[F; NUM_REGISTERS]; NUM_ROUNDS] { - let mut rows = [[F::ZERO; NUM_REGISTERS]; NUM_ROUNDS]; + ) -> Vec<[F; NUM_REGISTERS]> { + let mut rows = vec![[F::ZERO; NUM_REGISTERS]; NUM_ROUNDS]; for x in 0..5 { for y in 0..5 { @@ -73,7 +74,24 @@ impl, const D: usize> KeccakStark { self.generate_trace_rows_for_round(&mut rows[0], 0); for round in 1..24 { - // TODO: Populate input from prev. row output. + for x in 0..5 { + for y in 0..5 { + let cur = rows[round - 1][reg_a_prime_prime_prime(x, y)]; + let cur_u64 = cur.to_canonical_u64(); + let bit_values: Vec = (0..64) + .scan(cur_u64, |acc, _| { + let tmp = *acc % 2; + *acc /= 2; + Some(tmp) + }) + .collect(); + + for z in 0..64 { + rows[round][reg_a(x, y, z)] = F::from_canonical_u64(bit_values[z]); + } + } + } + rows[round] = rows[round - 1].clone(); self.generate_trace_rows_for_round(&mut rows[round], round); } @@ -81,7 +99,7 @@ impl, const D: usize> KeccakStark { } fn generate_trace_rows_for_round(&self, row: &mut [F; NUM_REGISTERS], round: usize) { - row[round] = F::ONE; + row[reg_step(round)] = F::ONE; // Populate C partial and C. for x in 0..5 { @@ -113,24 +131,23 @@ impl, const D: usize> KeccakStark { // A''[x, y] = xor(B[x, y], andn(B[x + 1, y], B[x + 2, y])). for x in 0..5 { for y in 0..5 { - let get_bit = |z| { - xor([ - row[reg_b(x, y, z)], - andn(row[reg_b((x + 1) % 5, y, z)], row[reg_b((x + 2) % 5, y, z)]), - ]) - }; + // let get_bit = |z| { + + // // xor([ + // // row[reg_b(x, y, z)], + // // andn(row[reg_b((x + 1) % 5, y, z)], row[reg_b((x + 2) % 5, y, z)]), + // // ]) + // }; - let lo = (0..32) - .rev() - .fold(F::ZERO, |acc, z| acc.double() + get_bit(z)); - let hi = (32..64) - .rev() - .fold(F::ZERO, |acc, z| acc.double() + get_bit(z)); + let lo = F::ZERO;//row[reg_b(x, y, 0)]; + // let hi = (32..64) + // .rev() + // .fold(F::ZERO, |acc, z| acc.double() + get_bit(z)); let reg_lo = reg_a_prime_prime(x, y); let reg_hi = reg_lo + 1; row[reg_lo] = lo; - row[reg_hi] = hi; + // row[reg_hi] = hi; } } @@ -223,28 +240,28 @@ impl, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark, const D: usize> Stark for KeccakStark