Skip to content

Commit

Permalink
Rust MSM Calldata Builder (#176)
Browse files Browse the repository at this point in the history
Co-authored-by: feltroidprime
  • Loading branch information
raugfer authored Aug 30, 2024
1 parent b084d81 commit a08af61
Show file tree
Hide file tree
Showing 24 changed files with 1,723 additions and 789 deletions.
10 changes: 5 additions & 5 deletions hydra/garaga/hints/ecip.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,12 @@ def zk_ecip_hint(
pts, list(scalars), c_id.value
)

a_num = [field(int(f, 16)) for f in a_num] if len(a_num) > 0 else [field.zero()]
a_den = [field(int(f, 16)) for f in a_den] if len(a_den) > 0 else [field.one()]
b_num = [field(int(f, 16)) for f in b_num] if len(b_num) > 0 else [field.zero()]
b_den = [field(int(f, 16)) for f in b_den] if len(b_den) > 0 else [field.one()]
a_num = [field(f) for f in a_num] if len(a_num) > 0 else [field.zero()]
a_den = [field(f) for f in a_den] if len(a_den) > 0 else [field.one()]
b_num = [field(f) for f in b_num] if len(b_num) > 0 else [field.zero()]
b_den = [field(f) for f in b_den] if len(b_den) > 0 else [field.one()]

Q = G1Point(int(q[0], 16), int(q[1], 16), c_id)
Q = G1Point(q[0], q[1], c_id)
sum_dlog = FunctionFelt(
RationalFunction(Polynomial(a_num), Polynomial(a_den)),
RationalFunction(Polynomial(b_num), Polynomial(b_den)),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use crate::ecip::{
curve::{get_irreducible_poly, CurveParamsProvider},
polynomial::{pad_with_zero_coefficients_to_length, Polynomial},
};
use crate::algebra::polynomial::{pad_with_zero_coefficients_to_length, Polynomial};
use crate::definitions::{get_irreducible_poly, CurveParamsProvider};
use lambdaworks_math::field::traits::IsPrimeField;

// Returns (Q(X), R(X)) such that Π(Pi)(X) = Q(X) * P_irr(X) + R(X), for a given curve and extension degree.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::curve::CurveParamsProvider;
use lambdaworks_math::field::{element::FieldElement, traits::IsPrimeField};
use crate::definitions::{CurveParamsProvider, FieldElement};
use lambdaworks_math::field::traits::IsPrimeField;
use num_bigint::{BigInt, BigUint, Sign};

#[derive(Debug, Clone)]
Expand Down
4 changes: 4 additions & 0 deletions tools/garaga_rs/src/algebra/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub mod extf_mul;
pub mod g1point;
pub mod polynomial;
pub mod rational_function;
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use lambdaworks_math::field::{element::FieldElement, traits::IsPrimeField};
use crate::definitions::FieldElement;
use lambdaworks_math::field::traits::IsPrimeField;

#[derive(Debug, Clone)]
pub struct Polynomial<F: IsPrimeField> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::ecip::polynomial::Polynomial;
use lambdaworks_math::field::{element::FieldElement, traits::IsPrimeField};
use crate::algebra::polynomial::Polynomial;
use crate::definitions::FieldElement;
use lambdaworks_math::field::traits::IsPrimeField;

#[derive(Debug, Clone)]
pub struct RationalFunction<F: IsPrimeField> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField;
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField;
use lambdaworks_math::field::element::FieldElement;
use crate::algebra::polynomial::Polynomial;
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField as BLSPF;
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField as BNPF;
use lambdaworks_math::field::element::FieldElement as Felt;
use lambdaworks_math::field::fields::fft_friendly::stark_252_prime_field::Stark252PrimeField as StrkPF;
use lambdaworks_math::field::fields::montgomery_backed_prime_fields::{
IsModulus, MontgomeryBackendPrimeField,
};

use crate::ecip::polynomial::Polynomial;
use lambdaworks_math::field::traits::IsPrimeField;
use lambdaworks_math::unsigned_integer::element::U256;
use num_bigint::BigUint;
Expand Down Expand Up @@ -34,6 +34,23 @@ impl From<u8> for CurveID {
}
}

impl From<usize> for CurveID {
fn from(value: usize) -> Self {
match value {
0 => CurveID::BN254,
1 => CurveID::BLS12_381,
2 => CurveID::SECP256K1,
3 => CurveID::SECP256R1,
4 => CurveID::X25519,
_ => panic!("Invalid curve ID"),
}
}
}
pub type FieldElement<F> = Felt<F>;
pub type BN254PrimeField = BNPF;
pub type BLS12381PrimeField = BLSPF;
pub type Stark252PrimeField = StrkPF;

pub const SECP256K1_PRIME_FIELD_ORDER: U256 =
U256::from_hex_unchecked("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");

Expand Down Expand Up @@ -74,6 +91,7 @@ pub struct CurveParams<F: IsPrimeField> {
pub g_y: FieldElement<F>,
pub n: FieldElement<F>, // Order of the curve
pub h: u32, // Cofactor
pub fp_generator: FieldElement<F>,
pub irreducible_polys: HashMap<usize, &'static [i8]>,
}

Expand Down Expand Up @@ -116,6 +134,7 @@ impl CurveParamsProvider<SECP256K1PrimeField> for SECP256K1PrimeField {
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
),
h: 1,
fp_generator: FieldElement::from(3),
irreducible_polys: HashMap::from([]), // Provide appropriate values here
}
}
Expand All @@ -140,6 +159,7 @@ impl CurveParamsProvider<SECP256R1PrimeField> for SECP256R1PrimeField {
"FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
),
h: 1,
fp_generator: FieldElement::from(6),
irreducible_polys: HashMap::from([]), // Provide appropriate values here
}
}
Expand All @@ -162,22 +182,24 @@ impl CurveParamsProvider<X25519PrimeField> for X25519PrimeField {
"1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED",
),
h: 8,
fp_generator: FieldElement::from(6),
irreducible_polys: HashMap::from([]), // Provide appropriate values here
}
}
}

impl CurveParamsProvider<BN254PrimeField> for BN254PrimeField {
fn get_curve_params() -> CurveParams<BN254PrimeField> {
// You need to provide appropriate curve parameters here
// Replace the values with the actual curve parameters for BN254
CurveParams {
a: FieldElement::zero(), // Replace with actual 'a'
b: FieldElement::from_hex_unchecked("3"), // Replace with actual 'b'
a: FieldElement::zero(),
b: FieldElement::from(3),
g_x: FieldElement::from_hex_unchecked("1"), // Replace with actual 'g_x'
g_y: FieldElement::from_hex_unchecked("2"), // Replace with actual 'g_y'
n: FieldElement::from_hex_unchecked("1"), // Replace with actual 'n'
h: 1, // Replace with actual 'h'
n: FieldElement::from_hex_unchecked(
"30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001",
),
h: 1, // Replace with actual 'h'
fp_generator: FieldElement::from(3),
irreducible_polys: HashMap::from([
(6, [82, 0, 0, -18, 0, 0, 1].as_slice()),
(12, [82, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 1].as_slice()),
Expand All @@ -188,15 +210,16 @@ impl CurveParamsProvider<BN254PrimeField> for BN254PrimeField {

impl CurveParamsProvider<BLS12381PrimeField> for BLS12381PrimeField {
fn get_curve_params() -> CurveParams<BLS12381PrimeField> {
// You need to provide appropriate curve parameters here
// Replace the values with the actual curve parameters for BN254
CurveParams {
a: FieldElement::zero(), // Replace with actual 'a'
b: FieldElement::from_hex_unchecked("4"), // Replace with actual 'b'
a: FieldElement::zero(),
b: FieldElement::from(4),
g_x: FieldElement::from_hex_unchecked("1"), // Replace with actual 'g_x'
g_y: FieldElement::from_hex_unchecked("2"), // Replace with actual 'g_y'
n: FieldElement::from_hex_unchecked("1"), // Replace with actual 'n'
h: 1, // Replace with actual 'h'
n: FieldElement::from_hex_unchecked(
"73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001",
),
h: 1, // Replace with actual 'h'
fp_generator: FieldElement::from(3),
irreducible_polys: HashMap::from([
(6, [2, 0, 0, -2, 0, 0, 1].as_slice()),
(12, [2, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1].as_slice()),
Expand Down
Loading

0 comments on commit a08af61

Please sign in to comment.