cleaner inv

This commit is contained in:
Dmitry Vagner 2023-01-13 08:47:15 +04:00
parent 32f24819dd
commit 70d7fb1352
2 changed files with 36 additions and 78 deletions

View File

@ -29,17 +29,17 @@ global test_inv_fp12:
%jump(inv_fp12)
global inv_fp12:
// stack: ptr, inv, retdest
// stack: ptr, inv, retdest
DUP1 %load_fp12
// stack: f, ptr, inv, retdest
// stack: f, ptr, inv, retdest
DUP14
// stack: inv, f, ptr, inv, retdest
// stack: inv, f, ptr, inv, retdest
%prover_inv_fp12
// stack: f^-1, inv, f, ptr, inv, retdest
// stack: f^-1, inv, f, ptr, inv, retdest
DUP13 %store_fp12
// stack: inv, f, ptr, inv, retdest
// stack: inv, f, ptr, inv, retdest
POP %pop4 %pop4 %pop4
// stack: ptr, inv, retdest
// stack: ptr, inv, retdest
PUSH 50 PUSH check_inv
// stack: check_inv, 50, ptr, inv, retdest
SWAP3 SWAP1 SWAP2
@ -54,18 +54,18 @@ global check_inv:
JUMP
%macro prover_inv_fp12
PROVER_INPUT(ffe::bn254_base::ext_inv11)
PROVER_INPUT(ffe::bn254_base::ext_inv10)
PROVER_INPUT(ffe::bn254_base::ext_inv9)
PROVER_INPUT(ffe::bn254_base::ext_inv8)
PROVER_INPUT(ffe::bn254_base::ext_inv7)
PROVER_INPUT(ffe::bn254_base::ext_inv6)
PROVER_INPUT(ffe::bn254_base::ext_inv5)
PROVER_INPUT(ffe::bn254_base::ext_inv4)
PROVER_INPUT(ffe::bn254_base::ext_inv3)
PROVER_INPUT(ffe::bn254_base::ext_inv2)
PROVER_INPUT(ffe::bn254_base::ext_inv1)
PROVER_INPUT(ffe::bn254_base::ext_inv0)
PROVER_INPUT(ffe::bn254_base::ext_11)
PROVER_INPUT(ffe::bn254_base::ext_10)
PROVER_INPUT(ffe::bn254_base::ext_9)
PROVER_INPUT(ffe::bn254_base::ext_8)
PROVER_INPUT(ffe::bn254_base::ext_7)
PROVER_INPUT(ffe::bn254_base::ext_6)
PROVER_INPUT(ffe::bn254_base::ext_5)
PROVER_INPUT(ffe::bn254_base::ext_4)
PROVER_INPUT(ffe::bn254_base::ext_3)
PROVER_INPUT(ffe::bn254_base::ext_2)
PROVER_INPUT(ffe::bn254_base::ext_1)
PROVER_INPUT(ffe::bn254_base::ext_0)
%endmacro
%macro assert_eq_unit_fp12

View File

@ -7,10 +7,6 @@ use crate::bn254::{fp12_to_array, inv_fp12, vec_to_fp12};
use crate::generation::prover_input::EvmField::{
Bn254Base, Bn254Scalar, Secp256k1Base, Secp256k1Scalar,
};
use crate::generation::prover_input::FieldExtOp::{
ExtInv0, ExtInv1, ExtInv10, ExtInv11, ExtInv2, ExtInv3, ExtInv4, ExtInv5, ExtInv6, ExtInv7,
ExtInv8, ExtInv9,
};
use crate::generation::prover_input::FieldOp::{Inverse, Sqrt};
use crate::generation::state::GenerationState;
use crate::witness::util::{stack_peek, stack_peeks};
@ -60,9 +56,25 @@ impl<F: Field> GenerationState<F> {
/// Finite field extension operations.
fn run_ffe(&self, input_fn: &ProverInputFn) -> U256 {
let field = EvmField::from_str(input_fn.0[1].as_str()).unwrap();
let op = FieldExtOp::from_str(input_fn.0[2].as_str()).unwrap();
let component = input_fn.0[2].as_str();
let xs = stack_peeks(self).expect("Empty stack");
field.extop(op, xs)
// TODO: This sucks... come back later
let n = match component {
"ext_0" => 0,
"ext_1" => 1,
"ext_2" => 2,
"ext_3" => 3,
"ext_4" => 4,
"ext_5" => 5,
"ext_6" => 6,
"ext_7" => 7,
"ext_8" => 8,
"ext_9" => 9,
"ext_10" => 10,
"ext_11" => 11,
_ => panic!("out of bounds")
};
field.ext_inv(n, xs)
}
/// MPT data.
@ -114,21 +126,6 @@ enum FieldOp {
Sqrt,
}
enum FieldExtOp {
ExtInv0,
ExtInv1,
ExtInv2,
ExtInv3,
ExtInv4,
ExtInv5,
ExtInv6,
ExtInv7,
ExtInv8,
ExtInv9,
ExtInv10,
ExtInv11,
}
impl FromStr for EvmField {
type Err = ();
@ -155,28 +152,6 @@ impl FromStr for FieldOp {
}
}
impl FromStr for FieldExtOp {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"ext_inv0" => ExtInv0,
"ext_inv1" => ExtInv1,
"ext_inv2" => ExtInv2,
"ext_inv3" => ExtInv3,
"ext_inv4" => ExtInv4,
"ext_inv5" => ExtInv5,
"ext_inv6" => ExtInv6,
"ext_inv7" => ExtInv7,
"ext_inv8" => ExtInv8,
"ext_inv9" => ExtInv9,
"ext_inv10" => ExtInv10,
"ext_inv11" => ExtInv11,
_ => panic!("Unrecognized field extension operation."),
})
}
}
impl EvmField {
fn order(&self) -> U256 {
match self {
@ -203,23 +178,6 @@ impl EvmField {
}
}
fn extop(&self, op: FieldExtOp, xs: Vec<U256>) -> U256 {
match op {
FieldExtOp::ExtInv0 => self.ext_inv(0, xs),
FieldExtOp::ExtInv1 => self.ext_inv(1, xs),
FieldExtOp::ExtInv2 => self.ext_inv(2, xs),
FieldExtOp::ExtInv3 => self.ext_inv(3, xs),
FieldExtOp::ExtInv4 => self.ext_inv(4, xs),
FieldExtOp::ExtInv5 => self.ext_inv(5, xs),
FieldExtOp::ExtInv6 => self.ext_inv(6, xs),
FieldExtOp::ExtInv7 => self.ext_inv(7, xs),
FieldExtOp::ExtInv8 => self.ext_inv(8, xs),
FieldExtOp::ExtInv9 => self.ext_inv(9, xs),
FieldExtOp::ExtInv10 => self.ext_inv(10, xs),
FieldExtOp::ExtInv11 => self.ext_inv(11, xs),
}
}
fn inverse(&self, x: U256) -> U256 {
let n = self.order();
assert!(x < n);