This commit is contained in:
Dmitry Vagner 2023-04-18 14:52:15 -07:00
parent c9b09936ce
commit 1f0776281e
2 changed files with 70 additions and 109 deletions

View File

@ -14,8 +14,8 @@ fn test_bls_fp2_mul() -> Result<()> {
let x: Fp2<BLS381> = rng.gen::<Fp2<BLS381>>();
let y: Fp2<BLS381> = rng.gen::<Fp2<BLS381>>();
let mut stack = x.to_stack();
stack.extend(y.to_stack());
let mut stack = x.to_stack().to_vec();
stack.extend(y.to_stack().to_vec());
stack.push(U256::from(0xdeadbeefu32));
let setup = InterpreterMemoryInitialization {
label: "mul_fp381_2".to_string(),

View File

@ -2,6 +2,7 @@ use std::mem::transmute;
use std::ops::{Add, Div, Mul, Neg, Sub};
use ethereum_types::{U256, U512};
use plonky2::field::types::Field;
use rand::distributions::{Distribution, Standard};
use rand::Rng;
@ -1201,14 +1202,19 @@ where
}
pub trait Stack {
const SIZE: usize;
fn to_stack(&self) -> &[U256];
fn from_stack(stack: &[U256]) -> Self;
}
impl Stack for BN254 {
const SIZE: usize = 1;
fn to_stack(&self) -> &[U256] {
&[self.val]
let boxed: Box<[U256]> = Box::new([self.val]);
Box::leak(boxed)
}
fn from_stack(stack: &[U256]) -> BN254 {
@ -1216,66 +1222,12 @@ impl Stack for BN254 {
}
}
impl Stack for Fp2<BN254> {
fn to_stack(&self) -> &[U256] {
let re = self.re.to_stack();
let im = self.im.to_stack();
let mut res = [U256::default(); 4];
&[re[0], im[0]]
}
fn from_stack(stack: &[U256]) -> Fp2<BN254> {
let re = BN254::from_stack(&stack[0..2]);
let im = BN254::from_stack(&stack[2..4]);
Fp2 { re, im }
}
}
impl Stack for Fp6<BN254> {
fn to_stack(&self) -> &[U256] {
let t0 = self.t0.to_stack();
let t1 = self.t1.to_stack();
let t2 = self.t2.to_stack();
let mut res = [U256::default(); 6];
for i in 0..2 {
res[i] = t0[i];
res[2 + i] = t1[i];
res[4 + i] = t2[i];
}
&res
}
fn from_stack(stack: &[U256]) -> Self {
let mut f = [U256::zero(); 6];
f.copy_from_slice(stack);
unsafe { transmute(f) }
}
}
impl Stack for Fp12<BN254> {
fn to_stack(&self) -> &[U256] {
let z0 = self.z0.to_stack();
let z1 = self.z1.to_stack();
let mut res = [U256::default(); 12];
for i in 0..6 {
res[i] = z0[i];
res[6 + i] = z1[i];
}
&res
}
fn from_stack(stack: &[U256]) -> Self {
let mut f = [U256::zero(); 12];
f.copy_from_slice(stack);
unsafe { transmute(f) }
}
}
impl Stack for BLS381 {
const SIZE: usize = 2;
fn to_stack(&self) -> &[U256] {
&[self.lo(), self.hi()]
let boxed: Box<[U256]> = Box::new([self.lo(), self.hi()]);
Box::leak(boxed)
}
fn from_stack(stack: &[U256]) -> BLS381 {
@ -1286,65 +1238,74 @@ impl Stack for BLS381 {
}
}
impl Stack for Fp2<BLS381> {
impl<T: FieldExt + Stack> Stack for Fp2<T> {
const SIZE: usize = 2 * T::SIZE;
fn to_stack(&self) -> &[U256] {
let re = self.re.to_stack();
let im = self.im.to_stack();
let mut res = [U256::default(); 4];
for i in 0..2 {
res[i] = re[i];
res[2 + i] = im[i];
}
&res
let mut combined: Vec<U256> = Vec::new();
combined.extend_from_slice(re);
combined.extend_from_slice(im);
Box::leak(combined.into_boxed_slice())
}
fn from_stack(stack: &[U256]) -> Fp2<BLS381> {
let re = BLS381::from_stack(&stack[0..2]);
let im = BLS381::from_stack(&stack[2..4]);
fn from_stack(stack: &[U256]) -> Fp2<T> {
let re = T::from_stack(&stack[0..2]);
let im = T::from_stack(&stack[2..4]);
Fp2 { re, im }
}
}
impl Stack for Fp6<BLS381> {
fn to_stack(&self) -> &[U256] {
let t0 = self.t0.to_stack();
let t1 = self.t1.to_stack();
let t2 = self.t2.to_stack();
// impl<T> Stack for Fp6<T>
// where
// T: FieldExt,
// Fp2<T>: Adj,
// Fp2<T>: Stack,
// {
// const SIZE: usize = 3 * Fp2::<T>::SIZE;
let mut res = [U256::default(); 12];
for i in 0..4 {
res[i] = t0[i];
res[4 + i] = t1[i];
res[8 + i] = t2[i];
}
&res
}
// fn to_stack(&self) -> &[U256] {
// let t0 = self.t0.to_stack();
// let t1 = self.t1.to_stack();
// let t2 = self.t2.to_stack();
fn from_stack(stack: &[U256]) -> Fp6<BLS381> {
let t0 = Fp2::<BLS381>::from_stack(&stack[0..4]);
let t1 = Fp2::<BLS381>::from_stack(&stack[4..8]);
let t2 = Fp2::<BLS381>::from_stack(&stack[8..12]);
Fp6 { t0, t1, t2 }
}
}
// let mut combined: Vec<U256> = Vec::new();
// combined.extend_from_slice(t0);
// combined.extend_from_slice(t1);
// combined.extend_from_slice(t2);
// Box::leak(combined.into_boxed_slice())
// }
impl Stack for Fp12<BLS381> {
fn to_stack(&self) -> &[U256] {
let z0 = self.z0.to_stack();
let z1 = self.z1.to_stack();
// fn from_stack(stack: &[U256]) -> Self {
// let f = [
// T::from_stack(&stack[0..2]),
// T::from_stack(&stack[2..4]),
// T::from_stack(&stack[4..6]),
// ];
// f.copy_from_slice(stack);
// unsafe { transmute(f) }
// }
// }
let mut res = [U256::default(); 24];
for i in 0..12 {
res[i] = z0[i];
res[12 + i] = z1[i];
}
&res
}
// impl<T> Stack for Fp12<T>
// where
// T: FieldExt,
// Fp2<T>: Adj,
// Fp6<T>: Stack,{
// const SIZE: usize = 2 * Fp6::<T>::SIZE;
fn from_stack(stack: &[U256]) -> Fp12<BLS381> {
let z0 = Fp6::<BLS381>::from_stack(&stack[0..12]);
let z1 = Fp6::<BLS381>::from_stack(&stack[12..24]);
Fp12 { z0, z1 }
}
}
// fn to_stack(&self) -> &[U256] {
// let z0 = self.z0.to_stack();
// let z1 = self.z1.to_stack();
// let mut combined: Vec<U256> = Vec::new();
// combined.extend_from_slice(z0);
// combined.extend_from_slice(z1);
// Box::leak(combined.into_boxed_slice())
// }
// fn from_stack(stack: &[U256]) -> Self {
// let f = [T::from_stack(&stack[0..6]), T::from_stack(&stack[6..12])];
// }
// }