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

Transcript trait #477

Merged
merged 10 commits into from
Oct 22, 2024
22 changes: 13 additions & 9 deletions jolt-core/benches/commit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ use jolt_core::poly::commitment::commitment_scheme::{BatchType, CommitShape, Com
use jolt_core::poly::commitment::hyperkzg::HyperKZG;
use jolt_core::poly::commitment::kzg::CommitMode;
use jolt_core::poly::commitment::zeromorph::Zeromorph;
use jolt_core::utils::transcript::{DefaultTranscript, Transcript};
use rand_chacha::ChaCha20Rng;
use rand_core::{RngCore, SeedableRng};

const SRS_SIZE: usize = 1 << 10;

// Sets up the benchmark by generating leaves and computing known products
// and allows configuring the percentage of ones in the leaves
fn setup_bench<PCS, F>(
fn setup_bench<PCS, F, ProofTranscript>(
num_layers: usize,
layer_size: usize,
percentage_ones: u32,
Expand All @@ -24,8 +25,9 @@ fn setup_bench<PCS, F>(
Vec<F>,
)
where
PCS: CommitmentScheme<Field = F>,
PCS: CommitmentScheme<ProofTranscript, Field = F>,
F: JoltField,
ProofTranscript: Transcript,
{
assert!(
percentage_ones <= 100,
Expand Down Expand Up @@ -60,18 +62,20 @@ where
(leaves, setup, known_products)
}

fn benchmark_commit<PCS, F>(
fn benchmark_commit<PCS, F, ProofTranscript>(
c: &mut Criterion,
name: &str,
num_layer: usize,
layer_size: usize,
threshold: u32,
batch_type: BatchType,
) where
PCS: CommitmentScheme<Field = F>, // Generic over PCS implementing CommitmentScheme for field F
F: JoltField, // Generic over a field F
PCS: CommitmentScheme<ProofTranscript, Field = F>, // Generic over PCS implementing CommitmentScheme for field F
F: JoltField, // Generic over a field F
ProofTranscript: Transcript,
{
let (leaves, setup, _) = setup_bench::<PCS, F>(num_layer, layer_size, threshold);
let (leaves, setup, _) =
setup_bench::<PCS, F, ProofTranscript>(num_layer, layer_size, threshold);
let leaves = leaves
.iter()
.map(|layer| layer.as_slice())
Expand All @@ -97,23 +101,23 @@ fn main() {
let num_layers = 50;
let layer_size = 1 << 10;
// Zeromorph
benchmark_commit::<Zeromorph<Bn254>, Fr>(
benchmark_commit::<Zeromorph<Bn254, DefaultTranscript>, Fr, DefaultTranscript>(
&mut criterion,
"Zeromorph",
num_layers,
layer_size,
90,
BatchType::Big,
);
benchmark_commit::<HyperKZG<Bn254>, Fr>(
benchmark_commit::<HyperKZG<Bn254, DefaultTranscript>, Fr, DefaultTranscript>(
&mut criterion,
"HyperKZG",
num_layers,
layer_size,
90,
BatchType::GrandProduct,
);
benchmark_commit::<HyperKZG<Bn254>, Fr>(
benchmark_commit::<HyperKZG<Bn254, DefaultTranscript>, Fr, DefaultTranscript>(
&mut criterion,
"HyperKZG",
num_layers,
Expand Down
101 changes: 68 additions & 33 deletions jolt-core/benches/grand_product.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use jolt_core::subprotocols::grand_product::{
use jolt_core::subprotocols::grand_product_quarks::{
QuarkGrandProduct, QuarkGrandProductConfig, QuarkHybridLayerDepth,
};
use jolt_core::utils::transcript::ProofTranscript;
use jolt_core::utils::transcript::{DefaultTranscript, Transcript};
use rand_chacha::ChaCha20Rng;
use rand_core::{RngCore, SeedableRng};

Expand All @@ -26,7 +26,7 @@ struct BenchConfig {

// Sets up the benchmark by generating leaves and computing known products
// and allows configuring the percentage of ones in the leaves
fn setup_bench<PCS, F>(
fn setup_bench<PCS, F, ProofTranscript>(
num_batches: usize,
layer_size: usize,
threshold: u32,
Expand All @@ -38,8 +38,9 @@ fn setup_bench<PCS, F>(
Vec<F>,
)
where
PCS: CommitmentScheme<Field = F>,
PCS: CommitmentScheme<ProofTranscript, Field = F>,
F: JoltField,
ProofTranscript: Transcript,
{
assert!(
threshold <= 100,
Expand Down Expand Up @@ -74,17 +75,21 @@ where
(leaves, setup, known_products)
}

fn benchmark_prove<PCS, F, G>(
fn benchmark_prove<PCS, F, G, ProofTranscript>(
c: &mut Criterion,
config: BenchConfig,
grand_products_config: G::Config,
) where
PCS: CommitmentScheme<Field = F>,
PCS: CommitmentScheme<ProofTranscript, Field = F>,
F: JoltField,
G: BatchedGrandProduct<F, PCS, Leaves = Vec<Vec<F>>>,
G: BatchedGrandProduct<F, PCS, ProofTranscript, Leaves = Vec<Vec<F>>>,
ProofTranscript: Transcript,
{
let (leaves, setup, _) =
setup_bench::<PCS, F>(config.num_layers, config.layer_size, config.percentage_ones);
let (leaves, setup, _) = setup_bench::<PCS, F, ProofTranscript>(
config.num_layers,
config.layer_size,
config.percentage_ones,
);

let mut grand_product = G::construct_with_config(leaves, grand_products_config);

Expand All @@ -97,9 +102,9 @@ fn benchmark_prove<PCS, F, G>(
b.iter(|| {
// Prove the grand product
let mut transcript = ProofTranscript::new(b"test_transcript");
let mut prover_accumulator: ProverOpeningAccumulator<F> =
let mut prover_accumulator: ProverOpeningAccumulator<F, ProofTranscript> =
ProverOpeningAccumulator::new();
let _proof: BatchedGrandProductProof<PCS> = grand_product
let _proof: BatchedGrandProductProof<PCS, ProofTranscript> = grand_product
.prove_grand_product(
Some(&mut prover_accumulator),
&mut transcript,
Expand All @@ -111,21 +116,26 @@ fn benchmark_prove<PCS, F, G>(
);
}

fn benchmark_verify<PCS, F, G>(
fn benchmark_verify<PCS, F, G, ProofTranscript>(
c: &mut Criterion,
config: BenchConfig,
grand_products_config: G::Config,
) where
PCS: CommitmentScheme<Field = F>,
PCS: CommitmentScheme<ProofTranscript, Field = F>,
F: JoltField,
G: BatchedGrandProduct<F, PCS, Leaves = Vec<Vec<F>>>,
G: BatchedGrandProduct<F, PCS, ProofTranscript, Leaves = Vec<Vec<F>>>,
ProofTranscript: Transcript,
{
let (leaves, setup, known_products) =
setup_bench::<PCS, F>(config.num_layers, config.layer_size, config.percentage_ones);
let (leaves, setup, known_products) = setup_bench::<PCS, F, ProofTranscript>(
config.num_layers,
config.layer_size,
config.percentage_ones,
);

let mut transcript = ProofTranscript::new(b"test_transcript");
let mut grand_product = G::construct_with_config(leaves, grand_products_config);
let mut prover_accumulator: ProverOpeningAccumulator<F> = ProverOpeningAccumulator::new();
let mut prover_accumulator: ProverOpeningAccumulator<F, ProofTranscript> =
ProverOpeningAccumulator::new();
let (proof, r_prover) = grand_product.prove_grand_product(
Some(&mut prover_accumulator),
&mut transcript,
Expand All @@ -141,7 +151,7 @@ fn benchmark_verify<PCS, F, G>(
b.iter(|| {
// Verify the grand product
transcript = ProofTranscript::new(b"test_transcript");
let mut verifier_accumulator: VerifierOpeningAccumulator<F, PCS> =
let mut verifier_accumulator: VerifierOpeningAccumulator<F, PCS, ProofTranscript> =
VerifierOpeningAccumulator::new();
let (_, r_verifier) = QuarkGrandProduct::verify_grand_product(
&proof,
Expand All @@ -157,17 +167,18 @@ fn benchmark_verify<PCS, F, G>(
);
}

fn benchmark_prove_and_verify<PCS, F, G>(
fn benchmark_prove_and_verify<PCS, F, G, ProofTranscript>(
c: &mut Criterion,
config: BenchConfig,
grand_product_config: G::Config,
) where
PCS: CommitmentScheme<Field = F>,
PCS: CommitmentScheme<ProofTranscript, Field = F>,
F: JoltField,
G: BatchedGrandProduct<F, PCS, Leaves = Vec<Vec<F>>>,
G: BatchedGrandProduct<F, PCS, ProofTranscript, Leaves = Vec<Vec<F>>>,
ProofTranscript: Transcript,
{
benchmark_prove::<PCS, F, G>(c, config, grand_product_config);
benchmark_verify::<PCS, F, G>(c, config, grand_product_config);
benchmark_prove::<PCS, F, G, ProofTranscript>(c, config, grand_product_config);
benchmark_verify::<PCS, F, G, ProofTranscript>(c, config, grand_product_config);
}

fn main() {
Expand All @@ -184,23 +195,34 @@ fn main() {
};
// Hybrid
config.name = "HyperKZG Hybrid";
benchmark_prove_and_verify::<HyperKZG<Bn254>, Fr, QuarkGrandProduct<Fr>>(
&mut c,
config,
QuarkGrandProductConfig::default(),
);
benchmark_prove_and_verify::<
HyperKZG<Bn254, DefaultTranscript>,
Fr,
QuarkGrandProduct<Fr, DefaultTranscript>,
DefaultTranscript,
>(&mut c, config, QuarkGrandProductConfig::default());

// Hybrid min
config.name = "HyperKZG Hybrid Min Crossover";
benchmark_prove_and_verify::<HyperKZG<Bn254>, Fr, QuarkGrandProduct<Fr>>(
benchmark_prove_and_verify::<
HyperKZG<Bn254, DefaultTranscript>,
Fr,
QuarkGrandProduct<Fr, DefaultTranscript>,
DefaultTranscript,
>(
&mut c,
config,
QuarkGrandProductConfig {
hybrid_layer_depth: QuarkHybridLayerDepth::Min,
},
);
config.name = "HyperKZG Hybrid Min Crossover";
benchmark_prove_and_verify::<HyperKZG<Bn254>, Fr, QuarkGrandProduct<Fr>>(
benchmark_prove_and_verify::<
HyperKZG<Bn254, DefaultTranscript>,
Fr,
QuarkGrandProduct<Fr, DefaultTranscript>,
DefaultTranscript,
>(
&mut c,
BenchConfig {
percentage_ones: 10,
Expand All @@ -213,7 +235,12 @@ fn main() {

// Hybrid max
config.name = "HyperKZG Hybrid Max Crossover";
benchmark_prove_and_verify::<HyperKZG<Bn254>, Fr, QuarkGrandProduct<Fr>>(
benchmark_prove_and_verify::<
HyperKZG<Bn254, DefaultTranscript>,
Fr,
QuarkGrandProduct<Fr, DefaultTranscript>,
DefaultTranscript,
>(
&mut c,
config,
QuarkGrandProductConfig {
Expand All @@ -223,11 +250,19 @@ fn main() {

// GKR
config.name = "HyperKZG GKR";
benchmark_prove_and_verify::<HyperKZG<Bn254>, Fr, BatchedDenseGrandProduct<Fr>>(
benchmark_prove_and_verify::<
HyperKZG<Bn254, DefaultTranscript>,
Fr,
BatchedDenseGrandProduct<Fr, DefaultTranscript>,
DefaultTranscript,
>(
&mut c,
config,
<BatchedDenseGrandProduct<_> as BatchedGrandProduct<Fr, HyperKZG<Bn254>>>::Config::default(
),
<BatchedDenseGrandProduct<_, DefaultTranscript> as BatchedGrandProduct<
Fr,
HyperKZG<Bn254, DefaultTranscript>,
DefaultTranscript,
>>::Config::default(),
);

c.final_summary();
Expand Down
Loading
Loading