From e35644e9e0e6330cd778e494304be1369814dc65 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 27 Dec 2022 14:55:47 -0800 Subject: [PATCH] miller test passes --- evm/src/bn254.rs | 3 +- .../bn254/curve_arithmetic/miller_loop.asm | 6 -- evm/src/cpu/kernel/tests/bn254.rs | 93 ++++++------------- 3 files changed, 30 insertions(+), 72 deletions(-) diff --git a/evm/src/bn254.rs b/evm/src/bn254.rs index 8f29e12d..26accbfd 100644 --- a/evm/src/bn254.rs +++ b/evm/src/bn254.rs @@ -686,8 +686,7 @@ fn third_point(m: Fp, p: Curve, q: Curve) -> Curve { fn curve_add(p: Curve, q: Curve) -> Curve { if p == q { curve_double(p) - } - else { + } else { third_point(cord_slope(p, q), p, q) } } 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 0f860047..972bffb9 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 @@ -160,13 +160,7 @@ mul_tangent_2: after_double: // stack: 2*O, retdest, 0xnm, times, O, P, Q, out {100: line} SWAP5 POP SWAP5 POP - // stack: retdest, 0xnm, times, 2*O, P, Q, out {100: line} - - %pop3 %pop2 %pop2 %pop4 - %load_fp12 - %jump(0xdeadbeef) - JUMP diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index b5b30b87..71c4c3da 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -5,7 +5,7 @@ use ethereum_types::U256; use crate::bn254::{ cord, fp12_to_vec, frob_fp12, gen_curve_point, gen_fp12, gen_fp12_sparse, - gen_twisted_curve_point, mul_fp12, power, tangent, Curve, Fp12, TwistedCurve, + gen_twisted_curve_point, miller_loop, mul_fp12, power, tangent, Curve, Fp12, TwistedCurve, }; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::interpreter::run_interpreter; @@ -167,73 +167,38 @@ fn test_line() -> Result<()> { Ok(()) } -// fn make_miller_stack(p: [Fp; 2], q: [Fp2; 2]) -> Vec { -// let ptr = U256::from(300); -// let out = U256::from(400); +#[test] +fn test_miller() -> Result<()> { + let ptr = U256::from(300); + let out = U256::from(400); -// let p: Vec = p.into_iter().collect(); -// let q: Vec = q.into_iter().flatten().collect(); + let p: Curve = [U256::one(), U256::from(2)]; + let q: TwistedCurve = [ + [ + U256::from_str("0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed") + .unwrap(), + U256::from_str("0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2") + .unwrap(), + ], + [ + U256::from_str("0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa") + .unwrap(), + U256::from_str("0x90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b") + .unwrap(), + ], + ]; -// let ret_stack = U256::from(KERNEL.global_labels["ret_stack"]); + let p_: Vec = p.into_iter().collect(); + let q_: Vec = q.into_iter().flatten().collect(); -// let mut input = vec![ptr]; -// input.extend(p); -// input.extend(q); -// input.extend(vec![ptr, out, ret_stack]); -// input.reverse(); -// input -// } + let ret_stack = make_label("ret_stack"); -// #[test] -// fn test_miller() -> Result<()> { -// let p = [U256::from(1), U256::from(2)]; -// let q = [ -// [ -// U256::from_str("0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed") -// .unwrap(), -// U256::from_str("0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2") -// .unwrap(), -// ], -// [ -// U256::from_str("0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa") -// .unwrap(), -// U256::from_str("0x90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b") -// .unwrap(), -// ], -// ]; + let initial_stack = make_stack(vec![vec![ptr], p_, q_, vec![ptr, out, ret_stack]]); -// let test_mill = KERNEL.global_labels["test_miller"]; -// let stack = make_miller_stack(p, q); + let output = get_output("test_miller", initial_stack); + let expected = fp12_to_vec(miller_loop(p, q)); -// let output: Vec = run_interpreter(test_mill, stack)?.stack().to_vec(); -// let mut expected: Vec = vec![ -// U256::from_str("0xbf4dbb7e41fb58122aa29dcced57731d7cbb49b1fe9a73cb13416e1002376da") -// .unwrap(), -// U256::from_str("0x110b019c149b43a7fbd6d42d7553debcbebd35c148f63aaecf72a5fbda451ac6") -// .unwrap(), -// U256::from_str("0x27225e97ee6c877964c8f32e0b54e61ead09c3e818174cd8b5beabe7cd7385e8") -// .unwrap(), -// U256::from_str("0x5762cb6648b4b4c5df8a8874a21d937adf185d91f34e8ccf58f5b39196db02").unwrap(), -// U256::from_str("0x463002dc1a426b172f4a1e29486fc11eba01de99b559368139c8ef5271eb37f") -// .unwrap(), -// U256::from_str("0x753dcc72acdffcc45633803f1b555388969dd7c27d2a674a23a228f522480d9") -// .unwrap(), -// U256::from_str("0xd32a892d29151553101376a6638938135e30126f698a40a73f20c6ac64a4585") -// .unwrap(), -// U256::from_str("0x290afd3e28c223a624d9f5a737f9f9e4b4200b518333844d81acc445fa5910da") -// .unwrap(), -// U256::from_str("0x262e0ee72a8123b741dc113b8e2d207ee8bad011e0f6ae2015439960c789cf78") -// .unwrap(), -// U256::from_str("0x1588e0b23d868d7517e3021e620c69eb1521a49faa9bfcd4cf3a54127d4d14cb") -// .unwrap(), -// U256::from_str("0x1c23a135a7dfa96db62622c5fef4b9751d121523dd39ca1cefeacb3419835a53") -// .unwrap(), -// U256::from_str("0x2caeb873076ec8f37fa7af265d2966dd0024acbc63bd2b21f323084fc71f4a59") -// .unwrap(), -// ]; -// expected.reverse(); + assert_eq!(output, expected); -// assert_eq!(output, expected); - -// Ok(()) -// } + Ok(()) +}