Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Ligero univariate and multilinear PCS #132

Merged
merged 68 commits into from
Oct 25, 2024
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
f13a576
added hyrax PCS
Antonio95 Oct 25, 2023
fba3d80
Add univariate and multilinear Ligero PCS
mmagician Oct 25, 2023
e00d5b0
adapt the scheme to https://github.com/arkworks-rs/algebra/issues/691
mmagician Oct 26, 2023
9d5119b
move tests shared across univariate and ML ligero to utils
mmagician Oct 26, 2023
86a322f
remove unused no-std import
mmagician Oct 26, 2023
69896d4
adapt the scheme to https://github.com/arkworks-rs/algebra/issues/691
mmagician Oct 26, 2023
ecf73f4
remove unused code in hyrax
mmagician Oct 26, 2023
234e049
Improve the choice of dimensions for polynomial matrix
Antonio95 Oct 20, 2023
dd281f1
Update comments
autquis Oct 26, 2023
14f80fd
parallelised row encoding and col-to-leaf hashing; significant perfor…
Antonio95 Oct 26, 2023
f424c48
expanded on Future Optimisations section
Antonio95 Oct 26, 2023
0628824
fixed GH action failures: formatted and added feature flag
Antonio95 Oct 26, 2023
0a2b119
Merge branch 'master' into ligero-uni-and-ml
mmagician Oct 28, 2023
0d8dc45
remove Prepared data types from `PolynomialCommitment` trait
mmagician Oct 28, 2023
dd58a1a
Merge branch 'master' into hyrax-pcs
mmagician Oct 28, 2023
06c59e9
Remove Prepared data types from `PolynomialCommitment` trait impl
mmagician Oct 28, 2023
a845018
merged master including new crate and directory structure
Antonio95 Oct 30, 2023
12afb33
added necessary dependencies overwritten by previous merge commit
Antonio95 Oct 30, 2023
9b48223
merged master including new crate and directory structure
Antonio95 Oct 30, 2023
5e955bc
fixed hashbrown version
Antonio95 Oct 30, 2023
3b0c371
Add back the cfg dependency for no-std build
mmagician Oct 30, 2023
6967c28
fixed hashbrown version
Antonio95 Oct 30, 2023
dd82dbc
pulled
Antonio95 Oct 30, 2023
a029081
created separate benchmark files
Antonio95 Oct 30, 2023
a7f465a
fixed duplicate dependency to match other branches
Antonio95 Oct 30, 2023
c010663
patched bn254 dep
Antonio95 Oct 30, 2023
d415053
restructured benchmark macros to accept ML schemes; benches working
Antonio95 Oct 31, 2023
acb65ec
moved hashing structures to bench-templates crate, started ligero ben…
Antonio95 Oct 31, 2023
80410d0
completed ligero benchmarks
Antonio95 Oct 31, 2023
25c34aa
added ligero benchmark file
Antonio95 Oct 31, 2023
3ef7309
Hyrax fix bench (#42)
mmagician Nov 13, 2023
370e77c
Ligero fix benches (#40)
mmagician Nov 13, 2023
cc1f75a
Hyrax parallel `commit` (#39)
mmagician Nov 13, 2023
7c7328d
Make Hyrax hiding again (#43)
Antonio95 Nov 13, 2023
2bcff80
Fix tests: sponge config for univariate ligero
autquis Jan 9, 2024
55d7b58
Delete `IOPTranscript`, update with master (#50) (aka Hyrax++)
autquis Jan 18, 2024
d13296c
Merge branch 'master' into hyrax-pcs
autquis Jan 18, 2024
044d74a
Delete `IOPTranscript`, update with master (#51) (aka Ligero++)
autquis Jan 18, 2024
d5c6039
Merge branch 'master' into ligero-uni-and-ml
autquis Jan 18, 2024
1f988ac
Add a few comments and update `Cargo.toml`
autquis Jan 18, 2024
5677c5b
Remove extra `cfg_iter!`
autquis Jan 22, 2024
c2e6412
Change `pedersen_commit` and add `cfg_into_iter!`
autquis Jan 22, 2024
ac4a14c
Hash and absorb
autquis Jan 23, 2024
265e261
added Sync trait bound
Antonio95 Jun 3, 2024
a5cf4cf
removed TODO
Antonio95 Jun 3, 2024
8d356db
Fixed error whereby boolean value returned by path.verify was neglected
Antonio95 Jun 3, 2024
61d9a76
removed unnecessary qualification which linter didn't like
Antonio95 Jun 3, 2024
6c5e096
changed potential panic to returning Err, stopping early
Antonio95 Jun 4, 2024
18a3d84
removed unnecessary function defined inside check()
Antonio95 Jun 4, 2024
f3495d0
various minor fixes
Antonio95 Jun 6, 2024
f66901b
Add `ark-std` to patch
autquis Jun 9, 2024
103669f
Reorder Hyrax checks
Cesar199999 Jun 10, 2024
eee8e0b
Add `ark-std` to patch
autquis Jun 9, 2024
65ef67c
Downgrade `hashbrown`
autquis Oct 21, 2024
67ddd9c
Fix breaking change from algebra/poly (#72)
Cesar199999 Jun 28, 2024
175a610
Reorder deps
autquis Oct 21, 2024
d3e3808
Add dummy doc for nightly
autquis Oct 21, 2024
0858433
Fix `hashbrown` + Replace Blake2 by Blake3
autquis Oct 24, 2024
c2ba181
Revert to Blake2
autquis Oct 25, 2024
9e310f5
Merge branch 'master' into hyrax-pcs
autquis Oct 25, 2024
9b03b60
Fix merging issues
autquis Oct 25, 2024
f5924ee
Test if CI is happy
autquis Oct 25, 2024
cb20740
Revert and cleanup
autquis Oct 25, 2024
5239162
Delete dummy doc
autquis Oct 25, 2024
552163a
Merge branch 'hyrax-pcs' into ligero-uni-and-ml
autquis Oct 25, 2024
921d8ca
Bring back `num_traits`
autquis Oct 25, 2024
621f0b5
Merge branch 'master' into ligero-uni-and-ml
autquis Oct 25, 2024
127370e
Add `/` to Cargo.toml
autquis Oct 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,12 @@ debug = true
ark-ff = { git = "https://github.com/arkworks-rs/algebra/" }
ark-ec = { git = "https://github.com/arkworks-rs/algebra/" }
ark-serialize = { git = "https://github.com/arkworks-rs/algebra/" }
ark-poly = { git = "https://github.com/arkworks-rs/algebra/" }
ark-std = { git = "https://github.com/arkworks-rs/std/" }

ark-crypto-primitives = { git = "https://github.com/arkworks-rs/crypto-primitives" }
ark-r1cs-std = { git = "https://github.com/arkworks-rs/r1cs-std/" }

ark-bls12-377 = { git = "https://github.com/arkworks-rs/curves/" }
ark-bls12-381 = { git = "https://github.com/arkworks-rs/curves/" }
ark-bn254 = { git = "https://github.com/arkworks-rs/curves/" }
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ Unless you explicitly state otherwise, any contribution that you submit to this
[aurora-light]: https://ia.cr/2019/601
[pcd-acc]: https://ia.cr/2020/499
[pst]: https://ia.cr/2011/587
[ligero]: https://ia.cr/2022/1608

## Reference papers

Expand Down Expand Up @@ -211,6 +212,10 @@ TCC 2020
Charalampos Papamanthou, Elaine Shi, Roberto Tamassia
TCC 2013

[Ligero: Lightweight Sublinear Arguments Without a Trusted Setup][ligero]
Scott Ames, Carmit Hazay, Yuval Ishai, Muthuramakrishnan Venkitasubramaniam
CCS 2017

## Acknowledgements

This work was supported by: an Engineering and Physical Sciences Research Council grant; a Google Faculty Award; the RISELab at UC Berkeley; and donations from the Ethereum Foundation and the Interchain Foundation.
103 changes: 87 additions & 16 deletions bench-templates/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
use ark_crypto_primitives::sponge::{
poseidon::{PoseidonConfig, PoseidonSponge},
CryptographicSponge,
use ark_crypto_primitives::{
crh::{sha256::digest::Digest, CRHScheme},
sponge::{
poseidon::{PoseidonConfig, PoseidonSponge},
CryptographicSponge,
},
};
use ark_ff::PrimeField;
use ark_poly::Polynomial;
use ark_serialize::{CanonicalSerialize, Compress};
use ark_std::{test_rng, UniformRand};
use rand_chacha::{rand_core::SeedableRng, ChaCha20Rng};
use rand_chacha::{
rand_core::{RngCore, SeedableRng},
ChaCha20Rng,
};

use core::time::Duration;
use std::time::Instant;
use std::{borrow::Borrow, marker::PhantomData, time::Instant};

use ark_poly_commit::{LabeledPolynomial, PolynomialCommitment};
use ark_poly_commit::{to_bytes, LabeledPolynomial, PolynomialCommitment};

pub use criterion::*;
pub use paste::paste;
Expand All @@ -30,8 +36,10 @@ pub fn bench_pcs_method<
&PCS::VerifierKey,
usize,
fn(usize, &mut ChaCha20Rng) -> P,
fn(usize, &mut ChaCha20Rng) -> P::Point,
) -> Duration,
rand_poly: fn(usize, &mut ChaCha20Rng) -> P,
rand_point: fn(usize, &mut ChaCha20Rng) -> P::Point,
) {
let mut group = c.benchmark_group(msg);
let rng = &mut ChaCha20Rng::from_rng(test_rng()).unwrap();
Expand All @@ -44,7 +52,13 @@ pub fn bench_pcs_method<
BenchmarkId::from_parameter(num_vars),
&num_vars,
|b, num_vars| {
b.iter(|| method(&ck, &vk, *num_vars, rand_poly));
b.iter_custom(|i| {
let mut time = Duration::from_nanos(0);
for _ in 0..i {
time += method(&ck, &vk, *num_vars, rand_poly, rand_point);
}
time
});
},
);
}
Expand All @@ -62,6 +76,7 @@ pub fn commit<
_vk: &PCS::VerifierKey,
num_vars: usize,
rand_poly: fn(usize, &mut ChaCha20Rng) -> P,
_rand_point: fn(usize, &mut ChaCha20Rng) -> P::Point,
) -> Duration {
let rng = &mut ChaCha20Rng::from_rng(test_rng()).unwrap();

Expand Down Expand Up @@ -102,20 +117,20 @@ pub fn open<F, P, PCS>(
_vk: &PCS::VerifierKey,
num_vars: usize,
rand_poly: fn(usize, &mut ChaCha20Rng) -> P,
rand_point: fn(usize, &mut ChaCha20Rng) -> P::Point,
) -> Duration
where
F: PrimeField,
P: Polynomial<F>,
PCS: PolynomialCommitment<F, P, PoseidonSponge<F>>,
P::Point: UniformRand,
{
let rng = &mut ChaCha20Rng::from_rng(test_rng()).unwrap();

let labeled_poly =
LabeledPolynomial::new("test".to_string(), rand_poly(num_vars, rng), None, None);

let (coms, states) = PCS::commit(&ck, [&labeled_poly], Some(rng)).unwrap();
let point = P::Point::rand(rng);
let point = rand_point(num_vars, rng);

let start = Instant::now();
let _ = PCS::open(
Expand Down Expand Up @@ -173,20 +188,21 @@ pub fn verify<F, P, PCS>(
vk: &PCS::VerifierKey,
num_vars: usize,
rand_poly: fn(usize, &mut ChaCha20Rng) -> P,
rand_point: fn(usize, &mut ChaCha20Rng) -> P::Point,
) -> Duration
where
F: PrimeField,
P: Polynomial<F>,
PCS: PolynomialCommitment<F, P, PoseidonSponge<F>>,
P::Point: UniformRand,
{
let rng = &mut ChaCha20Rng::from_rng(test_rng()).unwrap();

let labeled_poly =
LabeledPolynomial::new("test".to_string(), rand_poly(num_vars, rng), None, None);

let (coms, states) = PCS::commit(&ck, [&labeled_poly], Some(rng)).unwrap();
let point = P::Point::rand(rng);
let point = rand_point(num_vars, rng);

let claimed_eval = labeled_poly.evaluate(&point);
let proof = PCS::open(
&ck,
Expand Down Expand Up @@ -243,7 +259,7 @@ fn test_sponge<F: PrimeField>() -> PoseidonSponge<F> {

#[macro_export]
macro_rules! bench_method {
($c:expr, $method:ident, $scheme_type:ty, $rand_poly:ident) => {
($c:expr, $method:ident, $scheme_type:ty, $rand_poly:ident, $rand_point:ident) => {
let scheme_type_str = stringify!($scheme_type);
let bench_name = format!("{} {}", stringify!($method), scheme_type_str);
bench_pcs_method::<_, _, $scheme_type>(
Expand All @@ -252,19 +268,20 @@ macro_rules! bench_method {
&bench_name,
$method::<_, _, $scheme_type>,
$rand_poly::<_>,
$rand_point::<_>,
);
};
}

#[macro_export]
macro_rules! bench {
(
$scheme_type:ty, $rand_poly:ident
$scheme_type:ty, $rand_poly:ident, $rand_point:ident
) => {
fn bench_pcs(c: &mut Criterion) {
bench_method!(c, commit, $scheme_type, $rand_poly);
bench_method!(c, open, $scheme_type, $rand_poly);
bench_method!(c, verify, $scheme_type, $rand_poly);
bench_method!(c, commit, $scheme_type, $rand_poly, $rand_point);
bench_method!(c, open, $scheme_type, $rand_poly, $rand_point);
bench_method!(c, verify, $scheme_type, $rand_poly, $rand_point);
}

criterion_group!(benches, bench_pcs);
Expand All @@ -276,3 +293,57 @@ macro_rules! bench {
}
};
}

/**** Auxiliary methods for linear-code-based PCSs ****/

/// Needed for benches and tests.
pub struct LeafIdentityHasher;

impl CRHScheme for LeafIdentityHasher {
type Input = Vec<u8>;
type Output = Vec<u8>;
type Parameters = ();

fn setup<R: RngCore>(_: &mut R) -> Result<Self::Parameters, ark_crypto_primitives::Error> {
Ok(())
}

fn evaluate<T: Borrow<Self::Input>>(
_: &Self::Parameters,
input: T,
) -> Result<Self::Output, ark_crypto_primitives::Error> {
Ok(input.borrow().to_vec().into())
}
}

/// Needed for benches and tests.
pub struct FieldToBytesColHasher<F, D>
where
F: PrimeField + CanonicalSerialize,
D: Digest,
{
_phantom: PhantomData<(F, D)>,
}

impl<F, D> CRHScheme for FieldToBytesColHasher<F, D>
where
F: PrimeField + CanonicalSerialize,
D: Digest,
{
type Input = Vec<F>;
type Output = Vec<u8>;
type Parameters = ();

fn setup<R: RngCore>(_rng: &mut R) -> Result<Self::Parameters, ark_crypto_primitives::Error> {
Ok(())
}

fn evaluate<T: Borrow<Self::Input>>(
_parameters: &Self::Parameters,
input: T,
) -> Result<Self::Output, ark_crypto_primitives::Error> {
let mut dig = D::new();
dig.update(to_bytes!(input.borrow()).unwrap());
Ok(dig.finalize().to_vec())
}
}
16 changes: 13 additions & 3 deletions poly-commit/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,21 @@ ark-std = { version = "^0.4.0", default-features = false }

ark-relations = { version = "^0.4.0", default-features = false, optional = true }
ark-r1cs-std = { version = "^0.4.0", default-features = false, optional = true }
hashbrown = { version = "0.13", default-features = false, optional = true }
hashbrown = { version = "0.14", default-features = false, optional = true }

digest = "0.10"
derivative = { version = "2", features = [ "use_core" ] }
rayon = { version = "1", optional = true }
merlin = { version = "3.0.0", default-features = false }

[[bench]]
name = "pcs"
path = "benches/pcs.rs"
name = "ipa_times"
path = "benches/ipa_times.rs"
harness = false

[[bench]]
name = "ligero_ml_times"
path = "benches/ligero_ml_times.rs"
harness = false

[[bench]]
Expand All @@ -38,10 +44,14 @@ harness = false
ark-ed-on-bls12-381 = { version = "^0.4.0", default-features = false }
ark-bls12-381 = { version = "^0.4.0", default-features = false, features = [ "curve" ] }
ark-bls12-377 = { version = "^0.4.0", default-features = false, features = [ "curve" ] }
ark-bn254 = { version = "^0.4.0", default-features = false, features = [ "curve" ] }
blake2 = { version = "0.10", default-features = false }
rand_chacha = { version = "0.3.0", default-features = false }
ark-pcs-bench-templates = { path = "../bench-templates" }

[target.'cfg(target_arch = "aarch64")'.dependencies]
num-traits = { version = "0.2", default-features = false, features = ["libm"] }

[features]
default = [ "std", "parallel" ]
std = [ "ark-ff/std", "ark-ec/std", "ark-poly/std", "ark-std/std", "ark-relations/std", "ark-serialize/std", "ark-crypto-primitives/std"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ fn rand_poly_ipa_pc<F: PrimeField>(degree: usize, rng: &mut ChaCha20Rng) -> Dens
DenseUnivariatePoly::rand(degree, rng)
}

fn rand_point_ipa_pc<F: PrimeField>(_: usize, rng: &mut ChaCha20Rng) -> F {
F::rand(rng)
}

const MIN_NUM_VARS: usize = 10;
const MAX_NUM_VARS: usize = 20;

bench!(IPA_JubJub, rand_poly_ipa_pc);
bench!(IPA_JubJub, rand_poly_ipa_pc, rand_point_ipa_pc);
58 changes: 58 additions & 0 deletions poly-commit/benches/ligero_ml_times.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
use ark_crypto_primitives::{
crh::{sha256::Sha256, CRHScheme, TwoToOneCRHScheme},
merkle_tree::{ByteDigestConverter, Config},
sponge::poseidon::PoseidonSponge,
};
use ark_pcs_bench_templates::*;
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};

use ark_bn254::Fr;
use ark_ff::PrimeField;

use ark_poly_commit::linear_codes::{LinearCodePCS, MultilinearLigero};
use blake2::Blake2s256;
use rand_chacha::ChaCha20Rng;

// Ligero PCS over BN254
struct MerkleTreeParams;
type LeafH = LeafIdentityHasher;
type CompressH = Sha256;
impl Config for MerkleTreeParams {
type Leaf = Vec<u8>;

type LeafDigest = <LeafH as CRHScheme>::Output;
type LeafInnerDigestConverter = ByteDigestConverter<Self::LeafDigest>;
type InnerDigest = <CompressH as TwoToOneCRHScheme>::Output;

type LeafHash = LeafH;
type TwoToOneHash = CompressH;
}

pub type MLE<F> = DenseMultilinearExtension<F>;
type MTConfig = MerkleTreeParams;
type Sponge<F> = PoseidonSponge<F>;
type ColHasher<F> = FieldToBytesColHasher<F, Blake2s256>;
type Ligero<F> = LinearCodePCS<
MultilinearLigero<F, MTConfig, Sponge<F>, MLE<F>, ColHasher<F>>,
F,
MLE<F>,
Sponge<F>,
MTConfig,
ColHasher<F>,
>;

fn rand_poly_ligero_ml<F: PrimeField>(
num_vars: usize,
rng: &mut ChaCha20Rng,
) -> DenseMultilinearExtension<F> {
DenseMultilinearExtension::rand(num_vars, rng)
}

fn rand_point_ligero_ml<F: PrimeField>(num_vars: usize, rng: &mut ChaCha20Rng) -> Vec<F> {
(0..num_vars).map(|_| F::rand(rng)).collect()
}

const MIN_NUM_VARS: usize = 12;
const MAX_NUM_VARS: usize = 22;

bench!(Ligero<Fr>, rand_poly_ligero_ml, rand_point_ligero_ml);
18 changes: 18 additions & 0 deletions poly-commit/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,20 @@ pub enum Error {
/// Index of the offending polynomial.
label: String,
},

/// This means a failure in verifying the commitment or the opening.
InvalidCommitment,

/// For PCS which rely on Fiat-Shamir to be rendered non-interactive,
/// these are errors that result from incorrect transcript manipulation.
TranscriptError,

/// This means the required soundness error bound is inherently impossible.
/// E.g., the field is not big enough.
InvalidParameters(String),

/// Error resulting from hashing in linear code - based PCS.
HashingError,
}

impl core::fmt::Display for Error {
Expand Down Expand Up @@ -179,6 +193,10 @@ impl core::fmt::Display for Error {
support up to degree ({:?})", label, poly_degree, supported_degree
),
Error::IncorrectInputLength(err) => write!(f, "{}", err),
Error::InvalidCommitment => write!(f, "Failed to verify the commitment"),
Error::TranscriptError => write!(f, "Incorrect transcript manipulation"),
Error::InvalidParameters(err) => write!(f, "{}", err),
Error::HashingError => write!(f, "Error resulting from hashing")
}
}
}
Expand Down
Loading
Loading