This commit is contained in:
Dmitry Vagner 2023-04-27 17:15:25 -07:00
parent 57113905de
commit 4a42ddb203
3 changed files with 47 additions and 15 deletions

View File

@ -1,5 +1,3 @@
use std::mem::transmute;
use anyhow::Result; use anyhow::Result;
use ethereum_types::U256; use ethereum_types::U256;
use rand::Rng; use rand::Rng;
@ -8,7 +6,7 @@ use crate::cpu::kernel::interpreter::{
run_interpreter_with_memory, Interpreter, InterpreterMemoryInitialization, run_interpreter_with_memory, Interpreter, InterpreterMemoryInitialization,
}; };
use crate::cpu::kernel::tests::u256ify; use crate::cpu::kernel::tests::u256ify;
use crate::curve_pairings::{final_exponent, gen_fp12_sparse, miller_loop, Curve, CyclicGroup}; use crate::curve_pairings::{final_exponent, gen_fp12_sparse, miller_loop, Curve};
use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254}; use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254};
use crate::memory::segments::Segment::BnPairing; use crate::memory::segments::Segment::BnPairing;
@ -210,10 +208,8 @@ fn test_bn_miller() -> Result<()> {
let p: Curve<BN254> = rng.gen::<Curve<BN254>>(); let p: Curve<BN254> = rng.gen::<Curve<BN254>>();
let q: Curve<Fp2<BN254>> = rng.gen::<Curve<Fp2<BN254>>>(); let q: Curve<Fp2<BN254>> = rng.gen::<Curve<Fp2<BN254>>>();
let p_stack: [U256; 2] = unsafe { transmute(p) }; let mut input = p.on_stack();
let q_stack: [U256; 4] = unsafe { transmute(q) }; input.extend(q.on_stack());
let mut input = p_stack.to_vec();
input.extend(q_stack);
let setup = InterpreterMemoryInitialization { let setup = InterpreterMemoryInitialization {
label: "bn254_miller".to_string(), label: "bn254_miller".to_string(),

View File

@ -5,7 +5,7 @@ use rand::distributions::Standard;
use rand::prelude::Distribution; use rand::prelude::Distribution;
use rand::Rng; use rand::Rng;
use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, BN254}; use crate::extension_tower::{FieldExt, Fp12, Fp2, Fp6, Stack, BN254};
#[derive(Debug, Copy, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq)]
pub struct Curve<T> pub struct Curve<T>
@ -25,6 +25,14 @@ impl<T: FieldExt> Curve<T> {
} }
} }
impl<T: FieldExt + Stack> Curve<T> {
pub fn on_stack(self) -> Vec<U256> {
let mut stack = self.x.on_stack();
stack.extend(self.y.on_stack());
stack
}
}
impl<T> Curve<T> impl<T> Curve<T>
where where
T: FieldExt, T: FieldExt,

View File

@ -1,5 +1,4 @@
use std::fmt::Debug; use std::fmt::Debug;
use std::mem::transmute;
use std::ops::{Add, Div, Mul, Neg, Sub}; use std::ops::{Add, Div, Mul, Neg, Sub};
use ethereum_types::{U256, U512}; use ethereum_types::{U256, U512};
@ -1227,22 +1226,51 @@ pub trait Stack {
fn on_stack(self) -> Vec<U256>; fn on_stack(self) -> Vec<U256>;
} }
impl Stack for BN254 {
fn on_stack(self) -> Vec<U256> {
vec![self.val]
}
}
impl Stack for BLS381 { impl Stack for BLS381 {
fn on_stack(self) -> Vec<U256> { fn on_stack(self) -> Vec<U256> {
vec![self.lo(), self.hi()] vec![self.lo(), self.hi()]
} }
} }
impl Stack for Fp6<BN254> { impl<T> Stack for Fp2<T>
where
T: FieldExt + Stack,
{
fn on_stack(self) -> Vec<U256> { fn on_stack(self) -> Vec<U256> {
let f: [U256; 6] = unsafe { transmute(self) }; let mut stack = self.re.on_stack();
f.into_iter().collect() stack.extend(self.im.on_stack());
stack
} }
} }
impl Stack for Fp12<BN254> { impl<T> Stack for Fp6<T>
where
T: FieldExt,
Fp2<T>: Adj + Stack,
{
fn on_stack(self) -> Vec<U256> { fn on_stack(self) -> Vec<U256> {
let f: [U256; 12] = unsafe { transmute(self) }; let mut stack = self.t0.on_stack();
f.into_iter().collect() stack.extend(self.t1.on_stack());
stack.extend(self.t2.on_stack());
stack
}
}
impl<T> Stack for Fp12<T>
where
T: FieldExt,
Fp2<T>: Adj,
Fp6<T>: Stack,
{
fn on_stack(self) -> Vec<U256> {
let mut stack = self.z0.on_stack();
stack.extend(self.z1.on_stack());
stack
} }
} }