From 1f0776281ef04c54207ea15d8b56a334931f1a6f Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 18 Apr 2023 14:52:15 -0700 Subject: [PATCH] new api --- evm/src/cpu/kernel/tests/bls381.rs | 4 +- evm/src/extension_tower.rs | 175 +++++++++++------------------ 2 files changed, 70 insertions(+), 109 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index f1d5a72a..aeba6fbd 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -14,8 +14,8 @@ fn test_bls_fp2_mul() -> Result<()> { let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); - let mut stack = x.to_stack(); - stack.extend(y.to_stack()); + let mut stack = x.to_stack().to_vec(); + stack.extend(y.to_stack().to_vec()); stack.push(U256::from(0xdeadbeefu32)); let setup = InterpreterMemoryInitialization { label: "mul_fp381_2".to_string(), diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 1bfe3786..d166152e 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -2,6 +2,7 @@ use std::mem::transmute; use std::ops::{Add, Div, Mul, Neg, Sub}; use ethereum_types::{U256, U512}; +use plonky2::field::types::Field; use rand::distributions::{Distribution, Standard}; use rand::Rng; @@ -1201,14 +1202,19 @@ where } pub trait Stack { + const SIZE: usize; + fn to_stack(&self) -> &[U256]; fn from_stack(stack: &[U256]) -> Self; } impl Stack for BN254 { + const SIZE: usize = 1; + fn to_stack(&self) -> &[U256] { - &[self.val] + let boxed: Box<[U256]> = Box::new([self.val]); + Box::leak(boxed) } fn from_stack(stack: &[U256]) -> BN254 { @@ -1216,66 +1222,12 @@ impl Stack for BN254 { } } -impl Stack for Fp2 { - fn to_stack(&self) -> &[U256] { - let re = self.re.to_stack(); - let im = self.im.to_stack(); - let mut res = [U256::default(); 4]; - &[re[0], im[0]] - } - - fn from_stack(stack: &[U256]) -> Fp2 { - let re = BN254::from_stack(&stack[0..2]); - let im = BN254::from_stack(&stack[2..4]); - Fp2 { re, im } - } -} - -impl Stack for Fp6 { - fn to_stack(&self) -> &[U256] { - let t0 = self.t0.to_stack(); - let t1 = self.t1.to_stack(); - let t2 = self.t2.to_stack(); - - let mut res = [U256::default(); 6]; - for i in 0..2 { - res[i] = t0[i]; - res[2 + i] = t1[i]; - res[4 + i] = t2[i]; - } - &res - } - - fn from_stack(stack: &[U256]) -> Self { - let mut f = [U256::zero(); 6]; - f.copy_from_slice(stack); - unsafe { transmute(f) } - } -} - -impl Stack for Fp12 { - fn to_stack(&self) -> &[U256] { - let z0 = self.z0.to_stack(); - let z1 = self.z1.to_stack(); - - let mut res = [U256::default(); 12]; - for i in 0..6 { - res[i] = z0[i]; - res[6 + i] = z1[i]; - } - &res - } - - fn from_stack(stack: &[U256]) -> Self { - let mut f = [U256::zero(); 12]; - f.copy_from_slice(stack); - unsafe { transmute(f) } - } -} - impl Stack for BLS381 { + const SIZE: usize = 2; + fn to_stack(&self) -> &[U256] { - &[self.lo(), self.hi()] + let boxed: Box<[U256]> = Box::new([self.lo(), self.hi()]); + Box::leak(boxed) } fn from_stack(stack: &[U256]) -> BLS381 { @@ -1286,65 +1238,74 @@ impl Stack for BLS381 { } } -impl Stack for Fp2 { +impl Stack for Fp2 { + const SIZE: usize = 2 * T::SIZE; + fn to_stack(&self) -> &[U256] { let re = self.re.to_stack(); let im = self.im.to_stack(); - - let mut res = [U256::default(); 4]; - for i in 0..2 { - res[i] = re[i]; - res[2 + i] = im[i]; - } - &res + let mut combined: Vec = Vec::new(); + combined.extend_from_slice(re); + combined.extend_from_slice(im); + Box::leak(combined.into_boxed_slice()) } - fn from_stack(stack: &[U256]) -> Fp2 { - let re = BLS381::from_stack(&stack[0..2]); - let im = BLS381::from_stack(&stack[2..4]); + fn from_stack(stack: &[U256]) -> Fp2 { + let re = T::from_stack(&stack[0..2]); + let im = T::from_stack(&stack[2..4]); Fp2 { re, im } } } -impl Stack for Fp6 { - fn to_stack(&self) -> &[U256] { - let t0 = self.t0.to_stack(); - let t1 = self.t1.to_stack(); - let t2 = self.t2.to_stack(); +// impl Stack for Fp6 +// where +// T: FieldExt, +// Fp2: Adj, +// Fp2: Stack, +// { +// const SIZE: usize = 3 * Fp2::::SIZE; - let mut res = [U256::default(); 12]; - for i in 0..4 { - res[i] = t0[i]; - res[4 + i] = t1[i]; - res[8 + i] = t2[i]; - } - &res - } +// fn to_stack(&self) -> &[U256] { +// let t0 = self.t0.to_stack(); +// let t1 = self.t1.to_stack(); +// let t2 = self.t2.to_stack(); - fn from_stack(stack: &[U256]) -> Fp6 { - let t0 = Fp2::::from_stack(&stack[0..4]); - let t1 = Fp2::::from_stack(&stack[4..8]); - let t2 = Fp2::::from_stack(&stack[8..12]); - Fp6 { t0, t1, t2 } - } -} +// let mut combined: Vec = Vec::new(); +// combined.extend_from_slice(t0); +// combined.extend_from_slice(t1); +// combined.extend_from_slice(t2); +// Box::leak(combined.into_boxed_slice()) +// } -impl Stack for Fp12 { - fn to_stack(&self) -> &[U256] { - let z0 = self.z0.to_stack(); - let z1 = self.z1.to_stack(); +// fn from_stack(stack: &[U256]) -> Self { +// let f = [ +// T::from_stack(&stack[0..2]), +// T::from_stack(&stack[2..4]), +// T::from_stack(&stack[4..6]), +// ]; +// f.copy_from_slice(stack); +// unsafe { transmute(f) } +// } +// } - let mut res = [U256::default(); 24]; - for i in 0..12 { - res[i] = z0[i]; - res[12 + i] = z1[i]; - } - &res - } +// impl Stack for Fp12 +// where +// T: FieldExt, +// Fp2: Adj, +// Fp6: Stack,{ +// const SIZE: usize = 2 * Fp6::::SIZE; - fn from_stack(stack: &[U256]) -> Fp12 { - let z0 = Fp6::::from_stack(&stack[0..12]); - let z1 = Fp6::::from_stack(&stack[12..24]); - Fp12 { z0, z1 } - } -} +// fn to_stack(&self) -> &[U256] { +// let z0 = self.z0.to_stack(); +// let z1 = self.z1.to_stack(); + +// let mut combined: Vec = Vec::new(); +// combined.extend_from_slice(z0); +// combined.extend_from_slice(z1); +// Box::leak(combined.into_boxed_slice()) +// } + +// fn from_stack(stack: &[U256]) -> Self { +// let f = [T::from_stack(&stack[0..6]), T::from_stack(&stack[6..12])]; +// } +// }