diff --git a/evm/src/bn254_arithmetic.rs b/evm/src/bn254_arithmetic.rs index 81abe5fe..c6db5d94 100644 --- a/evm/src/bn254_arithmetic.rs +++ b/evm/src/bn254_arithmetic.rs @@ -385,8 +385,8 @@ pub fn gen_fp12_sparse() -> Fp12 { fn frob_fp6(n: usize, c: Fp6) -> Fp6 { let n = n % 6; - let frob_t1 = frob_t1(n); - let frob_t2 = frob_t2(n); + let frob_t1 = FROB_T1[n]; + let frob_t2 = FROB_T2[n]; if n % 2 != 0 { Fp6 { @@ -411,81 +411,187 @@ pub fn frob_fp12(n: usize, f: Fp12) -> Fp12 { } } -fn frob_t1(n: usize) -> Fp2 { - let pair = match n { - 0 => [U256::one(), U256::zero()], - 1 => [ - U256::from_str("0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d") - .unwrap(), - U256::from_str("0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2") - .unwrap(), - ], - 2 => [ - U256::from_str("0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48") - .unwrap(), - U256::zero(), - ], - 3 => [ - U256::from_str("0x856e078b755ef0abaff1c77959f25ac805ffd3d5d6942d37b746ee87bdcfb6d") - .unwrap(), - U256::from_str("0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de") - .unwrap(), - ], - 4 => [ - U256::from_str("0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe").unwrap(), - U256::zero(), - ], - 5 => [ - U256::from_str("0x28be74d4bb943f51699582b87809d9caf71614d4b0b71f3a62e913ee1dada9e4") - .unwrap(), - U256::from_str("0x14a88ae0cb747b99c2b86abcbe01477a54f40eb4c3f6068dedae0bcec9c7aac7") - .unwrap(), - ], - _ => panic!(), - }; +const FROB_T1: [Fp2; 6] = [ Fp2 { - re: Fp { val: pair[0] }, - im: Fp { val: pair[1] }, - } -} + re: Fp { val: U256::one() }, + im: Fp { val: U256::zero() }, + }, + Fp2 { + re: Fp { + val: U256([ + 0x99e39557176f553d, + 0xb78cc310c2c3330c, + 0x4c0bec3cf559b143, + 0x2fb347984f7911f7, + ]), + }, + im: Fp { + val: U256([ + 0x1665d51c640fcba2, + 0x32ae2a1d0b7c9dce, + 0x4ba4cc8bd75a0794, + 0x16c9e55061ebae20, + ]), + }, + }, + Fp2 { + re: Fp { + val: U256([ + 0xe4bd44e5607cfd48, + 0xc28f069fbb966e3d, + 0x5e6dd9e7e0acccb0, + 0x30644e72e131a029, + ]), + }, + im: Fp { val: U256::zero() }, + }, + Fp2 { + re: Fp { + val: U256([ + 0x7b746ee87bdcfb6d, + 0x805ffd3d5d6942d3, + 0xbaff1c77959f25ac, + 0x856e078b755ef0a, + ]), + }, + im: Fp { + val: U256([ + 0x380cab2baaa586de, + 0x0fdf31bf98ff2631, + 0xa9f30e6dec26094f, + 0x4f1de41b3d1766f, + ]), + }, + }, + Fp2 { + re: Fp { + val: U256([ + 0x5763473177fffffe, + 0xd4f263f1acdb5c4f, + 0x59e26bcea0d48bac, + 0x0, + ]), + }, + im: Fp { val: U256::zero() }, + }, + Fp2 { + re: Fp { + val: U256([ + 0x62e913ee1dada9e4, + 0xf71614d4b0b71f3a, + 0x699582b87809d9ca, + 0x28be74d4bb943f51, + ]), + }, + im: Fp { + val: U256([ + 0xedae0bcec9c7aac7, + 0x54f40eb4c3f6068d, + 0xc2b86abcbe01477a, + 0x14a88ae0cb747b99, + ]), + }, + }, +]; -fn frob_t2(n: usize) -> Fp2 { - let pair = match n { - 0 => [U256::one(), U256::zero()], - 1 => [ - U256::from_str("0x5b54f5e64eea80180f3c0b75a181e84d33365f7be94ec72848a1f55921ea762") - .unwrap(), - U256::from_str("0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126") - .unwrap(), - ], - 2 => [ - U256::from_str("0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe").unwrap(), - U256::zero(), - ], - 3 => [ - U256::from_str("0xbc58c6611c08dab19bee0f7b5b2444ee633094575b06bcb0e1a92bc3ccbf066") - .unwrap(), - U256::from_str("0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f") - .unwrap(), - ], - 4 => [ - U256::from_str("0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48") - .unwrap(), - U256::zero(), - ], - 5 => [ - U256::from_str("0x1ee972ae6a826a7d1d9da40771b6f589de1afb54342c724fa97bda050992657f") - .unwrap(), - U256::from_str("0x10de546ff8d4ab51d2b513cdbb25772454326430418536d15721e37e70c255c9") - .unwrap(), - ], - _ => panic!(), - }; +const FROB_T2: [Fp2; 6] = [ Fp2 { - re: Fp { val: pair[0] }, - im: Fp { val: pair[1] }, - } -} + re: Fp { val: U256::one() }, + im: Fp { val: U256::zero() }, + }, + Fp2 { + re: { + Fp { + val: U256([ + 0x848a1f55921ea762, + 0xd33365f7be94ec72, + 0x80f3c0b75a181e84, + 0x5b54f5e64eea801, + ]), + } + }, + im: { + Fp { + val: U256([ + 0xc13b4711cd2b8126, + 0x3685d2ea1bdec763, + 0x9f3a80b03b0b1c92, + 0x2c145edbe7fd8aee, + ]), + } + }, + }, + Fp2 { + re: { + Fp { + val: U256([ + 0x5763473177fffffe, + 0xd4f263f1acdb5c4f, + 0x59e26bcea0d48bac, + 0x0, + ]), + } + }, + im: { Fp { val: U256::zero() } }, + }, + Fp2 { + re: { + Fp { + val: U256([ + 0x0e1a92bc3ccbf066, + 0xe633094575b06bcb, + 0x19bee0f7b5b2444e, + 0xbc58c6611c08dab, + ]), + } + }, + im: { + Fp { + val: U256([ + 0x5fe3ed9d730c239f, + 0xa44a9e08737f96e5, + 0xfeb0f6ef0cd21d04, + 0x23d5e999e1910a12, + ]), + } + }, + }, + Fp2 { + re: { + Fp { + val: U256([ + 0xe4bd44e5607cfd48, + 0xc28f069fbb966e3d, + 0x5e6dd9e7e0acccb0, + 0x30644e72e131a029, + ]), + } + }, + im: { Fp { val: U256::zero() } }, + }, + Fp2 { + re: { + Fp { + val: U256([ + 0xa97bda050992657f, + 0xde1afb54342c724f, + 0x1d9da40771b6f589, + 0x1ee972ae6a826a7d, + ]), + } + }, + im: { + Fp { + val: U256([ + 0x5721e37e70c255c9, + 0x54326430418536d1, + 0xd2b513cdbb257724, + 0x10de546ff8d4ab51, + ]), + } + }, + }, +]; fn frob_z(n: usize) -> Fp2 { let pair = match n { diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index cc391ac6..f1e9f354 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -3,7 +3,7 @@ use anyhow::Result; use ethereum_types::U256; -use crate::bn254_arithmetic::{fp12_to_vec, gen_fp12, gen_fp12_sparse, frob_fp12, Fp12}; +use crate::bn254_arithmetic::{fp12_to_vec, frob_fp12, gen_fp12, gen_fp12_sparse, Fp12}; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::interpreter::run_interpreter;