From 1f14ae9850ee280cad673adbc7b8430838b7d81b Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 24 Mar 2023 11:31:32 -0700 Subject: [PATCH 01/24] skeleton --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index a4e846cb..1ef99a8c 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -51,3 +51,40 @@ global test_mul_fp381: global test_sub_fp381: %sub_fp381 %jump(0xdeadbeef) + + +%macro add_fp381_2 + // stack: x: 2, x_: 2, y: 2, y_: 2 + %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) + // stack: y_: 2, x_: 2, y: 2, x: 2 + %add_fp381 + // stack: z_: 2, y: 2, x: 2 + %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) + // stack: x: 2, y: 2, z_: 2 + %add_fp381 + // stack: z: 2, z_: 2 +%endmacro + +%macro mul_fp381_2 + // stack: x: 2, x_: 2, y: 2, y_: 2 + %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) + // stack: y_: 2, x_: 2, y: 2, x: 2 + %add_fp381 + // stack: z_: 2, y: 2, x: 2 + %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) + // stack: x: 2, y: 2, z_: 2 + %add_fp381 + // stack: z: 2, z_: 2 +%endmacro + +%macro sub_fp381_2 + // stack: x: 2, x_: 2, y: 2, y_: 2 + %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) + // stack: y_: 2, x_: 2, y: 2, x: 2 + %add_fp381 + // stack: z_: 2, y: 2, x: 2 + %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) + // stack: x: 2, y: 2, z_: 2 + %add_fp381 + // stack: z: 2, z_: 2 +%endmacro \ No newline at end of file From 3b95e0139062b594045b1541ca70910eb841e10d Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 27 Mar 2023 21:10:23 -0700 Subject: [PATCH 02/24] bls method --- evm/src/cpu/kernel/tests/bls381.rs | 5 +---- evm/src/extension_tower.rs | 7 +++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index afd22a14..b8315b6f 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -1,5 +1,4 @@ use anyhow::Result; -use ethereum_types::U512; use rand::Rng; use crate::cpu::kernel::interpreter::{ @@ -19,9 +18,7 @@ fn run_and_return_bls(label: String, x: BLS381, y: BLS381) -> BLS381 { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output = interpreter.stack(); - BLS381 { - val: U512::from(output[1]) + (U512::from(output[0]) << 256), - } + BLS381::from_limbs(output[0], output[1]) } #[test] diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index ddcfe254..72a1106c 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -144,6 +144,13 @@ impl BLS381 { pub fn hi(self) -> U256 { U256(self.val.0[4..].try_into().unwrap()) } + + pub fn from_limbs(hi: U256, lo: U256) -> BLS381 { + let mut val = [0u64; 8]; + val[..4].copy_from_slice(&lo.0); + val[4..].copy_from_slice(&hi.0); + BLS381 { val: U512(val) } + } } impl Distribution for Standard { From 823b06acab0bbac4054602a308dd3de25bf29f98 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 28 Mar 2023 11:12:59 -0700 Subject: [PATCH 03/24] fp2 works --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 62 ++++++++++++++------ evm/src/cpu/kernel/tests/bls381.rs | 39 ++++++++++-- evm/src/cpu/kernel/tests/bn254.rs | 36 ++++++------ evm/src/extension_tower.rs | 50 ++++++++++++---- 4 files changed, 135 insertions(+), 52 deletions(-) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index 1ef99a8c..c35a56e0 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -53,7 +53,7 @@ global test_sub_fp381: %jump(0xdeadbeef) -%macro add_fp381_2 +global add_fp381_2: // stack: x: 2, x_: 2, y: 2, y_: 2 %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) // stack: y_: 2, x_: 2, y: 2, x: 2 @@ -63,28 +63,52 @@ global test_sub_fp381: // stack: x: 2, y: 2, z_: 2 %add_fp381 // stack: z: 2, z_: 2 -%endmacro + %jump(0xdeadbeef) -%macro mul_fp381_2 - // stack: x: 2, x_: 2, y: 2, y_: 2 - %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) - // stack: y_: 2, x_: 2, y: 2, x: 2 - %add_fp381 - // stack: z_: 2, y: 2, x: 2 - %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) - // stack: x: 2, y: 2, z_: 2 - %add_fp381 - // stack: z: 2, z_: 2 -%endmacro +global mul_fp381_2: + // stack: a, b, c, d + DUP4 + DUP4 + // stack: b, a, b, c, d + DUP8 + DUP8 + // stack: c, b, a, b, c, d + DUP12 + DUP12 + // stack: d, c, b, a, b, c, d + DUP8 + DUP8 + // stack: a, d, c, b, a, b, c, d -%macro sub_fp381_2 - // stack: x: 2, x_: 2, y: 2, y_: 2 - %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) - // stack: y_: 2, x_: 2, y: 2, x: 2 + // stack: a, d, c, b, a, b, c, d + %mul_fp381 + // stack: ad, c, b, a, b, c, d + %stack (ad: 2, c: 2, b: 2) -> (b, c, ad) + // stack: b, c, ad, a, b, c, d + %mul_fp381 + // stack: bc, ad, a, b, c, d %add_fp381 + // stack: z_im, a, b, c, d + %stack (z_im: 2, a: 2, b: 2, c: 2, d: 2) -> (b, d, c, a, z_im) + // stack: b, d, c, a, z_im + %mul_fp381 + // stack: bd, c, a, z_im + %stack (bd: 2, c: 2, a: 2) -> (a, c, bd) + // stack: a, c, bd, z_im + %mul_fp381 + // stack: ac, bd, z_im + %sub_fp381 + // stack: z_re, z_im + %jump(0xdeadbeef) + +global sub_fp381_2: + // stack: x: 2, x_: 2, y: 2, y_: 2 + %stack (x: 2, x_: 2, y: 2, y_: 2) -> (x_, y_, y, x) + // stack: x_: 2, y_: 2, y: 2, x: 2 + %sub_fp381 // stack: z_: 2, y: 2, x: 2 %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) // stack: x: 2, y: 2, z_: 2 - %add_fp381 + %sub_fp381 // stack: z: 2, z_: 2 -%endmacro \ No newline at end of file + %jump(0xdeadbeef) diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index b8315b6f..69904a4e 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -4,12 +4,12 @@ use rand::Rng; use crate::cpu::kernel::interpreter::{ run_interpreter_with_memory, InterpreterMemoryInitialization, }; -use crate::extension_tower::{Stack, BLS381}; +use crate::extension_tower::{Fp2, Stack, BLS381}; use crate::memory::segments::Segment::KernelGeneral; fn run_and_return_bls(label: String, x: BLS381, y: BLS381) -> BLS381 { - let mut stack = x.on_stack(); - stack.extend(y.on_stack()); + let mut stack = x.to_stack(); + stack.extend(y.to_stack()); let setup = InterpreterMemoryInitialization { label, stack, @@ -18,7 +18,7 @@ fn run_and_return_bls(label: String, x: BLS381, y: BLS381) -> BLS381 { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output = interpreter.stack(); - BLS381::from_limbs(output[0], output[1]) + BLS381::from_stack(output) } #[test] @@ -37,3 +37,34 @@ fn test_bls_ops() -> Result<()> { Ok(()) } + +fn run_and_return_bls_fp2(label: String, x: Fp2, y: Fp2) -> Fp2 { + let mut stack = x.to_stack(); + stack.extend(y.to_stack()); + let setup = InterpreterMemoryInitialization { + label, + stack, + segment: KernelGeneral, + memory: vec![], + }; + let interpreter = run_interpreter_with_memory(setup).unwrap(); + let output = interpreter.stack(); + Fp2::from_stack(output) +} + +#[test] +fn test_bls_fp2() -> Result<()> { + let mut rng = rand::thread_rng(); + let x: Fp2 = rng.gen::>(); + let y: Fp2 = rng.gen::>(); + + let output_add = run_and_return_bls_fp2("add_fp381_2".to_string(), x, y); + let output_mul = run_and_return_bls_fp2("mul_fp381_2".to_string(), x, y); + let output_sub = run_and_return_bls_fp2("sub_fp381_2".to_string(), x, y); + + assert_eq!(output_add, x + y); + assert_eq!(output_mul, x * y); + assert_eq!(output_sub, x - y); + + Ok(()) +} diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index 8e71ffd6..6a5acea9 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -25,9 +25,9 @@ fn setup_mul_fp6_test( g: Fp6, label: &str, ) -> InterpreterMemoryInitialization { - let mut stack = f.on_stack(); + let mut stack = f.to_stack(); if label == "mul_fp254_6" { - stack.extend(g.on_stack()); + stack.extend(g.to_stack()); } stack.push(U256::from(0xdeadbeefu32)); InterpreterMemoryInitialization { @@ -53,8 +53,8 @@ fn test_mul_fp6() -> Result<()> { let out_normal: Vec = extract_stack(intrptr_normal); let out_square: Vec = extract_stack(intrptr_square); - let exp_normal: Vec = (f * g).on_stack(); - let exp_square: Vec = (f * f).on_stack(); + let exp_normal: Vec = (f * g).to_stack(); + let exp_square: Vec = (f * f).to_stack(); assert_eq!(out_normal, exp_normal); assert_eq!(out_square, exp_square); @@ -84,7 +84,7 @@ fn setup_mul_fp12_test( label: label.to_string(), stack, segment: BnPairing, - memory: vec![(in0, f.on_stack()), (in1, g.on_stack())], + memory: vec![(in0, f.to_stack()), (in1, g.to_stack())], } } @@ -112,9 +112,9 @@ fn test_mul_fp12() -> Result<()> { let out_sparse: Vec = intrptr_sparse.extract_kernel_memory(BnPairing, out..out + 12); let out_square: Vec = intrptr_square.extract_kernel_memory(BnPairing, out..out + 12); - let exp_normal: Vec = (f * g).on_stack(); - let exp_sparse: Vec = (f * h).on_stack(); - let exp_square: Vec = (f * f).on_stack(); + let exp_normal: Vec = (f * g).to_stack(); + let exp_sparse: Vec = (f * h).to_stack(); + let exp_square: Vec = (f * f).to_stack(); assert_eq!(out_normal, exp_normal); assert_eq!(out_sparse, exp_sparse); @@ -126,7 +126,7 @@ fn test_mul_fp12() -> Result<()> { fn setup_frob_fp6_test(f: Fp6, n: usize) -> InterpreterMemoryInitialization { InterpreterMemoryInitialization { label: String::from("test_frob_fp254_6_") + &(n.to_string()), - stack: f.on_stack(), + stack: f.to_stack(), segment: BnPairing, memory: vec![], } @@ -140,7 +140,7 @@ fn test_frob_fp6() -> Result<()> { let setup_frob = setup_frob_fp6_test(f, n); let intrptr_frob: Interpreter = run_interpreter_with_memory(setup_frob).unwrap(); let out_frob: Vec = extract_stack(intrptr_frob); - let exp_frob: Vec = f.frob(n).on_stack(); + let exp_frob: Vec = f.frob(n).to_stack(); assert_eq!(out_frob, exp_frob); } Ok(()) @@ -151,7 +151,7 @@ fn setup_frob_fp12_test(ptr: usize, f: Fp12, n: usize) -> InterpreterMemo label: String::from("test_frob_fp254_12_") + &(n.to_string()), stack: vec![U256::from(ptr)], segment: BnPairing, - memory: vec![(ptr, f.on_stack())], + memory: vec![(ptr, f.to_stack())], } } @@ -164,7 +164,7 @@ fn test_frob_fp12() -> Result<()> { let setup_frob = setup_frob_fp12_test(ptr, f, n); let intrptr_frob: Interpreter = run_interpreter_with_memory(setup_frob).unwrap(); let out_frob: Vec = intrptr_frob.extract_kernel_memory(BnPairing, ptr..ptr + 12); - let exp_frob: Vec = f.frob(n).on_stack(); + let exp_frob: Vec = f.frob(n).to_stack(); assert_eq!(out_frob, exp_frob); } Ok(()) @@ -181,11 +181,11 @@ fn test_inv_fp12() -> Result<()> { label: "inv_fp254_12".to_string(), stack: vec![U256::from(ptr), U256::from(inv), U256::from(0xdeadbeefu32)], segment: BnPairing, - memory: vec![(ptr, f.on_stack())], + memory: vec![(ptr, f.to_stack())], }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, inv..inv + 12); - let expected: Vec = f.inv().on_stack(); + let expected: Vec = f.inv().to_stack(); assert_eq!(output, expected); @@ -202,12 +202,12 @@ fn test_invariant_exponent() -> Result<()> { label: "bn254_invariant_exponent".to_string(), stack: vec![U256::from(ptr), U256::from(0xdeadbeefu32)], segment: BnPairing, - memory: vec![(ptr, f.on_stack())], + memory: vec![(ptr, f.to_stack())], }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, ptr..ptr + 12); - let expected: Vec = invariant_exponent(f).on_stack(); + let expected: Vec = invariant_exponent(f).to_stack(); assert_eq!(output, expected); @@ -287,7 +287,7 @@ fn test_miller() -> Result<()> { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); - let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR).on_stack(); + let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack(); assert_eq!(output, expected); @@ -315,7 +315,7 @@ fn test_tate() -> Result<()> { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); - let expected = tate(CURVE_GENERATOR, TWISTED_GENERATOR).on_stack(); + let expected = tate(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack(); assert_eq!(output, expected); diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 72a1106c..dc5df22d 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -144,13 +144,6 @@ impl BLS381 { pub fn hi(self) -> U256 { U256(self.val.0[4..].try_into().unwrap()) } - - pub fn from_limbs(hi: U256, lo: U256) -> BLS381 { - let mut val = [0u64; 8]; - val[..4].copy_from_slice(&lo.0); - val[4..].copy_from_slice(&hi.0); - BLS381 { val: U512(val) } - } } impl Distribution for Standard { @@ -1208,25 +1201,60 @@ where } pub trait Stack { - fn on_stack(self) -> Vec; + fn to_stack(self) -> Vec; + + fn from_stack(stack: &[U256]) -> Self; } impl Stack for BLS381 { - fn on_stack(self) -> Vec { + fn to_stack(self) -> Vec { vec![self.lo(), self.hi()] } + + fn from_stack(stack: &[U256]) -> BLS381 { + let mut val = [0u64; 8]; + val[..4].copy_from_slice(&stack[1].0); + val[4..].copy_from_slice(&stack[0].0); + BLS381 { val: U512(val) } + } +} + +impl Stack for Fp2 { + fn to_stack(self) -> Vec { + let mut res = self.re.to_stack(); + res.extend(self.im.to_stack()); + res + } + + fn from_stack(stack: &[U256]) -> Fp2 { + let re = BLS381::from_stack(&stack[2..4]); + let im = BLS381::from_stack(&stack[0..2]); + Fp2 { re, im } + } } impl Stack for Fp6 { - fn on_stack(self) -> Vec { + fn to_stack(self) -> Vec { let f: [U256; 6] = unsafe { transmute(self) }; f.into_iter().collect() } + + 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 on_stack(self) -> Vec { + fn to_stack(self) -> Vec { let f: [U256; 12] = unsafe { transmute(self) }; f.into_iter().collect() } + + fn from_stack(stack: &[U256]) -> Self { + let mut f = [U256::zero(); 12]; + f.copy_from_slice(stack); + unsafe { transmute(f) } + } } From a6ccd350c41c111b7f15f2e6001260d70d79ba52 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 28 Mar 2023 11:35:01 -0700 Subject: [PATCH 04/24] cleanup --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 73 ++++++++++---------- evm/src/cpu/kernel/tests/bls381.rs | 2 + 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index c35a56e0..ad340d17 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -54,61 +54,62 @@ global test_sub_fp381: global add_fp381_2: - // stack: x: 2, x_: 2, y: 2, y_: 2 - %stack (x: 2, x_: 2, y: 2, y_: 2) -> (y_, x_, y, x) - // stack: y_: 2, x_: 2, y: 2, x: 2 + // stack: x_re, x_im, y_re, y_im, jumpdest + %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (y_im, x_im, y_re, x_re) + // stack: y_im, x_im, y_re, x_re, jumpdest %add_fp381 - // stack: z_: 2, y: 2, x: 2 - %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) - // stack: x: 2, y: 2, z_: 2 + // stack: z_im, y_re, x_re, jumpdest + %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) + // stack: x_re, y_re, z_im, jumpdest %add_fp381 - // stack: z: 2, z_: 2 - %jump(0xdeadbeef) + // stack: z_re, z_im, jumpdest + %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) + JUMP global mul_fp381_2: - // stack: a, b, c, d + // stack: x_re, x_im, y_re, y_im, jumpdest DUP4 DUP4 - // stack: b, a, b, c, d + // stack: x_im, x_re, x_im, y_re, y_im, jumpdest DUP8 DUP8 - // stack: c, b, a, b, c, d + // stack: y_re, x_im, x_re, x_im, y_re, y_im, jumpdest DUP12 DUP12 - // stack: d, c, b, a, b, c, d + // stack: y_im, y_re, x_im, x_re, x_im, y_re, y_im, jumpdest DUP8 DUP8 - // stack: a, d, c, b, a, b, c, d - - // stack: a, d, c, b, a, b, c, d + // stack: x_re , y_im, y_re, x_im, x_re, x_im, y_re, y_im, jumpdest %mul_fp381 - // stack: ad, c, b, a, b, c, d - %stack (ad: 2, c: 2, b: 2) -> (b, c, ad) - // stack: b, c, ad, a, b, c, d + // stack: x_re * y_im, y_re, x_im, x_re, x_im, y_re, y_im, jumpdest + %stack (v: 2, y_re: 2, x_im: 2) -> (x_im, y_re, v) + // stack: x_im , y_re, x_re*y_im, x_re, x_im, y_re, y_im, jumpdest %mul_fp381 - // stack: bc, ad, a, b, c, d + // stack: x_im * y_re, x_re*y_im, x_re, x_im, y_re, y_im, jumpdest %add_fp381 - // stack: z_im, a, b, c, d - %stack (z_im: 2, a: 2, b: 2, c: 2, d: 2) -> (b, d, c, a, z_im) - // stack: b, d, c, a, z_im + // stack: z_im, x_re, x_im, y_re, y_im, jumpdest + %stack (z_im: 2, x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (x_im, y_im, y_re, x_re, z_im) + // stack: x_im , y_im, y_re, x_re, z_im, jumpdest %mul_fp381 - // stack: bd, c, a, z_im - %stack (bd: 2, c: 2, a: 2) -> (a, c, bd) - // stack: a, c, bd, z_im + // stack: x_im * y_im, y_re, x_re, z_im, jumpdest + %stack (v: 2, y_re: 2, x_re: 2) -> (x_re, y_re, v) + // stack: x_re , y_re, x_im*y_im, z_im, jumpdest %mul_fp381 - // stack: ac, bd, z_im + // stack: x_re * y_re, x_im*y_im, z_im, jumpdest %sub_fp381 - // stack: z_re, z_im - %jump(0xdeadbeef) + // stack: z_re, z_im, jumpdest + %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) + JUMP global sub_fp381_2: - // stack: x: 2, x_: 2, y: 2, y_: 2 - %stack (x: 2, x_: 2, y: 2, y_: 2) -> (x_, y_, y, x) - // stack: x_: 2, y_: 2, y: 2, x: 2 + // stack: x_re, x_im, y_re, y_im, jumpdest + %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (x_im, y_im, y_re, x_re) + // stack: x_im, y_im, y_re, x_re, jumpdest %sub_fp381 - // stack: z_: 2, y: 2, x: 2 - %stack (z_: 2, y: 2, x: 2) -> (x, y, z_) - // stack: x: 2, y: 2, z_: 2 + // stack: z_im, y_re, x_re, jumpdest + %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) + // stack: x_re, y_re, z_im, jumpdest %sub_fp381 - // stack: z: 2, z_: 2 - %jump(0xdeadbeef) + // stack: z_re, z_im, jumpdest + %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) + JUMP diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index 69904a4e..4189323c 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use ethereum_types::U256; use rand::Rng; use crate::cpu::kernel::interpreter::{ @@ -41,6 +42,7 @@ fn test_bls_ops() -> Result<()> { fn run_and_return_bls_fp2(label: String, x: Fp2, y: Fp2) -> Fp2 { let mut stack = x.to_stack(); stack.extend(y.to_stack()); + stack.push(U256::from(0xdeadbeefu32)); let setup = InterpreterMemoryInitialization { label, stack, From 26da6dc7da83142748223d0cd71942596c3a9541 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 17:49:13 -0700 Subject: [PATCH 05/24] rev stack --- evm/src/cpu/kernel/tests/bls381.rs | 28 ++++++------ evm/src/cpu/kernel/tests/bn254.rs | 72 ++++++++++-------------------- evm/src/extension_tower.rs | 10 ++--- 3 files changed, 43 insertions(+), 67 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index 4189323c..21d2c334 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -8,18 +8,18 @@ use crate::cpu::kernel::interpreter::{ use crate::extension_tower::{Fp2, Stack, BLS381}; use crate::memory::segments::Segment::KernelGeneral; -fn run_and_return_bls(label: String, x: BLS381, y: BLS381) -> BLS381 { +fn run_and_return_bls(label: &str, x: BLS381, y: BLS381) -> BLS381 { let mut stack = x.to_stack(); stack.extend(y.to_stack()); let setup = InterpreterMemoryInitialization { - label, + label: label.to_string(), stack, segment: KernelGeneral, memory: vec![], }; let interpreter = run_interpreter_with_memory(setup).unwrap(); - let output = interpreter.stack(); - BLS381::from_stack(output) + let output: Vec = interpreter.stack().iter().rev().cloned().collect(); + BLS381::from_stack(&output) } #[test] @@ -28,9 +28,9 @@ fn test_bls_ops() -> Result<()> { let x: BLS381 = rng.gen::(); let y: BLS381 = rng.gen::(); - let output_add = run_and_return_bls("test_add_fp381".to_string(), x, y); - let output_mul = run_and_return_bls("test_mul_fp381".to_string(), x, y); - let output_sub = run_and_return_bls("test_sub_fp381".to_string(), x, y); + let output_add = run_and_return_bls("test_add_fp381", x, y); + let output_mul = run_and_return_bls("test_mul_fp381", x, y); + let output_sub = run_and_return_bls("test_sub_fp381", x, y); assert_eq!(output_add, x + y); assert_eq!(output_mul, x * y); @@ -39,19 +39,19 @@ fn test_bls_ops() -> Result<()> { Ok(()) } -fn run_and_return_bls_fp2(label: String, x: Fp2, y: Fp2) -> Fp2 { +fn run_and_return_bls_fp2(label: &str, x: Fp2, y: Fp2) -> Fp2 { let mut stack = x.to_stack(); stack.extend(y.to_stack()); stack.push(U256::from(0xdeadbeefu32)); let setup = InterpreterMemoryInitialization { - label, + label: label.to_string(), stack, segment: KernelGeneral, memory: vec![], }; let interpreter = run_interpreter_with_memory(setup).unwrap(); - let output = interpreter.stack(); - Fp2::from_stack(output) + let output: Vec = interpreter.stack().iter().rev().cloned().collect(); + Fp2::::from_stack(&output) } #[test] @@ -60,9 +60,9 @@ fn test_bls_fp2() -> Result<()> { let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); - let output_add = run_and_return_bls_fp2("add_fp381_2".to_string(), x, y); - let output_mul = run_and_return_bls_fp2("mul_fp381_2".to_string(), x, y); - let output_sub = run_and_return_bls_fp2("sub_fp381_2".to_string(), x, y); + let output_add = run_and_return_bls_fp2("add_fp381_2", x, y); + let output_mul = run_and_return_bls_fp2("mul_fp381_2", x, y); + let output_sub = run_and_return_bls_fp2("sub_fp381_2", x, y); assert_eq!(output_add, x + y); assert_eq!(output_mul, x * y); diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index 6a5acea9..96732bba 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -20,22 +20,21 @@ fn extract_stack(interpreter: Interpreter<'static>) -> Vec { .collect::>() } -fn setup_mul_fp6_test( - f: Fp6, - g: Fp6, - label: &str, -) -> InterpreterMemoryInitialization { +fn run_and_return_bn_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { let mut stack = f.to_stack(); if label == "mul_fp254_6" { stack.extend(g.to_stack()); } stack.push(U256::from(0xdeadbeefu32)); - InterpreterMemoryInitialization { + let setup = InterpreterMemoryInitialization { label: label.to_string(), stack, segment: BnPairing, memory: vec![], - } + }; + let interpreter = run_interpreter_with_memory(setup).unwrap(); + let output: Vec = interpreter.stack().iter().rev().cloned().collect(); + Fp6::::from_stack(&output) } #[test] @@ -44,32 +43,23 @@ fn test_mul_fp6() -> Result<()> { let f: Fp6 = rng.gen::>(); let g: Fp6 = rng.gen::>(); - let setup_normal: InterpreterMemoryInitialization = setup_mul_fp6_test(f, g, "mul_fp254_6"); - let setup_square: InterpreterMemoryInitialization = setup_mul_fp6_test(f, f, "square_fp254_6"); + let output_mul: Fp6 = run_and_return_bn_fp6(f, g, "mul_fp254_6"); + let output_square: Fp6 = run_and_return_bn_fp6(f, f, "square_fp254_6"); - let intrptr_normal: Interpreter = run_interpreter_with_memory(setup_normal).unwrap(); - let intrptr_square: Interpreter = run_interpreter_with_memory(setup_square).unwrap(); - - let out_normal: Vec = extract_stack(intrptr_normal); - let out_square: Vec = extract_stack(intrptr_square); - - let exp_normal: Vec = (f * g).to_stack(); - let exp_square: Vec = (f * f).to_stack(); - - assert_eq!(out_normal, exp_normal); - assert_eq!(out_square, exp_square); + assert_eq!(output_mul, f * g); + assert_eq!(output_square, f * f); Ok(()) } -fn setup_mul_fp12_test( - out: usize, +fn run_and_return_bn_fp12( f: Fp12, g: Fp12, label: &str, -) -> InterpreterMemoryInitialization { +) -> Fp12 { let in0: usize = 200; let in1: usize = 212; + let out: usize = 224; let mut stack = vec![ U256::from(in0), @@ -80,45 +70,31 @@ fn setup_mul_fp12_test( if label == "square_fp254_12" { stack.remove(0); } - InterpreterMemoryInitialization { + let setup = InterpreterMemoryInitialization { label: label.to_string(), stack, segment: BnPairing, memory: vec![(in0, f.to_stack()), (in1, g.to_stack())], - } + }; + let interpreter = run_interpreter_with_memory(setup).unwrap(); + let output = interpreter.extract_kernel_memory(BnPairing, out..out + 12); + Fp12::::from_stack(&output) } #[test] fn test_mul_fp12() -> Result<()> { - let out: usize = 224; - let mut rng = rand::thread_rng(); let f: Fp12 = rng.gen::>(); let g: Fp12 = rng.gen::>(); let h: Fp12 = gen_fp12_sparse(&mut rng); - let setup_normal: InterpreterMemoryInitialization = - setup_mul_fp12_test(out, f, g, "mul_fp254_12"); - let setup_sparse: InterpreterMemoryInitialization = - setup_mul_fp12_test(out, f, h, "mul_fp254_12_sparse"); - let setup_square: InterpreterMemoryInitialization = - setup_mul_fp12_test(out, f, f, "square_fp254_12"); + let output_normal = run_and_return_bn_fp12(f, g, "mul_fp254_12"); + let output_sparse = run_and_return_bn_fp12(f, h, "mul_fp254_12_sparse"); + let output_square = run_and_return_bn_fp12(f, f, "square_fp254_12"); - let intrptr_normal: Interpreter = run_interpreter_with_memory(setup_normal).unwrap(); - let intrptr_sparse: Interpreter = run_interpreter_with_memory(setup_sparse).unwrap(); - let intrptr_square: Interpreter = run_interpreter_with_memory(setup_square).unwrap(); - - let out_normal: Vec = intrptr_normal.extract_kernel_memory(BnPairing, out..out + 12); - let out_sparse: Vec = intrptr_sparse.extract_kernel_memory(BnPairing, out..out + 12); - let out_square: Vec = intrptr_square.extract_kernel_memory(BnPairing, out..out + 12); - - let exp_normal: Vec = (f * g).to_stack(); - let exp_sparse: Vec = (f * h).to_stack(); - let exp_square: Vec = (f * f).to_stack(); - - assert_eq!(out_normal, exp_normal); - assert_eq!(out_sparse, exp_sparse); - assert_eq!(out_square, exp_square); + assert_eq!(output_normal, f * g); + assert_eq!(output_sparse, f * h); + assert_eq!(output_square, f * f); Ok(()) } diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index dc5df22d..8e7879d5 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1213,8 +1213,8 @@ impl Stack for BLS381 { fn from_stack(stack: &[U256]) -> BLS381 { let mut val = [0u64; 8]; - val[..4].copy_from_slice(&stack[1].0); - val[4..].copy_from_slice(&stack[0].0); + val[..4].copy_from_slice(&stack[0].0); + val[4..].copy_from_slice(&stack[1].0); BLS381 { val: U512(val) } } } @@ -1227,8 +1227,8 @@ impl Stack for Fp2 { } fn from_stack(stack: &[U256]) -> Fp2 { - let re = BLS381::from_stack(&stack[2..4]); - let im = BLS381::from_stack(&stack[0..2]); + let re = BLS381::from_stack(&stack[0..2]); + let im = BLS381::from_stack(&stack[2..4]); Fp2 { re, im } } } @@ -1254,7 +1254,7 @@ impl Stack for Fp12 { fn from_stack(stack: &[U256]) -> Self { let mut f = [U256::zero(); 12]; - f.copy_from_slice(stack); + f.copy_from_slice(stack); unsafe { transmute(f) } } } From 0e3b86def8636cea8e9f76e18281ae4a5a861810 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 17:59:38 -0700 Subject: [PATCH 06/24] frob --- evm/src/cpu/kernel/tests/bn254.rs | 42 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index 96732bba..7b4eeb16 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -43,10 +43,10 @@ fn test_mul_fp6() -> Result<()> { let f: Fp6 = rng.gen::>(); let g: Fp6 = rng.gen::>(); - let output_mul: Fp6 = run_and_return_bn_fp6(f, g, "mul_fp254_6"); + let output_normal: Fp6 = run_and_return_bn_fp6(f, g, "mul_fp254_6"); let output_square: Fp6 = run_and_return_bn_fp6(f, f, "square_fp254_6"); - assert_eq!(output_mul, f * g); + assert_eq!(output_normal, f * g); assert_eq!(output_square, f * f); Ok(()) @@ -99,13 +99,16 @@ fn test_mul_fp12() -> Result<()> { Ok(()) } -fn setup_frob_fp6_test(f: Fp6, n: usize) -> InterpreterMemoryInitialization { - InterpreterMemoryInitialization { - label: String::from("test_frob_fp254_6_") + &(n.to_string()), +fn run_and_return_frob_fp6(n: usize, f: Fp6) -> Fp6 { + let setup = InterpreterMemoryInitialization { + label: format!("test_frob_fp254_6_{}", n.to_string()), stack: f.to_stack(), segment: BnPairing, memory: vec![], - } + }; + let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); + let output: Vec = interpreter.stack().iter().rev().cloned().collect(); + Fp6::::from_stack(&output) } #[test] @@ -113,35 +116,32 @@ fn test_frob_fp6() -> Result<()> { let mut rng = rand::thread_rng(); let f: Fp6 = rng.gen::>(); for n in 1..4 { - let setup_frob = setup_frob_fp6_test(f, n); - let intrptr_frob: Interpreter = run_interpreter_with_memory(setup_frob).unwrap(); - let out_frob: Vec = extract_stack(intrptr_frob); - let exp_frob: Vec = f.frob(n).to_stack(); - assert_eq!(out_frob, exp_frob); + let output = run_and_return_frob_fp6(n, f); + assert_eq!(output, f.frob(n)); } Ok(()) } -fn setup_frob_fp12_test(ptr: usize, f: Fp12, n: usize) -> InterpreterMemoryInitialization { - InterpreterMemoryInitialization { - label: String::from("test_frob_fp254_12_") + &(n.to_string()), +fn setup_frob_fp12_test(n: usize, f: Fp12) -> Fp12 { + let ptr: usize = 200; + let setup = InterpreterMemoryInitialization { + label: format!("test_frob_fp254_12_{}", n.to_string()), stack: vec![U256::from(ptr)], segment: BnPairing, memory: vec![(ptr, f.to_stack())], - } + }; + let interpeter: Interpreter = run_interpreter_with_memory(setup).unwrap(); + let output: Vec = interpeter.extract_kernel_memory(BnPairing, ptr..ptr + 12); + Fp12::::from_stack(&output) } #[test] fn test_frob_fp12() -> Result<()> { - let ptr: usize = 200; let mut rng = rand::thread_rng(); let f: Fp12 = rng.gen::>(); for n in [1, 2, 3, 6] { - let setup_frob = setup_frob_fp12_test(ptr, f, n); - let intrptr_frob: Interpreter = run_interpreter_with_memory(setup_frob).unwrap(); - let out_frob: Vec = intrptr_frob.extract_kernel_memory(BnPairing, ptr..ptr + 12); - let exp_frob: Vec = f.frob(n).to_stack(); - assert_eq!(out_frob, exp_frob); + let output = setup_frob_fp12_test(n, f); + assert_eq!(output, f.frob(n)); } Ok(()) } From 4e48fc430f0284e4fb640342dc022076bc33068d Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 19:37:14 -0700 Subject: [PATCH 07/24] all Stacks --- evm/src/extension_tower.rs | 58 +++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 8e7879d5..242414bd 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1206,6 +1206,32 @@ pub trait Stack { fn from_stack(stack: &[U256]) -> Self; } +impl Stack for Fp6 { + fn to_stack(self) -> Vec { + let f: [U256; 6] = unsafe { transmute(self) }; + f.into_iter().collect() + } + + 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) -> Vec { + let f: [U256; 12] = unsafe { transmute(self) }; + f.into_iter().collect() + } + + fn from_stack(stack: &[U256]) -> Self { + let mut f = [U256::zero(); 12]; + f.copy_from_slice(stack); + unsafe { transmute(f) } + } +} + impl Stack for BLS381 { fn to_stack(self) -> Vec { vec![self.lo(), self.hi()] @@ -1233,28 +1259,32 @@ impl Stack for Fp2 { } } -impl Stack for Fp6 { +impl Stack for Fp6 { fn to_stack(self) -> Vec { - let f: [U256; 6] = unsafe { transmute(self) }; - f.into_iter().collect() + let mut res = self.t0.to_stack(); + res.extend(self.t1.to_stack()); + res.extend(self.t2.to_stack()); + res } - fn from_stack(stack: &[U256]) -> Self { - let mut f = [U256::zero(); 6]; - f.copy_from_slice(stack); - unsafe { transmute(f) } + 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 } } } -impl Stack for Fp12 { +impl Stack for Fp12 { fn to_stack(self) -> Vec { - let f: [U256; 12] = unsafe { transmute(self) }; - f.into_iter().collect() + let mut res = self.z0.to_stack(); + res.extend(self.z1.to_stack()); + res } - fn from_stack(stack: &[U256]) -> Self { - let mut f = [U256::zero(); 12]; - f.copy_from_slice(stack); - unsafe { transmute(f) } + 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 } } } From 251d7e34f34a6b6afe31b55e2d8c8a891db0b8eb Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 19:42:18 -0700 Subject: [PATCH 08/24] systematize names --- evm/src/cpu/kernel/tests/bn254.rs | 52 ++++++++++++------------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index 7b4eeb16..1c809c74 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -11,16 +11,8 @@ use crate::cpu::kernel::interpreter::{ use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254}; use crate::memory::segments::Segment::BnPairing; -fn extract_stack(interpreter: Interpreter<'static>) -> Vec { - interpreter - .stack() - .iter() - .rev() - .cloned() - .collect::>() -} -fn run_and_return_bn_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { +fn run_bn_mul_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { let mut stack = f.to_stack(); if label == "mul_fp254_6" { stack.extend(g.to_stack()); @@ -38,13 +30,13 @@ fn run_and_return_bn_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 Result<()> { +fn test_bn_mul_fp6() -> Result<()> { let mut rng = rand::thread_rng(); let f: Fp6 = rng.gen::>(); let g: Fp6 = rng.gen::>(); - let output_normal: Fp6 = run_and_return_bn_fp6(f, g, "mul_fp254_6"); - let output_square: Fp6 = run_and_return_bn_fp6(f, f, "square_fp254_6"); + let output_normal: Fp6 = run_bn_mul_fp6(f, g, "mul_fp254_6"); + let output_square: Fp6 = run_bn_mul_fp6(f, f, "square_fp254_6"); assert_eq!(output_normal, f * g); assert_eq!(output_square, f * f); @@ -52,11 +44,7 @@ fn test_mul_fp6() -> Result<()> { Ok(()) } -fn run_and_return_bn_fp12( - f: Fp12, - g: Fp12, - label: &str, -) -> Fp12 { +fn run_bn_mul_fp12(f: Fp12, g: Fp12, label: &str) -> Fp12 { let in0: usize = 200; let in1: usize = 212; let out: usize = 224; @@ -82,15 +70,15 @@ fn run_and_return_bn_fp12( } #[test] -fn test_mul_fp12() -> Result<()> { +fn test_bn_mul_fp12() -> Result<()> { let mut rng = rand::thread_rng(); let f: Fp12 = rng.gen::>(); let g: Fp12 = rng.gen::>(); let h: Fp12 = gen_fp12_sparse(&mut rng); - let output_normal = run_and_return_bn_fp12(f, g, "mul_fp254_12"); - let output_sparse = run_and_return_bn_fp12(f, h, "mul_fp254_12_sparse"); - let output_square = run_and_return_bn_fp12(f, f, "square_fp254_12"); + let output_normal = run_bn_mul_fp12(f, g, "mul_fp254_12"); + let output_sparse = run_bn_mul_fp12(f, h, "mul_fp254_12_sparse"); + let output_square = run_bn_mul_fp12(f, f, "square_fp254_12"); assert_eq!(output_normal, f * g); assert_eq!(output_sparse, f * h); @@ -99,7 +87,7 @@ fn test_mul_fp12() -> Result<()> { Ok(()) } -fn run_and_return_frob_fp6(n: usize, f: Fp6) -> Fp6 { +fn run_bn_frob_fp6(n: usize, f: Fp6) -> Fp6 { let setup = InterpreterMemoryInitialization { label: format!("test_frob_fp254_6_{}", n.to_string()), stack: f.to_stack(), @@ -112,17 +100,17 @@ fn run_and_return_frob_fp6(n: usize, f: Fp6) -> Fp6 { } #[test] -fn test_frob_fp6() -> Result<()> { +fn test_bn_frob_fp6() -> Result<()> { let mut rng = rand::thread_rng(); let f: Fp6 = rng.gen::>(); for n in 1..4 { - let output = run_and_return_frob_fp6(n, f); + let output = run_bn_frob_fp6(n, f); assert_eq!(output, f.frob(n)); } Ok(()) } -fn setup_frob_fp12_test(n: usize, f: Fp12) -> Fp12 { +fn run_bn_frob_fp12(n: usize, f: Fp12) -> Fp12 { let ptr: usize = 200; let setup = InterpreterMemoryInitialization { label: format!("test_frob_fp254_12_{}", n.to_string()), @@ -140,14 +128,14 @@ fn test_frob_fp12() -> Result<()> { let mut rng = rand::thread_rng(); let f: Fp12 = rng.gen::>(); for n in [1, 2, 3, 6] { - let output = setup_frob_fp12_test(n, f); + let output = run_bn_frob_fp12(n, f); assert_eq!(output, f.frob(n)); } Ok(()) } #[test] -fn test_inv_fp12() -> Result<()> { +fn test_bn_inv_fp12() -> Result<()> { let ptr: usize = 200; let inv: usize = 212; let mut rng = rand::thread_rng(); @@ -161,15 +149,15 @@ fn test_inv_fp12() -> Result<()> { }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, inv..inv + 12); - let expected: Vec = f.inv().to_stack(); + let output = Fp12::::from_stack(&output); - assert_eq!(output, expected); + assert_eq!(output, f.inv()); Ok(()) } #[test] -fn test_invariant_exponent() -> Result<()> { +fn test_bn_final_exponentiation() -> Result<()> { let ptr: usize = 200; let mut rng = rand::thread_rng(); let f: Fp12 = rng.gen::>(); @@ -243,7 +231,7 @@ pub const TWISTED_GENERATOR: TwistedCurve = { }; #[test] -fn test_miller() -> Result<()> { +fn test_bn_miller_loop() -> Result<()> { let ptr: usize = 200; let out: usize = 206; let inputs: Vec = vec![ @@ -271,7 +259,7 @@ fn test_miller() -> Result<()> { } #[test] -fn test_tate() -> Result<()> { +fn test_bn_tate_pairing() -> Result<()> { let ptr: usize = 200; let out: usize = 206; let inputs: Vec = vec![ From 33dc8eaea70b102143eab3bb6735022b208d26ad Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 19:43:24 -0700 Subject: [PATCH 09/24] better names --- evm/src/cpu/kernel/tests/bls381.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index 21d2c334..fa20e20e 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -8,7 +8,7 @@ use crate::cpu::kernel::interpreter::{ use crate::extension_tower::{Fp2, Stack, BLS381}; use crate::memory::segments::Segment::KernelGeneral; -fn run_and_return_bls(label: &str, x: BLS381, y: BLS381) -> BLS381 { +fn run_bls_ops(label: &str, x: BLS381, y: BLS381) -> BLS381 { let mut stack = x.to_stack(); stack.extend(y.to_stack()); let setup = InterpreterMemoryInitialization { @@ -28,9 +28,9 @@ fn test_bls_ops() -> Result<()> { let x: BLS381 = rng.gen::(); let y: BLS381 = rng.gen::(); - let output_add = run_and_return_bls("test_add_fp381", x, y); - let output_mul = run_and_return_bls("test_mul_fp381", x, y); - let output_sub = run_and_return_bls("test_sub_fp381", x, y); + let output_add = run_bls_ops("test_add_fp381", x, y); + let output_mul = run_bls_ops("test_mul_fp381", x, y); + let output_sub = run_bls_ops("test_sub_fp381", x, y); assert_eq!(output_add, x + y); assert_eq!(output_mul, x * y); @@ -39,7 +39,7 @@ fn test_bls_ops() -> Result<()> { Ok(()) } -fn run_and_return_bls_fp2(label: &str, x: Fp2, y: Fp2) -> Fp2 { +fn run_bls_fp2_ops(label: &str, x: Fp2, y: Fp2) -> Fp2 { let mut stack = x.to_stack(); stack.extend(y.to_stack()); stack.push(U256::from(0xdeadbeefu32)); @@ -60,9 +60,9 @@ fn test_bls_fp2() -> Result<()> { let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); - let output_add = run_and_return_bls_fp2("add_fp381_2", x, y); - let output_mul = run_and_return_bls_fp2("mul_fp381_2", x, y); - let output_sub = run_and_return_bls_fp2("sub_fp381_2", x, y); + let output_add = run_bls_fp2_ops("add_fp381_2", x, y); + let output_mul = run_bls_fp2_ops("mul_fp381_2", x, y); + let output_sub = run_bls_fp2_ops("sub_fp381_2", x, y); assert_eq!(output_add, x + y); assert_eq!(output_mul, x * y); From 93dd25a1c42cc3ca54cf2530f9a4b3312ad86f5e Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 19:45:32 -0700 Subject: [PATCH 10/24] fmt --- evm/src/cpu/kernel/tests/bls381.rs | 2 +- evm/src/cpu/kernel/tests/bn254.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index fa20e20e..1b988065 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -55,7 +55,7 @@ fn run_bls_fp2_ops(label: &str, x: Fp2, y: Fp2) -> Fp2 { } #[test] -fn test_bls_fp2() -> Result<()> { +fn test_bls_fp2_ops() -> Result<()> { let mut rng = rand::thread_rng(); let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index 1c809c74..be93cc7f 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -11,7 +11,6 @@ use crate::cpu::kernel::interpreter::{ use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254}; use crate::memory::segments::Segment::BnPairing; - fn run_bn_mul_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { let mut stack = f.to_stack(); if label == "mul_fp254_6" { From 889911e803060e6d70b5d54f884523bdc792aa78 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Mon, 3 Apr 2023 19:54:37 -0700 Subject: [PATCH 11/24] redundancy --- evm/src/cpu/kernel/tests/bn254.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index be93cc7f..e8bf3f28 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -88,7 +88,7 @@ fn test_bn_mul_fp12() -> Result<()> { fn run_bn_frob_fp6(n: usize, f: Fp6) -> Fp6 { let setup = InterpreterMemoryInitialization { - label: format!("test_frob_fp254_6_{}", n.to_string()), + label: format!("test_frob_fp254_6_{}", n), stack: f.to_stack(), segment: BnPairing, memory: vec![], @@ -112,7 +112,7 @@ fn test_bn_frob_fp6() -> Result<()> { fn run_bn_frob_fp12(n: usize, f: Fp12) -> Fp12 { let ptr: usize = 200; let setup = InterpreterMemoryInitialization { - label: format!("test_frob_fp254_12_{}", n.to_string()), + label: format!("test_frob_fp254_12_{}", n), stack: vec![U256::from(ptr)], segment: BnPairing, memory: vec![(ptr, f.to_stack())], From b202196b5fa35b20a062cdf695bf68617b27881a Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 11 Apr 2023 15:30:03 -0700 Subject: [PATCH 12/24] switch --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 86 +++++++++++--------- evm/src/cpu/kernel/tests/bls381.rs | 10 +-- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index ad340d17..1417c2b4 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -12,20 +12,6 @@ // stack: z0, z1 %endmacro -%macro mul_fp381 - // stack: x0, x1, y0, y1 - PROVER_INPUT(sf::bls381_base::mul_hi) - // stack: z1, x0, x1, y0, y1 - SWAP4 - // stack: y1, x0, x1, y0, z1 - PROVER_INPUT(sf::bls381_base::mul_lo) - // stack: z0, y1, x0, x1, y0, z1 - SWAP4 - // stack: y0, y1, x0, x1, z0, z1 - %pop4 - // stack: z0, z1 -%endmacro - %macro sub_fp381 // stack: x0, x1, y0, y1 PROVER_INPUT(sf::bls381_base::sub_hi) @@ -40,31 +26,65 @@ // stack: z0, z1 %endmacro +%macro mul_fp381 + // stack: x0, x1, y0, y1 + PROVER_INPUT(sf::bls381_base::mul_hi) + // stack: z1, x0, x1, y0, y1 + SWAP4 + // stack: y1, x0, x1, y0, z1 + PROVER_INPUT(sf::bls381_base::mul_lo) + // stack: z0, y1, x0, x1, y0, z1 + SWAP4 + // stack: y0, y1, x0, x1, z0, z1 + %pop4 + // stack: z0, z1 +%endmacro + global test_add_fp381: %add_fp381 %jump(0xdeadbeef) -global test_mul_fp381: - %mul_fp381 - %jump(0xdeadbeef) - global test_sub_fp381: %sub_fp381 %jump(0xdeadbeef) +global test_mul_fp381: + %mul_fp381 + %jump(0xdeadbeef) -global add_fp381_2: - // stack: x_re, x_im, y_re, y_im, jumpdest + +%macro add_fp381_2 + // stack: x_re, x_im, y_re, y_im %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (y_im, x_im, y_re, x_re) - // stack: y_im, x_im, y_re, x_re, jumpdest + // stack: y_im, x_im, y_re, x_re %add_fp381 - // stack: z_im, y_re, x_re, jumpdest + // stack: z_im, y_re, x_re %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) - // stack: x_re, y_re, z_im, jumpdest + // stack: x_re, y_re, z_im %add_fp381 - // stack: z_re, z_im, jumpdest - %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) - JUMP + // stack: z_re, z_im +%endmacro + +%macro sub_fp381_2 + // stack: x_re, x_im, y_re, y_im + %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (x_im, y_im, y_re, x_re) + // stack: x_im, y_im, y_re, x_re + %sub_fp381 + // stack: z_im, y_re, x_re + %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) + // stack: x_re, y_re, z_im + %sub_fp381 + // stack: z_re, z_im +%endmacro + +global test_add_fp381_2: + %add_fp381_2 + %jump(0xdeadbeef) + +global test_sub_fp381_2: + %sub_fp381_2 + %jump(0xdeadbeef) + global mul_fp381_2: // stack: x_re, x_im, y_re, y_im, jumpdest @@ -100,16 +120,4 @@ global mul_fp381_2: // stack: z_re, z_im, jumpdest %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) JUMP - -global sub_fp381_2: - // stack: x_re, x_im, y_re, y_im, jumpdest - %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (x_im, y_im, y_re, x_re) - // stack: x_im, y_im, y_re, x_re, jumpdest - %sub_fp381 - // stack: z_im, y_re, x_re, jumpdest - %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) - // stack: x_re, y_re, z_im, jumpdest - %sub_fp381 - // stack: z_re, z_im, jumpdest - %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) - JUMP + \ No newline at end of file diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index 1b988065..96ff51ce 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -29,12 +29,12 @@ fn test_bls_ops() -> Result<()> { let y: BLS381 = rng.gen::(); let output_add = run_bls_ops("test_add_fp381", x, y); - let output_mul = run_bls_ops("test_mul_fp381", x, y); let output_sub = run_bls_ops("test_sub_fp381", x, y); + let output_mul = run_bls_ops("test_mul_fp381", x, y); assert_eq!(output_add, x + y); - assert_eq!(output_mul, x * y); assert_eq!(output_sub, x - y); + assert_eq!(output_mul, x * y); Ok(()) } @@ -60,13 +60,13 @@ fn test_bls_fp2_ops() -> Result<()> { let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); - let output_add = run_bls_fp2_ops("add_fp381_2", x, y); + let output_add = run_bls_fp2_ops("test_add_fp381_2", x, y); + let output_sub = run_bls_fp2_ops("test_sub_fp381_2", x, y); let output_mul = run_bls_fp2_ops("mul_fp381_2", x, y); - let output_sub = run_bls_fp2_ops("sub_fp381_2", x, y); assert_eq!(output_add, x + y); - assert_eq!(output_mul, x * y); assert_eq!(output_sub, x - y); + assert_eq!(output_mul, x * y); Ok(()) } From 9b9cd735b5607aedc74d2c1874e7cab942db155c Mon Sep 17 00:00:00 2001 From: Dima V <50062893+typ3c4t@users.noreply.github.com> Date: Fri, 14 Apr 2023 09:35:19 -0700 Subject: [PATCH 13/24] Update evm/src/extension_tower.rs Co-authored-by: Jacqueline Nabaglo --- evm/src/extension_tower.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 242414bd..139b1b11 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1201,7 +1201,7 @@ where } pub trait Stack { - fn to_stack(self) -> Vec; + fn to_stack(&self) -> Vec; fn from_stack(stack: &[U256]) -> Self; } From 0b9ef768d4d03b9e5c9afe1041be95e6cdfe00df Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 14 Apr 2023 09:36:27 -0700 Subject: [PATCH 14/24] nl --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 1 - 1 file changed, 1 deletion(-) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index 1417c2b4..9b509641 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -120,4 +120,3 @@ global mul_fp381_2: // stack: z_re, z_im, jumpdest %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) JUMP - \ No newline at end of file From 0b85c8bbe001a97b6c3c608c4795c70f3c37d620 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 14 Apr 2023 09:49:22 -0700 Subject: [PATCH 15/24] getting there --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 22 ------- evm/src/cpu/kernel/tests/bls381.rs | 68 ++++---------------- evm/src/extension_tower.rs | 12 ++-- 3 files changed, 20 insertions(+), 82 deletions(-) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index 9b509641..abde744e 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -40,19 +40,6 @@ // stack: z0, z1 %endmacro -global test_add_fp381: - %add_fp381 - %jump(0xdeadbeef) - -global test_sub_fp381: - %sub_fp381 - %jump(0xdeadbeef) - -global test_mul_fp381: - %mul_fp381 - %jump(0xdeadbeef) - - %macro add_fp381_2 // stack: x_re, x_im, y_re, y_im %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (y_im, x_im, y_re, x_re) @@ -77,15 +64,6 @@ global test_mul_fp381: // stack: z_re, z_im %endmacro -global test_add_fp381_2: - %add_fp381_2 - %jump(0xdeadbeef) - -global test_sub_fp381_2: - %sub_fp381_2 - %jump(0xdeadbeef) - - global mul_fp381_2: // stack: x_re, x_im, y_re, y_im, jumpdest DUP4 diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index 96ff51ce..f1d5a72a 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -8,65 +8,25 @@ use crate::cpu::kernel::interpreter::{ use crate::extension_tower::{Fp2, Stack, BLS381}; use crate::memory::segments::Segment::KernelGeneral; -fn run_bls_ops(label: &str, x: BLS381, y: BLS381) -> BLS381 { - let mut stack = x.to_stack(); - stack.extend(y.to_stack()); - let setup = InterpreterMemoryInitialization { - label: label.to_string(), - stack, - segment: KernelGeneral, - memory: vec![], - }; - let interpreter = run_interpreter_with_memory(setup).unwrap(); - let output: Vec = interpreter.stack().iter().rev().cloned().collect(); - BLS381::from_stack(&output) -} - #[test] -fn test_bls_ops() -> Result<()> { - let mut rng = rand::thread_rng(); - let x: BLS381 = rng.gen::(); - let y: BLS381 = rng.gen::(); - - let output_add = run_bls_ops("test_add_fp381", x, y); - let output_sub = run_bls_ops("test_sub_fp381", x, y); - let output_mul = run_bls_ops("test_mul_fp381", x, y); - - assert_eq!(output_add, x + y); - assert_eq!(output_sub, x - y); - assert_eq!(output_mul, x * y); - - Ok(()) -} - -fn run_bls_fp2_ops(label: &str, x: Fp2, y: Fp2) -> Fp2 { - let mut stack = x.to_stack(); - stack.extend(y.to_stack()); - stack.push(U256::from(0xdeadbeefu32)); - let setup = InterpreterMemoryInitialization { - label: label.to_string(), - stack, - segment: KernelGeneral, - memory: vec![], - }; - let interpreter = run_interpreter_with_memory(setup).unwrap(); - let output: Vec = interpreter.stack().iter().rev().cloned().collect(); - Fp2::::from_stack(&output) -} - -#[test] -fn test_bls_fp2_ops() -> Result<()> { +fn test_bls_fp2_mul() -> Result<()> { let mut rng = rand::thread_rng(); let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); - let output_add = run_bls_fp2_ops("test_add_fp381_2", x, y); - let output_sub = run_bls_fp2_ops("test_sub_fp381_2", x, y); - let output_mul = run_bls_fp2_ops("mul_fp381_2", x, y); - - assert_eq!(output_add, x + y); - assert_eq!(output_sub, x - y); - assert_eq!(output_mul, x * y); + let mut stack = x.to_stack(); + stack.extend(y.to_stack()); + stack.push(U256::from(0xdeadbeefu32)); + let setup = InterpreterMemoryInitialization { + label: "mul_fp381_2".to_string(), + stack, + segment: KernelGeneral, + memory: vec![], + }; + let interpreter = run_interpreter_with_memory(setup).unwrap(); + let stack: Vec = interpreter.stack().iter().rev().cloned().collect(); + let output = Fp2::::from_stack(&stack); + assert_eq!(output, x * y); Ok(()) } diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 139b1b11..b9600fdc 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1207,7 +1207,7 @@ pub trait Stack { } impl Stack for Fp6 { - fn to_stack(self) -> Vec { + fn to_stack(&self) -> Vec { let f: [U256; 6] = unsafe { transmute(self) }; f.into_iter().collect() } @@ -1220,7 +1220,7 @@ impl Stack for Fp6 { } impl Stack for Fp12 { - fn to_stack(self) -> Vec { + fn to_stack(&self) -> Vec { let f: [U256; 12] = unsafe { transmute(self) }; f.into_iter().collect() } @@ -1233,7 +1233,7 @@ impl Stack for Fp12 { } impl Stack for BLS381 { - fn to_stack(self) -> Vec { + fn to_stack(&self) -> Vec { vec![self.lo(), self.hi()] } @@ -1246,7 +1246,7 @@ impl Stack for BLS381 { } impl Stack for Fp2 { - fn to_stack(self) -> Vec { + fn to_stack(&self) -> Vec { let mut res = self.re.to_stack(); res.extend(self.im.to_stack()); res @@ -1260,7 +1260,7 @@ impl Stack for Fp2 { } impl Stack for Fp6 { - fn to_stack(self) -> Vec { + fn to_stack(&self) -> Vec { let mut res = self.t0.to_stack(); res.extend(self.t1.to_stack()); res.extend(self.t2.to_stack()); @@ -1276,7 +1276,7 @@ impl Stack for Fp6 { } impl Stack for Fp12 { - fn to_stack(self) -> Vec { + fn to_stack(&self) -> Vec { let mut res = self.z0.to_stack(); res.extend(self.z1.to_stack()); res From 191ca1026a840f54c3891f8ec7151749e7f74852 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 14 Apr 2023 09:50:30 -0700 Subject: [PATCH 16/24] comment --- evm/src/cpu/kernel/asm/curve/bls381/util.asm | 1 + 1 file changed, 1 insertion(+) diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index abde744e..13943be7 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -64,6 +64,7 @@ // stack: z_re, z_im %endmacro +// note that {x,y}_{re,im} all take up two stack terms global mul_fp381_2: // stack: x_re, x_im, y_re, y_im, jumpdest DUP4 From 3cc39fa49352c1330c0d5ef51e32a3c5961ec33e Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 14 Apr 2023 10:31:07 -0700 Subject: [PATCH 17/24] wip --- evm/src/extension_tower.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index b9600fdc..6ffd528c 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1201,13 +1201,13 @@ where } pub trait Stack { - fn to_stack(&self) -> Vec; + fn to_stack(&self) -> &[U256]; fn from_stack(stack: &[U256]) -> Self; } impl Stack for Fp6 { - fn to_stack(&self) -> Vec { + fn to_stack(&self) -> &[U256] { let f: [U256; 6] = unsafe { transmute(self) }; f.into_iter().collect() } @@ -1220,7 +1220,7 @@ impl Stack for Fp6 { } impl Stack for Fp12 { - fn to_stack(&self) -> Vec { + fn to_stack(&self) -> &[U256] { let f: [U256; 12] = unsafe { transmute(self) }; f.into_iter().collect() } @@ -1233,7 +1233,7 @@ impl Stack for Fp12 { } impl Stack for BLS381 { - fn to_stack(&self) -> Vec { + fn to_stack(&self) -> &[U256] { vec![self.lo(), self.hi()] } @@ -1246,10 +1246,15 @@ impl Stack for BLS381 { } impl Stack for Fp2 { - fn to_stack(&self) -> Vec { - let mut res = self.re.to_stack(); - res.extend(self.im.to_stack()); - res + fn to_stack(&self) -> &[U256] { + let re_stack = self.re.to_stack(); + let im_stack = self.im.to_stack(); + let mut res = [U256::default(); 2 * N]; + + for i in 0..N { + res[i] = re_stack[i]; + res[N + i] = im_stack[i]; + } } fn from_stack(stack: &[U256]) -> Fp2 { @@ -1260,7 +1265,7 @@ impl Stack for Fp2 { } impl Stack for Fp6 { - fn to_stack(&self) -> Vec { + fn to_stack(&self) -> &[U256] { let mut res = self.t0.to_stack(); res.extend(self.t1.to_stack()); res.extend(self.t2.to_stack()); @@ -1276,7 +1281,7 @@ impl Stack for Fp6 { } impl Stack for Fp12 { - fn to_stack(&self) -> Vec { + fn to_stack(&self) -> &[U256] { let mut res = self.z0.to_stack(); res.extend(self.z1.to_stack()); res From d112c716c2c4e271b9338f3a95f145ba9ed2bf44 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 18 Apr 2023 11:29:21 -0700 Subject: [PATCH 18/24] fmt --- evm/src/extension_tower.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 6ffd528c..3e55fbd4 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1250,7 +1250,7 @@ impl Stack for Fp2 { let re_stack = self.re.to_stack(); let im_stack = self.im.to_stack(); let mut res = [U256::default(); 2 * N]; - + for i in 0..N { res[i] = re_stack[i]; res[N + i] = im_stack[i]; From c9b09936ce4cfecc113e29d005c4f9e3745817ea Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 18 Apr 2023 12:02:10 -0700 Subject: [PATCH 19/24] compiles --- evm/src/extension_tower.rs | 91 ++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 18 deletions(-) diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 3e55fbd4..1bfe3786 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1206,10 +1206,44 @@ pub trait Stack { fn from_stack(stack: &[U256]) -> Self; } +impl Stack for BN254 { + fn to_stack(&self) -> &[U256] { + &[self.val] + } + + fn from_stack(stack: &[U256]) -> BN254 { + BN254 { val: stack[0] } + } +} + +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 f: [U256; 6] = unsafe { transmute(self) }; - f.into_iter().collect() + 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 { @@ -1221,8 +1255,15 @@ impl Stack for Fp6 { impl Stack for Fp12 { fn to_stack(&self) -> &[U256] { - let f: [U256; 12] = unsafe { transmute(self) }; - f.into_iter().collect() + 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 { @@ -1234,7 +1275,7 @@ impl Stack for Fp12 { impl Stack for BLS381 { fn to_stack(&self) -> &[U256] { - vec![self.lo(), self.hi()] + &[self.lo(), self.hi()] } fn from_stack(stack: &[U256]) -> BLS381 { @@ -1247,14 +1288,15 @@ impl Stack for BLS381 { impl Stack for Fp2 { fn to_stack(&self) -> &[U256] { - let re_stack = self.re.to_stack(); - let im_stack = self.im.to_stack(); - let mut res = [U256::default(); 2 * N]; + let re = self.re.to_stack(); + let im = self.im.to_stack(); - for i in 0..N { - res[i] = re_stack[i]; - res[N + i] = im_stack[i]; + let mut res = [U256::default(); 4]; + for i in 0..2 { + res[i] = re[i]; + res[2 + i] = im[i]; } + &res } fn from_stack(stack: &[U256]) -> Fp2 { @@ -1266,10 +1308,17 @@ impl Stack for Fp2 { impl Stack for Fp6 { fn to_stack(&self) -> &[U256] { - let mut res = self.t0.to_stack(); - res.extend(self.t1.to_stack()); - res.extend(self.t2.to_stack()); - res + let t0 = self.t0.to_stack(); + let t1 = self.t1.to_stack(); + let t2 = self.t2.to_stack(); + + 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 from_stack(stack: &[U256]) -> Fp6 { @@ -1282,9 +1331,15 @@ impl Stack for Fp6 { impl Stack for Fp12 { fn to_stack(&self) -> &[U256] { - let mut res = self.z0.to_stack(); - res.extend(self.z1.to_stack()); - res + let z0 = self.z0.to_stack(); + let z1 = self.z1.to_stack(); + + let mut res = [U256::default(); 24]; + for i in 0..12 { + res[i] = z0[i]; + res[12 + i] = z1[i]; + } + &res } fn from_stack(stack: &[U256]) -> Fp12 { From 1f0776281ef04c54207ea15d8b56a334931f1a6f Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 18 Apr 2023 14:52:15 -0700 Subject: [PATCH 20/24] 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])]; +// } +// } From 7dda0effec808e566ed51b82b2255edad6b7ce4b Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 18 Apr 2023 15:19:00 -0700 Subject: [PATCH 21/24] works --- evm/src/cpu/kernel/tests/bn254.rs | 20 +++---- evm/src/extension_tower.rs | 98 +++++++++++++++---------------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index e8bf3f28..dba87b96 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -12,9 +12,9 @@ use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254}; use crate::memory::segments::Segment::BnPairing; fn run_bn_mul_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { - let mut stack = f.to_stack(); + let mut stack = f.to_stack().to_vec(); if label == "mul_fp254_6" { - stack.extend(g.to_stack()); + stack.extend(g.to_stack().to_vec()); } stack.push(U256::from(0xdeadbeefu32)); let setup = InterpreterMemoryInitialization { @@ -61,7 +61,7 @@ fn run_bn_mul_fp12(f: Fp12, g: Fp12, label: &str) -> Fp12 { label: label.to_string(), stack, segment: BnPairing, - memory: vec![(in0, f.to_stack()), (in1, g.to_stack())], + memory: vec![(in0, f.to_stack().to_vec()), (in1, g.to_stack().to_vec())], }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output = interpreter.extract_kernel_memory(BnPairing, out..out + 12); @@ -89,7 +89,7 @@ fn test_bn_mul_fp12() -> Result<()> { fn run_bn_frob_fp6(n: usize, f: Fp6) -> Fp6 { let setup = InterpreterMemoryInitialization { label: format!("test_frob_fp254_6_{}", n), - stack: f.to_stack(), + stack: f.to_stack().to_vec(), segment: BnPairing, memory: vec![], }; @@ -115,7 +115,7 @@ fn run_bn_frob_fp12(n: usize, f: Fp12) -> Fp12 { label: format!("test_frob_fp254_12_{}", n), stack: vec![U256::from(ptr)], segment: BnPairing, - memory: vec![(ptr, f.to_stack())], + memory: vec![(ptr, f.to_stack().to_vec())], }; let interpeter: Interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpeter.extract_kernel_memory(BnPairing, ptr..ptr + 12); @@ -144,7 +144,7 @@ fn test_bn_inv_fp12() -> Result<()> { label: "inv_fp254_12".to_string(), stack: vec![U256::from(ptr), U256::from(inv), U256::from(0xdeadbeefu32)], segment: BnPairing, - memory: vec![(ptr, f.to_stack())], + memory: vec![(ptr, f.to_stack().to_vec())], }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, inv..inv + 12); @@ -165,12 +165,12 @@ fn test_bn_final_exponentiation() -> Result<()> { label: "bn254_invariant_exponent".to_string(), stack: vec![U256::from(ptr), U256::from(0xdeadbeefu32)], segment: BnPairing, - memory: vec![(ptr, f.to_stack())], + memory: vec![(ptr, f.to_stack().to_vec())], }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, ptr..ptr + 12); - let expected: Vec = invariant_exponent(f).to_stack(); + let expected: Vec = invariant_exponent(f).to_stack().to_vec(); assert_eq!(output, expected); @@ -250,7 +250,7 @@ fn test_bn_miller_loop() -> Result<()> { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); - let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack(); + let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack().to_vec(); assert_eq!(output, expected); @@ -278,7 +278,7 @@ fn test_bn_tate_pairing() -> Result<()> { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); - let expected = tate(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack(); + let expected = tate(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack().to_vec(); assert_eq!(output, expected); diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index d166152e..851fcd61 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1,8 +1,6 @@ -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; @@ -1251,61 +1249,63 @@ impl Stack for Fp2 { } fn from_stack(stack: &[U256]) -> Fp2 { - let re = T::from_stack(&stack[0..2]); - let im = T::from_stack(&stack[2..4]); + let field_size = T::SIZE; + let re = T::from_stack(&stack[0..field_size]); + let im = T::from_stack(&stack[field_size..2*field_size]); Fp2 { re, im } } } -// impl Stack for Fp6 -// where -// T: FieldExt, -// Fp2: Adj, -// Fp2: Stack, -// { -// const SIZE: usize = 3 * Fp2::::SIZE; +impl Stack for Fp6 +where + T: FieldExt, + Fp2: Adj, + Fp2: Stack, +{ + const SIZE: usize = 3 * Fp2::::SIZE; -// fn to_stack(&self) -> &[U256] { -// let t0 = self.t0.to_stack(); -// let t1 = self.t1.to_stack(); -// let t2 = self.t2.to_stack(); + 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 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()) -// } + 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()) + } -// 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) } -// } -// } + fn from_stack(stack: &[U256]) -> Self { + let field_size = Fp2::::SIZE; + let t0 = Fp2::::from_stack(&stack[0..field_size]); + let t1 = Fp2::::from_stack(&stack[field_size..2*field_size]); + let t2 = Fp2::::from_stack(&stack[2*field_size..3*field_size]); + Fp6 { t0, t1, t2 } + } +} -// impl Stack for Fp12 -// where -// T: FieldExt, -// Fp2: Adj, -// Fp6: Stack,{ -// const SIZE: usize = 2 * Fp6::::SIZE; +impl Stack for Fp12 +where + T: FieldExt, + Fp2: Adj, + Fp6: Stack,{ + const SIZE: usize = 2 * Fp6::::SIZE; -// fn to_stack(&self) -> &[U256] { -// let z0 = self.z0.to_stack(); -// let z1 = self.z1.to_stack(); + 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()) -// } + 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])]; -// } -// } + fn from_stack(stack: &[U256]) -> Self { + let field_size = Fp6::::SIZE; + let z0 = Fp6::::from_stack(&stack[0..field_size]); + let z1 = Fp6::::from_stack(&stack[field_size..2*field_size]); + Fp12 { z0, z1 } + } +} From 3a3ff87a169293607196d14a122e643490d7b04a Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 18 Apr 2023 15:23:12 -0700 Subject: [PATCH 22/24] fmt --- evm/src/cpu/kernel/tests/bn254.rs | 4 +++- evm/src/extension_tower.rs | 11 ++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index dba87b96..4bd336b9 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -250,7 +250,9 @@ fn test_bn_miller_loop() -> Result<()> { }; let interpreter = run_interpreter_with_memory(setup).unwrap(); let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); - let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR).to_stack().to_vec(); + let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR) + .to_stack() + .to_vec(); assert_eq!(output, expected); diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index 851fcd61..a54e4d16 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1251,7 +1251,7 @@ impl Stack for Fp2 { fn from_stack(stack: &[U256]) -> Fp2 { let field_size = T::SIZE; let re = T::from_stack(&stack[0..field_size]); - let im = T::from_stack(&stack[field_size..2*field_size]); + let im = T::from_stack(&stack[field_size..2 * field_size]); Fp2 { re, im } } } @@ -1279,8 +1279,8 @@ where fn from_stack(stack: &[U256]) -> Self { let field_size = Fp2::::SIZE; let t0 = Fp2::::from_stack(&stack[0..field_size]); - let t1 = Fp2::::from_stack(&stack[field_size..2*field_size]); - let t2 = Fp2::::from_stack(&stack[2*field_size..3*field_size]); + let t1 = Fp2::::from_stack(&stack[field_size..2 * field_size]); + let t2 = Fp2::::from_stack(&stack[2 * field_size..3 * field_size]); Fp6 { t0, t1, t2 } } } @@ -1289,7 +1289,8 @@ impl Stack for Fp12 where T: FieldExt, Fp2: Adj, - Fp6: Stack,{ + Fp6: Stack, +{ const SIZE: usize = 2 * Fp6::::SIZE; fn to_stack(&self) -> &[U256] { @@ -1305,7 +1306,7 @@ where fn from_stack(stack: &[U256]) -> Self { let field_size = Fp6::::SIZE; let z0 = Fp6::::from_stack(&stack[0..field_size]); - let z1 = Fp6::::from_stack(&stack[field_size..2*field_size]); + let z1 = Fp6::::from_stack(&stack[field_size..2 * field_size]); Fp12 { z0, z1 } } } From d3986e6b50bfeeeacf14aefc57b52d34c920b236 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 16 May 2023 15:02:01 +0200 Subject: [PATCH 23/24] merge successful --- evm/src/cpu/kernel/tests/bn254.rs | 6 ++-- evm/src/curve_pairings.rs | 17 +++++++--- evm/src/extension_tower.rs | 56 ++++++++++--------------------- 3 files changed, 34 insertions(+), 45 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index d9a798b7..f30af67d 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -20,7 +20,7 @@ fn extract_stack(interpreter: Interpreter<'static>) -> Vec { .collect::>() } -fn run_bn_mul_fp6(f: Fp6, g: Fp6, label: &str) -> Vec { +fn run_bn_mul_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { let mut stack = f.to_stack(); if label == "mul_fp254_6" { stack.extend(g.to_stack().to_vec()); @@ -52,7 +52,7 @@ fn test_bn_mul_fp6() -> Result<()> { Ok(()) } -fn run_bn_mul_fp12(f: Fp12, g: Fp12, label: &str) -> Vec { +fn run_bn_mul_fp12(f: Fp12, g: Fp12, label: &str) -> Fp12 { let in0: usize = 100; let in1: usize = 112; let out: usize = 124; @@ -118,7 +118,7 @@ fn test_bn_frob_fp6() -> Result<()> { Ok(()) } -fn run_bn_frob_fp12(f: Fp12, n: usize) -> Vec { +fn run_bn_frob_fp12(f: Fp12, n: usize) -> Fp12 { let ptr: usize = 100; let setup = InterpreterMemoryInitialization { label: format!("test_frob_fp254_12_{}", n), diff --git a/evm/src/curve_pairings.rs b/evm/src/curve_pairings.rs index 708e7fb2..d789051a 100644 --- a/evm/src/curve_pairings.rs +++ b/evm/src/curve_pairings.rs @@ -25,12 +25,21 @@ impl Curve { } } -impl Curve { - pub fn on_stack(self) -> Vec { - let mut stack = self.x.on_stack(); - stack.extend(self.y.on_stack()); +impl Stack for Curve { + const SIZE: usize = 2 * T::SIZE; + + fn to_stack(&self) -> Vec { + let mut stack = self.x.to_stack(); + stack.extend(self.y.to_stack()); stack } + + fn from_stack(stack: &[U256]) -> Self { + Curve { + x: T::from_stack(&stack[0..T::SIZE]), + y: T::from_stack(&stack[T::SIZE..2 * T::SIZE]), + } + } } impl Curve diff --git a/evm/src/extension_tower.rs b/evm/src/extension_tower.rs index f7c076e2..845d99aa 100644 --- a/evm/src/extension_tower.rs +++ b/evm/src/extension_tower.rs @@ -1225,7 +1225,7 @@ where pub trait Stack { const SIZE: usize; - fn to_stack(&self) -> &[U256]; + fn to_stack(&self) -> Vec; fn from_stack(stack: &[U256]) -> Self; } @@ -1233,9 +1233,8 @@ pub trait Stack { impl Stack for BN254 { const SIZE: usize = 1; - fn to_stack(&self) -> &[U256] { - let boxed: Box<[U256]> = Box::new([self.val]); - Box::leak(boxed) + fn to_stack(&self) -> Vec { + vec![self.val] } fn from_stack(stack: &[U256]) -> BN254 { @@ -1243,18 +1242,11 @@ impl Stack for BN254 { } } -impl Stack for BN254 { - fn on_stack(self) -> Vec { - vec![self.val] - } -} - impl Stack for BLS381 { const SIZE: usize = 2; - fn to_stack(&self) -> &[U256] { - let boxed: Box<[U256]> = Box::new([self.lo(), self.hi()]); - Box::leak(boxed) + fn to_stack(&self) -> Vec { + vec![self.lo(), self.hi()] } fn from_stack(stack: &[U256]) -> BLS381 { @@ -1268,13 +1260,10 @@ impl Stack for BLS381 { 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 combined: Vec = Vec::new(); - combined.extend_from_slice(re); - combined.extend_from_slice(im); - Box::leak(combined.into_boxed_slice()) + fn to_stack(&self) -> Vec { + let mut stack = self.re.to_stack(); + stack.extend(self.im.to_stack()); + stack } fn from_stack(stack: &[U256]) -> Fp2 { @@ -1293,16 +1282,11 @@ where { const SIZE: usize = 3 * Fp2::::SIZE; - 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 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()) + fn to_stack(&self) -> Vec { + let mut stack = self.t0.to_stack(); + stack.extend(self.t1.to_stack()); + stack.extend(self.t2.to_stack()); + stack } fn from_stack(stack: &[U256]) -> Self { @@ -1322,14 +1306,10 @@ where { const SIZE: usize = 2 * Fp6::::SIZE; - 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 to_stack(&self) -> Vec { + let mut stack = self.z0.to_stack(); + stack.extend(self.z1.to_stack()); + stack } fn from_stack(stack: &[U256]) -> Self { From 6292d8d7b1292426e21b7bcf51fd4d57c448c919 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 16 May 2023 15:05:04 +0200 Subject: [PATCH 24/24] redundant --- evm/src/cpu/kernel/tests/bn254.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index f30af67d..5ed60e7a 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -11,15 +11,6 @@ use crate::curve_pairings::{ use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254}; use crate::memory::segments::Segment::BnPairing; -fn extract_stack(interpreter: Interpreter<'static>) -> Vec { - interpreter - .stack() - .iter() - .rev() - .cloned() - .collect::>() -} - fn run_bn_mul_fp6(f: Fp6, g: Fp6, label: &str) -> Fp6 { let mut stack = f.to_stack(); if label == "mul_fp254_6" {