From c24629715890dd7800a5e9cfa55c8896a58e9543 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 20 Dec 2022 00:47:57 -0800 Subject: [PATCH] inverse works --- .../bn254/field_arithmetic/field_macros.asm | 41 ------------------- .../curve/bn254/field_arithmetic/inverse.asm | 31 ++++++++++---- evm/src/cpu/kernel/tests/bn254_field.rs | 27 +++++------- evm/src/generation/prover_input.rs | 5 +-- 4 files changed, 34 insertions(+), 70 deletions(-) diff --git a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm index 8500e053..87c8fdea 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm @@ -971,44 +971,3 @@ %mstore_kernel_general // stack: %endmacro - -%macro assert_eq_fp12_unit - // stack: ptr - DUP1 %mload_kernel_code - // stack: x00, ptr - %assert_eq_const(1) - // stack: ptr - DUP1 %add_const(01) %mload_kernel_code - // stack: x01, ptr - %assert_eq_const(0) - DUP1 %add_const(02) %mload_kernel_code - // stack: x02, ptr - %assert_eq_const(0) - DUP1 %add_const(03) %mload_kernel_code - // stack: x03, ptr - %assert_eq_const(0) - DUP1 %add_const(04) %mload_kernel_code - // stack: x04, ptr - %assert_eq_const(0) - DUP1 %add_const(05) %mload_kernel_code - // stack: x05, ptr - %assert_eq_const(0) - DUP1 %add_const(06) %mload_kernel_code - // stack: x06, ptr - %assert_eq_const(0) - DUP1 %add_const(07) %mload_kernel_code - // stack: x07, ptr - %assert_eq_const(0) - DUP1 %add_const(08) %mload_kernel_code - // stack: x08, ptr - %assert_eq_const(0) - DUP1 %add_const(09) %mload_kernel_code - // stack: x09, ptr - %assert_eq_const(0) - DUP1 %add_const(10) %mload_kernel_code - // stack: x10, ptr - %assert_eq_const(0) - DUP1 %add_const(11) %mload_kernel_code - // stack: x11, ptr - %assert_eq_const(0) -%endmacro diff --git a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/inverse.asm b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/inverse.asm index 35353c3a..cf7ee5ad 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/inverse.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/inverse.asm @@ -21,9 +21,15 @@ // stack: x^-1 %endmacro +global test_inverse_fp12: + // stack: ptr, f, ptr, inv, retdest + %store_fp12 + // stack: ptr, inv, retdest + %jump(inverse_fp12) + global inverse_fp12: // stack: ptr, inv, retdest - // DUP1 %load_fp12 + DUP1 %load_fp12 // stack: f, ptr, inv, retdest DUP14 // stack: inv, f, ptr, inv, retdest @@ -40,9 +46,6 @@ global inverse_fp12: PROVER_INPUT(ffe::bn254_base::ext_inv1) PROVER_INPUT(ffe::bn254_base::ext_inv0) // stack: f^-1, inv, f, ptr, inv, retdest - - %jump(0xdeadbeef) - DUP13 // stack: inv, f^-1, inv, f, ptr, inv, retdest %store_fp12 @@ -56,11 +59,21 @@ global inverse_fp12: %jump(mul_fp12) global check_inv: // stack: 200, ptr, inv, retdest - %assert_eq_fp12_unit + %load_fp12 + // stack: unit?, ptr, inv, retdest + %assert_eq_const(1) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) + %assert_eq_const(0) // stack: ptr, inv, retdest %pop2 // stack: retdest - %jump(0xdeadbeef) - // SWAP1 - // stack: retdest, inv - // JUMP + JUMP diff --git a/evm/src/cpu/kernel/tests/bn254_field.rs b/evm/src/cpu/kernel/tests/bn254_field.rs index 5e7c11d7..0d3c95fd 100644 --- a/evm/src/cpu/kernel/tests/bn254_field.rs +++ b/evm/src/cpu/kernel/tests/bn254_field.rs @@ -661,27 +661,20 @@ fn test_mul_fp12() -> Result<()> { fn test_inv_fp12() -> Result<()> { let ptr = U256::from(100); let inv = U256::from(200); + let f: Vec = gen_fp12().into_iter().flatten().flatten().collect(); - let f: Fp12 = gen_fp12(); - let flat_f: Vec = f.into_iter().flatten().flatten().collect(); - let mut stack: Vec = flat_f.clone(); - stack.extend(vec![ptr, inv]); - stack.reverse(); + let initial_offset = KERNEL.global_labels["test_inverse_fp12"]; - let g = inv_fp12(f); - let one = mul_fp12(f, g); - println!("ONE? {:#?}", one); + let mut initial_stack = vec![ptr]; + initial_stack.extend(f); + initial_stack.extend(vec![ptr, inv, U256::from_str("0xdeadbeef").unwrap()]); + initial_stack.reverse(); - let mut expected: Vec = g.into_iter().flatten().flatten().collect(); - expected.extend(vec![inv]); - expected.extend(flat_f); - expected.extend(vec![ptr, inv]); - expected.reverse(); + let output: Vec = run_interpreter(initial_offset, initial_stack)? + .stack() + .to_vec(); - let initial_offset = KERNEL.global_labels["inverse_fp12"]; - let output: Vec = run_interpreter(initial_offset, stack)?.stack().to_vec(); - - assert_eq!(output, expected); + assert_eq!(output, vec![]); Ok(()) } diff --git a/evm/src/generation/prover_input.rs b/evm/src/generation/prover_input.rs index 5cdca6bc..20e40ce7 100644 --- a/evm/src/generation/prover_input.rs +++ b/evm/src/generation/prover_input.rs @@ -237,7 +237,6 @@ impl EvmField { } fn ext_inv(&self, xs: Vec, offset: usize) -> [U256; 12] { - let f0 = xs.clone().into_iter().nth(offset).unwrap(); let f1 = xs.clone().into_iter().nth(offset + 1).unwrap(); let f2 = xs.clone().into_iter().nth(offset + 2).unwrap(); @@ -261,8 +260,8 @@ impl EvmField { let g = inv_fp12(f); [ - g[0][0][0], g[0][0][1], g[0][1][0], g[0][1][1], g[0][2][0], g[0][2][1], - g[1][0][0], g[1][0][1], g[1][1][0], g[1][1][1], g[1][2][0], g[1][2][1], + g[0][0][0], g[0][0][1], g[0][1][0], g[0][1][1], g[0][2][0], g[0][2][1], g[1][0][0], + g[1][0][1], g[1][1][0], g[1][1][1], g[1][2][0], g[1][2][1], ] }