mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-07 16:23:12 +00:00
run_ops
This commit is contained in:
parent
05788a997d
commit
9ec9774410
@ -31,77 +31,77 @@ pub const BLS_BASE: U512 = U512([
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||||
pub struct Fp {
|
pub struct Fp381 {
|
||||||
pub val: U512,
|
pub val: U512,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Fp {
|
impl Fp381 {
|
||||||
pub fn new(val: usize) -> Fp {
|
pub fn new(val: usize) -> Fp381 {
|
||||||
Fp {
|
Fp381 {
|
||||||
val: U512::from(val),
|
val: U512::from(val),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// impl Distribution<Fp> for Standard {
|
// impl Distribution<Fp381> for Standard {
|
||||||
// fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Fp {
|
// fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Fp381 {
|
||||||
// let xs = rng.gen::<[u64; 8]>();
|
// let xs = rng.gen::<[u64; 8]>();
|
||||||
// Fp {
|
// Fp381 {
|
||||||
// val: U512(xs) % BLS_BASE,
|
// val: U512(xs) % BLS_BASE,
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
impl Add for Fp {
|
impl Add for Fp381 {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
|
|
||||||
fn add(self, other: Self) -> Self {
|
fn add(self, other: Self) -> Self {
|
||||||
Fp {
|
Fp381 {
|
||||||
val: (self.val + other.val) % BLS_BASE,
|
val: (self.val + other.val) % BLS_BASE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Neg for Fp {
|
impl Neg for Fp381 {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
|
|
||||||
fn neg(self) -> Self::Output {
|
fn neg(self) -> Self::Output {
|
||||||
Fp {
|
Fp381 {
|
||||||
val: (BLS_BASE - self.val) % BLS_BASE,
|
val: (BLS_BASE - self.val) % BLS_BASE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Sub for Fp {
|
impl Sub for Fp381 {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
|
|
||||||
fn sub(self, other: Self) -> Self {
|
fn sub(self, other: Self) -> Self {
|
||||||
Fp {
|
Fp381 {
|
||||||
val: (BLS_BASE + self.val - other.val) % BLS_BASE,
|
val: (BLS_BASE + self.val - other.val) % BLS_BASE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Fp {
|
impl Fp381 {
|
||||||
fn lsh_128(self) -> Fp {
|
fn lsh_128(self) -> Fp381 {
|
||||||
let b128: U512 = U512([0, 0, 1, 0, 0, 0, 0, 0]);
|
let b128: U512 = U512([0, 0, 1, 0, 0, 0, 0, 0]);
|
||||||
// since BLS_BASE < 2^384, multiplying by 2^128 doesn't overflow the U512
|
// since BLS_BASE < 2^384, multiplying by 2^128 doesn't overflow the U512
|
||||||
Fp {
|
Fp381 {
|
||||||
val: self.val.saturating_mul(b128) % BLS_BASE,
|
val: self.val.saturating_mul(b128) % BLS_BASE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lsh_256(self) -> Fp {
|
fn lsh_256(self) -> Fp381 {
|
||||||
self.lsh_128().lsh_128()
|
self.lsh_128().lsh_128()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lsh_512(self) -> Fp {
|
fn lsh_512(self) -> Fp381 {
|
||||||
self.lsh_256().lsh_256()
|
self.lsh_256().lsh_256()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::suspicious_arithmetic_impl)]
|
#[allow(clippy::suspicious_arithmetic_impl)]
|
||||||
impl Mul for Fp {
|
impl Mul for Fp381 {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
|
|
||||||
fn mul(self, other: Self) -> Self {
|
fn mul(self, other: Self) -> Self {
|
||||||
@ -110,16 +110,16 @@ impl Mul for Fp {
|
|||||||
let (x1, x0) = self.val.div_mod(b256);
|
let (x1, x0) = self.val.div_mod(b256);
|
||||||
let (y1, y0) = other.val.div_mod(b256);
|
let (y1, y0) = other.val.div_mod(b256);
|
||||||
|
|
||||||
let z00 = Fp {
|
let z00 = Fp381 {
|
||||||
val: x0.saturating_mul(y0) % BLS_BASE,
|
val: x0.saturating_mul(y0) % BLS_BASE,
|
||||||
};
|
};
|
||||||
let z01 = Fp {
|
let z01 = Fp381 {
|
||||||
val: x0.saturating_mul(y1),
|
val: x0.saturating_mul(y1),
|
||||||
};
|
};
|
||||||
let z10 = Fp {
|
let z10 = Fp381 {
|
||||||
val: x1.saturating_mul(y0),
|
val: x1.saturating_mul(y0),
|
||||||
};
|
};
|
||||||
let z11 = Fp {
|
let z11 = Fp381 {
|
||||||
val: x1.saturating_mul(y1),
|
val: x1.saturating_mul(y1),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -127,16 +127,16 @@ impl Mul for Fp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FieldExt for Fp {
|
impl FieldExt for Fp381 {
|
||||||
const ZERO: Self = Fp { val: U512::zero() };
|
const ZERO: Self = Fp381 { val: U512::zero() };
|
||||||
const UNIT: Self = Fp { val: U512::one() };
|
const UNIT: Self = Fp381 { val: U512::one() };
|
||||||
fn inv(self) -> Fp {
|
fn inv(self) -> Fp381 {
|
||||||
exp_fp(self, BLS_BASE - 2)
|
exp_fp(self, BLS_BASE - 2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::suspicious_arithmetic_impl)]
|
#[allow(clippy::suspicious_arithmetic_impl)]
|
||||||
impl Div for Fp {
|
impl Div for Fp381 {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
|
|
||||||
fn div(self, rhs: Self) -> Self::Output {
|
fn div(self, rhs: Self) -> Self::Output {
|
||||||
@ -144,9 +144,9 @@ impl Div for Fp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exp_fp(x: Fp, e: U512) -> Fp {
|
fn exp_fp(x: Fp381, e: U512) -> Fp381 {
|
||||||
let mut current = x;
|
let mut current = x;
|
||||||
let mut product = Fp { val: U512::one() };
|
let mut product = Fp381 { val: U512::one() };
|
||||||
|
|
||||||
for j in 0..512 {
|
for j in 0..512 {
|
||||||
if e.bit(j) {
|
if e.bit(j) {
|
||||||
|
|||||||
@ -8,6 +8,7 @@ use ethereum_types::{U256, U512};
|
|||||||
use keccak_hash::keccak;
|
use keccak_hash::keccak;
|
||||||
use plonky2::field::goldilocks_field::GoldilocksField;
|
use plonky2::field::goldilocks_field::GoldilocksField;
|
||||||
|
|
||||||
|
use crate::bls381_arithmetic::{Fp381, BLS_BASE};
|
||||||
use crate::bn254_arithmetic::BN_BASE;
|
use crate::bn254_arithmetic::BN_BASE;
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
use crate::cpu::kernel::aggregator::KERNEL;
|
||||||
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
||||||
@ -438,6 +439,90 @@ impl<'a> Interpreter<'a> {
|
|||||||
self.push((x + (BN_BASE - y)) % BN_BASE);
|
self.push((x + (BN_BASE - y)) % BN_BASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn run_addfp381_lo(&mut self) {
|
||||||
|
let x1 = self.pop();
|
||||||
|
let x0 = self.pop();
|
||||||
|
let y1 = self.pop();
|
||||||
|
let y0 = self.pop();
|
||||||
|
|
||||||
|
let x = U512::from(x0) + (U512::from(x1) << 256);
|
||||||
|
let y = U512::from(y0) + (U512::from(y1) << 256);
|
||||||
|
let z = (x + y) % BLS_BASE;
|
||||||
|
|
||||||
|
self.push(U256(z.0[0..4].try_into().unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn run_addfp381_hi(&mut self) {
|
||||||
|
let x1 = self.pop();
|
||||||
|
let x0 = self.pop();
|
||||||
|
let y1 = self.pop();
|
||||||
|
let y0 = self.pop();
|
||||||
|
|
||||||
|
let x = U512::from(x0) + (U512::from(x1) << 256);
|
||||||
|
let y = U512::from(y0) + (U512::from(y1) << 256);
|
||||||
|
let z = (x + y) % BLS_BASE;
|
||||||
|
|
||||||
|
self.push(U256(z.0[4..].try_into().unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn run_mulfp254_lo(&mut self) {
|
||||||
|
let x1 = self.pop();
|
||||||
|
let x0 = self.pop();
|
||||||
|
let y1 = self.pop();
|
||||||
|
let y0 = self.pop();
|
||||||
|
|
||||||
|
let x = U512::from(x0) + (U512::from(x1) << 256);
|
||||||
|
let y = U512::from(y0) + (U512::from(y1) << 256);
|
||||||
|
let z = (Fp381 {val: x} * Fp381 {val: y}).val;
|
||||||
|
|
||||||
|
self.push(U256(z.0[0..4].try_into().unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn run_mulfp254_hi(&mut self) {
|
||||||
|
let x1 = self.pop();
|
||||||
|
let x0 = self.pop();
|
||||||
|
let y1 = self.pop();
|
||||||
|
let y0 = self.pop();
|
||||||
|
|
||||||
|
let x = U512::from(x0) + (U512::from(x1) << 256);
|
||||||
|
let y = U512::from(y0) + (U512::from(y1) << 256);
|
||||||
|
let z = (Fp381 {val: x} * Fp381 {val: y}).val;
|
||||||
|
|
||||||
|
self.push(U256(z.0[4..].try_into().unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn run_subfp381_lo(&mut self) {
|
||||||
|
let x1 = self.pop();
|
||||||
|
let x0 = self.pop();
|
||||||
|
let y1 = self.pop();
|
||||||
|
let y0 = self.pop();
|
||||||
|
|
||||||
|
let x = U512::from(x0) + (U512::from(x1) << 256);
|
||||||
|
let y = U512::from(y0) + (U512::from(y1) << 256);
|
||||||
|
let z = (BLS_BASE + x - y) % BLS_BASE;
|
||||||
|
|
||||||
|
self.push(U256(z.0[0..4].try_into().unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn run_subfp381_hi(&mut self) {
|
||||||
|
let x1 = self.pop();
|
||||||
|
let x0 = self.pop();
|
||||||
|
let y1 = self.pop();
|
||||||
|
let y0 = self.pop();
|
||||||
|
|
||||||
|
let x = U512::from(x0) + (U512::from(x1) << 256);
|
||||||
|
let y = U512::from(y0) + (U512::from(y1) << 256);
|
||||||
|
let z = (BLS_BASE + x - y) % BLS_BASE;
|
||||||
|
|
||||||
|
self.push(U256(z.0[4..].try_into().unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
fn run_div(&mut self) {
|
fn run_div(&mut self) {
|
||||||
let x = self.pop();
|
let x = self.pop();
|
||||||
let y = self.pop();
|
let y = self.pop();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user