From 826702a756ccb80080615c92be2a3540658018b3 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 27 Dec 2022 16:00:16 -0800 Subject: [PATCH] clean --- evm/src/bn254.rs | 309 +++++++++--------- .../bn254/curve_arithmetic/miller_loop.asm | 2 +- evm/src/cpu/kernel/tests/bn254.rs | 27 +- 3 files changed, 156 insertions(+), 182 deletions(-) diff --git a/evm/src/bn254.rs b/evm/src/bn254.rs index 1e0e973f..6b3026ef 100644 --- a/evm/src/bn254.rs +++ b/evm/src/bn254.rs @@ -297,19 +297,158 @@ pub fn inv_fp12(f: Fp12) -> Fp12 { } pub fn power(f: Fp12) -> Fp12 { + const EXPS4: [(usize, usize, usize); 65] = [ + (1, 1, 1), + (1, 1, 0), + (1, 1, 1), + (1, 1, 1), + (0, 0, 0), + (0, 0, 1), + (1, 0, 1), + (0, 1, 0), + (1, 0, 1), + (1, 1, 0), + (1, 0, 1), + (0, 1, 0), + (1, 1, 0), + (1, 1, 0), + (1, 1, 0), + (0, 1, 0), + (0, 1, 0), + (0, 0, 1), + (1, 0, 1), + (1, 1, 0), + (0, 1, 0), + (1, 1, 0), + (1, 1, 0), + (1, 1, 0), + (0, 0, 1), + (0, 0, 1), + (1, 0, 1), + (1, 0, 1), + (1, 1, 0), + (1, 0, 0), + (1, 1, 0), + (0, 1, 0), + (1, 1, 0), + (1, 0, 0), + (0, 1, 0), + (0, 0, 0), + (1, 0, 0), + (1, 0, 0), + (1, 0, 1), + (0, 0, 1), + (0, 1, 1), + (0, 0, 1), + (0, 1, 1), + (0, 1, 1), + (0, 0, 0), + (1, 1, 1), + (1, 0, 1), + (1, 0, 1), + (0, 1, 1), + (1, 0, 1), + (0, 1, 1), + (0, 1, 1), + (1, 1, 0), + (1, 1, 0), + (1, 1, 0), + (1, 0, 0), + (0, 0, 1), + (1, 0, 0), + (0, 0, 1), + (1, 0, 1), + (1, 1, 0), + (1, 1, 1), + (0, 1, 1), + (0, 1, 0), + (1, 1, 1), + ]; + + const EXPS2: [(usize, usize); 62] = [ + (1, 0), + (1, 1), + (0, 0), + (1, 0), + (1, 0), + (1, 1), + (1, 0), + (1, 1), + (1, 0), + (0, 1), + (0, 1), + (1, 1), + (1, 1), + (0, 0), + (1, 1), + (0, 0), + (0, 0), + (0, 1), + (0, 1), + (1, 1), + (1, 1), + (1, 1), + (0, 1), + (1, 1), + (0, 0), + (1, 1), + (1, 0), + (1, 1), + (0, 0), + (1, 1), + (1, 1), + (1, 0), + (0, 0), + (0, 1), + (0, 0), + (1, 1), + (0, 1), + (0, 0), + (1, 0), + (0, 1), + (0, 1), + (1, 0), + (0, 1), + (0, 0), + (0, 0), + (0, 0), + (0, 1), + (1, 0), + (1, 1), + (0, 1), + (1, 1), + (1, 0), + (0, 1), + (0, 0), + (1, 0), + (0, 1), + (1, 0), + (1, 1), + (1, 0), + (1, 1), + (0, 1), + (1, 1), + ]; + + const EXPS0: [usize; 65] = [ + 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 1, 1, 0, + ]; + let mut sq: Fp12 = f; let mut y0: Fp12 = embed_fp12(U256::one()); let mut y2: Fp12 = embed_fp12(U256::one()); let mut y4: Fp12 = embed_fp12(U256::one()); for (a, b, c) in EXPS4 { - if a { + if a != 0 { y4 = mul_fp12(y4, sq); } - if b { + if b != 0 { y2 = mul_fp12(y2, sq); } - if c { + if c != 0 { y0 = mul_fp12(y0, sq); } sq = mul_fp12(sq, sq); @@ -317,10 +456,10 @@ pub fn power(f: Fp12) -> Fp12 { y4 = mul_fp12(y4, sq); for (a, b) in EXPS2 { - if a { + if a != 0 { y2 = mul_fp12(y2, sq); } - if b { + if b != 0 { y0 = mul_fp12(y0, sq); } sq = mul_fp12(sq, sq); @@ -328,7 +467,7 @@ pub fn power(f: Fp12) -> Fp12 { y2 = mul_fp12(y2, sq); for a in EXPS0 { - if a { + if a != 0 { y0 = mul_fp12(y0, sq); } sq = mul_fp12(sq, sq); @@ -490,147 +629,6 @@ fn frob_z(n: usize) -> Fp2 { } } -const EXPS4: [(bool, bool, bool); 65] = [ - (true, true, true), - (true, true, false), - (true, true, true), - (true, true, true), - (false, false, false), - (false, false, true), - (true, false, true), - (false, true, false), - (true, false, true), - (true, true, false), - (true, false, true), - (false, true, false), - (true, true, false), - (true, true, false), - (true, true, false), - (false, true, false), - (false, true, false), - (false, false, true), - (true, false, true), - (true, true, false), - (false, true, false), - (true, true, false), - (true, true, false), - (true, true, false), - (false, false, true), - (false, false, true), - (true, false, true), - (true, false, true), - (true, true, false), - (true, false, false), - (true, true, false), - (false, true, false), - (true, true, false), - (true, false, false), - (false, true, false), - (false, false, false), - (true, false, false), - (true, false, false), - (true, false, true), - (false, false, true), - (false, true, true), - (false, false, true), - (false, true, true), - (false, true, true), - (false, false, false), - (true, true, true), - (true, false, true), - (true, false, true), - (false, true, true), - (true, false, true), - (false, true, true), - (false, true, true), - (true, true, false), - (true, true, false), - (true, true, false), - (true, false, false), - (false, false, true), - (true, false, false), - (false, false, true), - (true, false, true), - (true, true, false), - (true, true, true), - (false, true, true), - (false, true, false), - (true, true, true), -]; - -const EXPS2: [(bool, bool); 62] = [ - (true, false), - (true, true), - (false, false), - (true, false), - (true, false), - (true, true), - (true, false), - (true, true), - (true, false), - (false, true), - (false, true), - (true, true), - (true, true), - (false, false), - (true, true), - (false, false), - (false, false), - (false, true), - (false, true), - (true, true), - (true, true), - (true, true), - (false, true), - (true, true), - (false, false), - (true, true), - (true, false), - (true, true), - (false, false), - (true, true), - (true, true), - (true, false), - (false, false), - (false, true), - (false, false), - (true, true), - (false, true), - (false, false), - (true, false), - (false, true), - (false, true), - (true, false), - (false, true), - (false, false), - (false, false), - (false, false), - (false, true), - (true, false), - (true, true), - (false, true), - (true, true), - (true, false), - (false, true), - (false, false), - (true, false), - (false, true), - (true, false), - (true, true), - (true, false), - (true, true), - (false, true), - (true, true), -]; - -const EXPS0: [bool; 65] = [ - false, false, true, false, false, true, true, false, true, false, true, true, true, false, - true, false, false, false, true, false, false, true, false, true, false, true, true, false, - false, false, false, false, true, false, true, false, true, true, true, false, false, true, - true, true, true, false, true, false, true, true, false, false, true, false, false, false, - true, true, true, true, false, false, true, true, false, -]; - pub fn tangent(p: Curve, q: TwistedCurve) -> Fp12 { let [px, py] = p; let [qx, qy] = q; @@ -697,14 +695,15 @@ fn curve_double(p: Curve) -> Curve { pub fn miller_loop(p: Curve, q: TwistedCurve) -> Fp12 { const EXP: [usize; 253] = [ - 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, - 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, - 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; let mut o = p; diff --git a/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm b/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm index 972bffb9..ba73fed1 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm @@ -250,7 +250,7 @@ after_add: %mstore_kernel_general(103) // stack: p1x - p2x, qy_ MULFP254 - // stack: (p1x - p2x)qy_ + // stack: (p1x - p2x)*qy_ %mstore_kernel_general(109) %endmacro diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index 71c4c3da..1831e910 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -122,7 +122,7 @@ fn test_inv_fp12() -> Result<()> { } #[test] -fn test_pow_fp12() -> Result<()> { +fn test_power() -> Result<()> { let ptr = U256::from(300); let out = U256::from(400); @@ -142,31 +142,6 @@ fn test_pow_fp12() -> Result<()> { Ok(()) } -#[test] -fn test_line() -> Result<()> { - let p1: Curve = gen_curve_point(); - let p2: Curve = gen_curve_point(); - let q: TwistedCurve = gen_twisted_curve_point(); - - let p1_: Vec = p1.to_vec(); - let p2_: Vec = p2.to_vec(); - let q_: Vec = q.into_iter().flatten().collect(); - - let tan_stack = make_stack(vec![p1_.clone(), q_.clone()]); - let cord_stack = make_stack(vec![p1_, p2_, q_]); - - let output_tan: Vec = get_output("test_tangent", tan_stack); - let output_cord: Vec = get_output("test_cord", cord_stack); - - let expected_tan = fp12_to_vec(tangent(p1, q)); - let expected_cord = fp12_to_vec(cord(p1, p2, q)); - - assert_eq!(output_tan, expected_tan); - assert_eq!(output_cord, expected_cord); - - Ok(()) -} - #[test] fn test_miller() -> Result<()> { let ptr = U256::from(300);