Skip to content

Commit 0fe9dc4

Browse files
committed
Orion PCS implementation prorotyped
1 parent d9efec3 commit 0fe9dc4

16 files changed

+1303
-7
lines changed

Cargo.lock

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ members = [
2020
]
2121
resolver = "2"
2222

23-
2423
[workspace.dependencies]
2524
ark-std = "0.4"
2625
ark-bn254 = "0.4.0"

arith/src/serde.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ pub trait FieldSerde: Sized {
2323
fn deserialize_from<R: Read>(reader: R) -> FieldSerdeResult<Self>;
2424
}
2525

26-
macro_rules! field_serde_for_integer {
26+
macro_rules! field_serde_for_number {
2727
($int_type: ident, $size_in_bytes: expr) => {
2828
impl FieldSerde for $int_type {
2929
/// size of the serialized bytes
3030
const SERIALIZED_SIZE: usize = $size_in_bytes;
3131

32-
/// serialize u64 into bytes
32+
/// serialize number into bytes
3333
fn serialize_into<W: Write>(&self, mut writer: W) -> FieldSerdeResult<()> {
3434
writer.write_all(&self.to_le_bytes())?;
3535
Ok(())
3636
}
3737

38-
/// deserialize bytes into u64
38+
/// deserialize bytes into number
3939
fn deserialize_from<R: Read>(mut reader: R) -> FieldSerdeResult<Self> {
4040
let mut buffer = [0u8; Self::SERIALIZED_SIZE];
4141
reader.read_exact(&mut buffer)?;
@@ -45,9 +45,10 @@ macro_rules! field_serde_for_integer {
4545
};
4646
}
4747

48-
field_serde_for_integer!(u64, 8);
49-
field_serde_for_integer!(usize, 8);
50-
field_serde_for_integer!(u8, 1);
48+
field_serde_for_number!(u64, 8);
49+
field_serde_for_number!(usize, 8);
50+
field_serde_for_number!(u8, 1);
51+
field_serde_for_number!(f64, 8);
5152

5253
impl<V: FieldSerde> FieldSerde for Vec<V> {
5354
const SERIALIZED_SIZE: usize = unimplemented!();

gkr/src/prover/linear_gkr.rs

+3
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ impl<Cfg: GKRConfig> Prover<Cfg> {
168168
pcs_scratch: &mut <Cfg::PCS as PCSForExpanderGKR<Cfg::FieldConfig, Cfg::Transcript>>::ScratchPad,
169169
transcript: &mut Cfg::Transcript,
170170
) {
171+
transcript.lock_proof();
171172
let opening = Cfg::PCS::open(
172173
pcs_params,
173174
&self.config.mpi_config,
@@ -177,6 +178,8 @@ impl<Cfg: GKRConfig> Prover<Cfg> {
177178
transcript,
178179
pcs_scratch,
179180
);
181+
transcript.unlock_proof();
182+
180183
let mut buffer = vec![];
181184
opening.serialize_into(&mut buffer).unwrap(); // TODO: error propagation
182185
transcript.append_u8_slice(&buffer);

gkr/src/verifier.rs

+2
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ impl<Cfg: GKRConfig> Verifier<Cfg> {
360360
)
361361
.unwrap();
362362

363+
transcript.lock_proof();
363364
let verified = Cfg::PCS::verify(
364365
pcs_params,
365366
&self.config.mpi_config,
@@ -370,6 +371,7 @@ impl<Cfg: GKRConfig> Verifier<Cfg> {
370371
transcript,
371372
&opening,
372373
);
374+
transcript.unlock_proof();
373375

374376
let mut buffer = vec![];
375377
opening.serialize_into(&mut buffer).unwrap(); // TODO: error propagation

poly_commit/Cargo.toml

+15
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,20 @@ gkr_field_config = { path = "../config/gkr_field_config" }
99
mpi_config = { path = "../config/mpi_config" }
1010
polynomials = { path = "../arith/polynomials"}
1111
transcript = { path = "../transcript" }
12+
tree = { path = "../tree" }
1213

1314
rand.workspace = true
15+
ark-std.workspace = true
16+
thiserror.workspace = true
17+
18+
[dev-dependencies]
19+
gf2 = { path = "../arith/gf2" }
20+
gf2_128 = { path = "../arith/gf2_128" }
21+
mersenne31 = { path = "../arith/mersenne31" }
22+
23+
tynm.workspace = true
24+
criterion.workspace = true
25+
26+
[[bench]]
27+
name = "orion"
28+
harness = false

poly_commit/benches/orion.rs

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
use std::{hint::black_box, ops::Mul};
2+
3+
use arith::{Field, SimdField};
4+
use ark_std::test_rng;
5+
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
6+
use gf2::{GF2x128, GF2x8, GF2};
7+
use gf2_128::GF2_128;
8+
use poly_commit::{OrionSRS, OrionScratchPad, ORION_CODE_PARAMETER_INSTANCE};
9+
use polynomials::MultiLinearPoly;
10+
use transcript::{BytesHashTranscript, Keccak256hasher, Transcript};
11+
use tynm::type_name;
12+
13+
fn committing_benchmark_helper<F, EvalF, ComPackF, OpenPackF, T>(
14+
c: &mut Criterion,
15+
lowest_num_vars: usize,
16+
highest_num_vars: usize,
17+
) where
18+
F: Field,
19+
EvalF: Field + From<F> + Mul<F, Output = EvalF>,
20+
ComPackF: SimdField<Scalar = F>,
21+
OpenPackF: SimdField<Scalar = F>,
22+
T: Transcript<EvalF>,
23+
{
24+
let mut group = c.benchmark_group(format!(
25+
"Orion PCS committing benchmarking: F = {}, ComPackF = {}",
26+
type_name::<F>(),
27+
type_name::<ComPackF>(),
28+
));
29+
30+
let mut rng = test_rng();
31+
let mut orion_scratch = OrionScratchPad::default();
32+
33+
for num_vars in lowest_num_vars..=highest_num_vars {
34+
let poly = MultiLinearPoly::<F>::random(num_vars, &mut rng);
35+
36+
let orion_srs =
37+
OrionSRS::from_random::<F>(num_vars, ORION_CODE_PARAMETER_INSTANCE, &mut rng);
38+
39+
group
40+
.bench_function(
41+
BenchmarkId::new(format!("{num_vars} variables"), num_vars),
42+
|b| {
43+
b.iter(|| {
44+
_ = black_box(
45+
orion_srs
46+
.commit::<F, ComPackF>(&poly, &mut orion_scratch)
47+
.unwrap(),
48+
)
49+
})
50+
},
51+
)
52+
.sample_size(10);
53+
}
54+
}
55+
56+
fn orion_committing_benchmark(c: &mut Criterion) {
57+
committing_benchmark_helper::<
58+
GF2,
59+
GF2_128,
60+
GF2x128,
61+
GF2x8,
62+
BytesHashTranscript<_, Keccak256hasher>,
63+
>(c, 19, 30);
64+
}
65+
66+
fn opening_benchmark_helper<F, EvalF, ComPackF, OpenPackF, T>(
67+
c: &mut Criterion,
68+
lowest_num_vars: usize,
69+
highest_num_vars: usize,
70+
) where
71+
F: Field,
72+
EvalF: Field + From<F> + Mul<F, Output = EvalF>,
73+
ComPackF: SimdField<Scalar = F>,
74+
OpenPackF: SimdField<Scalar = F>,
75+
T: Transcript<EvalF>,
76+
{
77+
let mut group = c.benchmark_group(format!(
78+
"Orion PCS opening benchmarking: F = {}, EvalF = {}, ComPackF = {}",
79+
type_name::<F>(),
80+
type_name::<EvalF>(),
81+
type_name::<ComPackF>(),
82+
));
83+
84+
let mut rng = test_rng();
85+
let mut transcript = T::new();
86+
let mut orion_scratch = OrionScratchPad::default();
87+
88+
for num_vars in lowest_num_vars..=highest_num_vars {
89+
let poly = MultiLinearPoly::<F>::random(num_vars, &mut rng);
90+
let eval_point: Vec<_> = (0..num_vars)
91+
.map(|_| EvalF::random_unsafe(&mut rng))
92+
.collect();
93+
94+
let orion_srs =
95+
OrionSRS::from_random::<F>(num_vars, ORION_CODE_PARAMETER_INSTANCE, &mut rng);
96+
97+
let _orion_commitment = orion_srs
98+
.commit::<F, ComPackF>(&poly, &mut orion_scratch)
99+
.unwrap();
100+
101+
group
102+
.bench_function(
103+
BenchmarkId::new(format!("{num_vars} variables"), num_vars),
104+
|b| {
105+
b.iter(|| {
106+
_ = black_box(orion_srs.open::<F, EvalF, ComPackF, OpenPackF, T>(
107+
&poly,
108+
&eval_point,
109+
&mut transcript,
110+
&orion_scratch,
111+
))
112+
})
113+
},
114+
)
115+
.sample_size(10);
116+
}
117+
}
118+
119+
fn orion_opening_benchmark(c: &mut Criterion) {
120+
opening_benchmark_helper::<GF2, GF2_128, GF2x128, GF2x8, BytesHashTranscript<_, Keccak256hasher>>(
121+
c, 19, 30,
122+
);
123+
}
124+
125+
criterion_group!(bench, orion_committing_benchmark, orion_opening_benchmark);
126+
criterion_main!(bench);

poly_commit/src/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,13 @@ pub fn expander_pcs_init_testing_only<
3939
)
4040
}
4141

42+
pub const PCS_SOUNDNESS_BITS: usize = 128;
43+
4244
mod utils;
4345
use transcript::Transcript;
4446
use utils::PCSEmptyType;
4547

4648
pub mod raw;
49+
50+
pub mod orion;
51+
pub use self::orion::*;

poly_commit/src/orion.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
mod utils;
2+
pub use utils::{
3+
OrionCommitment, OrionPCSError, OrionProof, OrionResult, OrionSRS, OrionScratchPad,
4+
SubsetSumLUTs,
5+
};
6+
7+
mod linear_code;
8+
pub use linear_code::{OrionCodeParameter, ORION_CODE_PARAMETER_INSTANCE};
9+
10+
mod pcs_impl;
11+
mod serde;
12+
13+
#[cfg(test)]
14+
mod tests;

0 commit comments

Comments
 (0)