From 69aed6586a7ef6757f6da581697c314a068659a8 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Wed, 1 Jun 2022 09:19:23 -0700 Subject: [PATCH] fixes --- evm/src/keccak/keccak_stark.rs | 84 ++++++++++++++++++++-------------- evm/src/keccak/registers.rs | 7 ++- 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/evm/src/keccak/keccak_stark.rs b/evm/src/keccak/keccak_stark.rs index 6b90dbc1..54ce7f89 100644 --- a/evm/src/keccak/keccak_stark.rs +++ b/evm/src/keccak/keccak_stark.rs @@ -16,7 +16,7 @@ use crate::keccak::logic::{ }; use crate::keccak::registers::{ rc_value, rc_value_bit, reg_a, reg_a_prime, reg_a_prime_prime, reg_a_prime_prime_0_0_bit, - reg_a_prime_prime_prime, reg_b, reg_c, reg_c_partial, reg_step, NUM_REGISTERS, + reg_a_prime_prime_prime, reg_b, reg_c, reg_c_partial, reg_step, NUM_REGISTERS, reg_dummy, }; use crate::keccak::round_flags::{eval_round_flags, eval_round_flags_recursively}; use crate::stark::Stark; @@ -54,6 +54,7 @@ impl, const D: usize> KeccakStark { 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); + row[reg_dummy()] = F::ONE; rows.push(row); } @@ -74,29 +75,34 @@ impl, const D: usize> KeccakStark { self.generate_trace_rows_for_round(&mut rows[0], 0); for round in 1..24 { - 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]); - } - } - } + self.copy_output_to_input(rows[round - 1], &mut rows[round]); self.generate_trace_rows_for_round(&mut rows[round], round); } rows } + fn copy_output_to_input(&self, prev_row: [F; NUM_REGISTERS], next_row: &mut [F; NUM_REGISTERS]) { + for x in 0..5 { + for y in 0..5 { + let cur_lo = prev_row[reg_a_prime_prime_prime(x, y)]; + let cur_hi = prev_row[reg_a_prime_prime_prime(x, y) + 1]; + let cur_u64 = cur_lo.to_canonical_u64() + (1 << 32) * cur_hi.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 { + next_row[reg_a(x, y, z)] = F::from_canonical_u64(bit_values[z]); + } + } + } + } + fn generate_trace_rows_for_round(&self, row: &mut [F; NUM_REGISTERS], round: usize) { row[reg_step(round)] = F::ONE; @@ -323,14 +329,20 @@ 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 usize { i } +/// A register which is set to 1 if we are in the `i`th round, otherwise 0. +pub(crate) const fn reg_dummy() -> usize { + NUM_ROUNDS +} + const R: [[u8; 5]; 5] = [ [0, 18, 41, 3, 36], [1, 2, 45, 10, 44], @@ -172,7 +177,7 @@ pub(crate) const fn rc_value(round: usize) -> u64 { RC[round] } -const START_A: usize = NUM_ROUNDS; +const START_A: usize = NUM_ROUNDS + 1; pub(crate) const fn reg_a(x: usize, y: usize, z: usize) -> usize { debug_assert!(x < 5); debug_assert!(y < 5);