Skip to content

Commit aae130a

Browse files
committed
Refactor Config into ProofConfig and InitConfig
1 parent 3016155 commit aae130a

13 files changed

+336
-280
lines changed

benches/verifying.rs

+38-27
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,59 @@
1+
use std::sync::atomic::AtomicBool;
2+
13
use criterion::{criterion_group, criterion_main, Criterion};
24
use post::{
3-
config::ScryptParams,
5+
config::{InitConfig, ProofConfig, ScryptParams},
6+
initialize::{CpuInitializer, Initialize},
47
metadata::ProofMetadata,
58
pow::randomx::{PoW, RandomXFlag},
6-
prove::Proof,
7-
verification::{Verifier, VerifyingParams},
9+
prove::generate_proof,
10+
verification::Verifier,
811
};
912
#[cfg(not(windows))]
1013
use pprof::criterion::{Output, PProfProfiler};
14+
use tempfile::tempdir;
1115

1216
fn verifying(c: &mut Criterion) {
1317
let challenge = b"hello world, challenge me!!!!!!!";
14-
let metadata = ProofMetadata {
15-
node_id: [0u8; 32],
16-
commitment_atx_id: [0u8; 32],
17-
challenge: *challenge,
18-
num_units: 1,
19-
labels_per_unit: 1024 * 1024 * 1024,
20-
};
21-
let num_labels = metadata.num_units as u64 * metadata.labels_per_unit;
22-
23-
let verifier = Verifier::new(Box::new(
24-
PoW::new(RandomXFlag::get_recommended_flags()).unwrap(),
25-
));
18+
let datadir = tempdir().unwrap();
2619

27-
let (k2, k3) = (37, 37);
28-
let proof = Proof::new(
29-
0,
30-
(0..k2 as u64).collect::<Vec<u64>>().as_slice(),
31-
num_labels,
32-
0,
33-
);
34-
let params = VerifyingParams {
35-
difficulty: u64::MAX,
36-
k2,
37-
k3,
20+
let cfg = ProofConfig {
21+
k1: 199,
22+
k2: 37,
23+
k3: 37,
3824
pow_difficulty: [0xFF; 32],
25+
};
26+
let init_cfg = InitConfig {
27+
min_num_units: 1,
28+
max_num_units: 1,
29+
labels_per_unit: 200,
3930
scrypt: ScryptParams::new(8192, 1, 1),
4031
};
4132

33+
let metadata = CpuInitializer::new(init_cfg.scrypt)
34+
.initialize(
35+
datadir.path(),
36+
&[0u8; 32],
37+
&[0u8; 32],
38+
init_cfg.labels_per_unit,
39+
1,
40+
init_cfg.labels_per_unit,
41+
None,
42+
)
43+
.unwrap();
44+
45+
let pow_flags = RandomXFlag::get_recommended_flags();
46+
// Generate a proof
47+
let stop = AtomicBool::new(false);
48+
let proof = generate_proof(datadir.path(), challenge, cfg, 32, 1, pow_flags, stop).unwrap();
49+
let metadata = ProofMetadata::new(metadata, *challenge);
50+
51+
// Bench verifying the proof
52+
let verifier = Verifier::new(Box::new(PoW::new(pow_flags).unwrap()));
4253
c.bench_function("verify", |b| {
4354
b.iter(|| {
4455
verifier
45-
.verify(&proof, &metadata, params)
56+
.verify(&proof, &metadata, &cfg, &init_cfg)
4657
.expect("proof should be valid");
4758
});
4859
});

ffi/src/initialization.rs

+4-11
Original file line numberDiff line numberDiff line change
@@ -416,22 +416,15 @@ mod tests {
416416
fn initialize_and_verify() {
417417
// Initialize some data
418418
let datadir = tempdir().unwrap();
419+
let scrypt = ScryptParams::new(2, 1, 1);
419420

420-
let cfg = post::config::Config {
421-
k1: 23,
422-
k2: 32,
423-
k3: 10,
424-
pow_difficulty: [0xFF; 32],
425-
scrypt: ScryptParams::new(2, 1, 1),
426-
};
427-
428-
CpuInitializer::new(cfg.scrypt)
421+
CpuInitializer::new(scrypt)
429422
.initialize(datadir.path(), &[0u8; 32], &[0u8; 32], 256, 31, 700, None)
430423
.unwrap();
431424

432425
// Verify the data
433426
let datapath = CString::new(datadir.path().to_str().unwrap()).unwrap();
434-
let result = verify_pos(datapath.as_ptr(), null(), null(), 100.0, cfg.scrypt);
427+
let result = verify_pos(datapath.as_ptr(), null(), null(), 100.0, scrypt);
435428
assert_eq!(VerifyResult::Ok, result);
436429

437430
// verify with wrong scrypt params
@@ -441,7 +434,7 @@ mod tests {
441434

442435
// verify with non-existent path
443436
let path = CString::new("non-existent-path").unwrap();
444-
let result = verify_pos(path.as_ptr(), null(), null(), 100.0, cfg.scrypt);
437+
let result = verify_pos(path.as_ptr(), null(), null(), 100.0, scrypt);
445438
assert_eq!(VerifyResult::Failed, result);
446439
}
447440
}

ffi/src/post_impl.rs

+28-29
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ use std::{
99
};
1010

1111
use post::{
12-
config::Config,
12+
config::{InitConfig, ProofConfig},
1313
metadata::ProofMetadata,
1414
pow::randomx::{PoW, RandomXFlag},
1515
prove,
16-
verification::{Verifier, VerifyingParams},
16+
verification::Verifier,
1717
};
1818

1919
use crate::ArrayU8;
@@ -72,7 +72,7 @@ pub unsafe extern "C" fn free_proof(proof: *mut Proof) {
7272
pub extern "C" fn generate_proof(
7373
datadir: *const c_char,
7474
challenge: *const c_uchar,
75-
cfg: Config,
75+
cfg: ProofConfig,
7676
nonces: usize,
7777
threads: usize,
7878
pow_flags: RandomXFlag,
@@ -90,7 +90,7 @@ pub extern "C" fn generate_proof(
9090
fn _generate_proof(
9191
datadir: *const c_char,
9292
challenge: *const c_uchar,
93-
cfg: Config,
93+
cfg: ProofConfig,
9494
nonces: usize,
9595
threads: usize,
9696
pow_flags: RandomXFlag,
@@ -168,7 +168,8 @@ pub unsafe extern "C" fn verify_proof(
168168
verifier: *const Verifier,
169169
proof: Proof,
170170
metadata: *const ProofMetadata,
171-
cfg: Config,
171+
cfg: ProofConfig,
172+
init_cfg: InitConfig,
172173
) -> VerifyResult {
173174
let verifier = match verifier.as_ref() {
174175
Some(verifier) => verifier,
@@ -191,12 +192,7 @@ pub unsafe extern "C" fn verify_proof(
191192
None => return VerifyResult::InvalidArgument,
192193
};
193194

194-
let params = match VerifyingParams::new(metadata, &cfg) {
195-
Ok(params) => params,
196-
Err(_) => return VerifyResult::InvalidArgument,
197-
};
198-
199-
match verifier.verify(&proof, metadata, params) {
195+
match verifier.verify(&proof, metadata, &cfg, &init_cfg) {
200196
Ok(_) => VerifyResult::Ok,
201197
Err(err) => {
202198
log::error!("Proof is invalid: {err}");
@@ -215,12 +211,11 @@ mod tests {
215211
#[test]
216212
fn datadir_must_be_utf8() {
217213
let datadir = std::ffi::CString::new([159, 146, 150]).unwrap();
218-
let cfg = super::Config {
214+
let cfg = super::ProofConfig {
219215
k1: 10,
220216
k2: 20,
221217
k3: 20,
222218
pow_difficulty: [0xFF; 32],
223-
scrypt: ScryptParams::new(2, 1, 1),
224219
};
225220
let result = super::_generate_proof(
226221
datadir.as_ptr(),
@@ -253,11 +248,16 @@ mod tests {
253248
pow: 0,
254249
},
255250
std::ptr::null(),
256-
super::Config {
251+
super::ProofConfig {
257252
k1: 1,
258253
k2: 2,
259254
k3: 2,
260255
pow_difficulty: [0xFF; 32],
256+
},
257+
super::InitConfig {
258+
min_num_units: 1,
259+
max_num_units: 1,
260+
labels_per_unit: 1,
261261
scrypt: ScryptParams::new(2, 1, 1),
262262
},
263263
)
@@ -268,10 +268,9 @@ mod tests {
268268
#[test]
269269
fn test_end_to_end() {
270270
// Initialize some data first
271-
let labels_per_unit = 200;
272271
let datadir = tempfile::tempdir().unwrap();
273272

274-
let cfg = post::config::Config {
273+
let cfg = post::config::ProofConfig {
275274
k1: 10,
276275
k2: 10,
277276
k3: 10,
@@ -280,17 +279,23 @@ mod tests {
280279
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
281280
0xff, 0xff, 0xff, 0xff,
282281
],
282+
};
283+
284+
let init_cfg = post::config::InitConfig {
285+
min_num_units: 1,
286+
max_num_units: 2,
287+
labels_per_unit: 200,
283288
scrypt: ScryptParams::new(2, 1, 1),
284289
};
285290

286-
let meta = post::initialize::CpuInitializer::new(cfg.scrypt)
291+
let meta = post::initialize::CpuInitializer::new(init_cfg.scrypt)
287292
.initialize(
288293
datadir.path(),
289294
&[77; 32],
290295
&[0u8; 32],
291-
labels_per_unit,
296+
init_cfg.labels_per_unit,
292297
2,
293-
labels_per_unit,
298+
100,
294299
None,
295300
)
296301
.unwrap();
@@ -316,17 +321,11 @@ mod tests {
316321
pow_flags,
317322
);
318323

319-
let proof_metadata = ProofMetadata {
320-
node_id: meta.node_id,
321-
commitment_atx_id: meta.commitment_atx_id,
322-
challenge: *challenge,
323-
num_units: meta.num_units,
324-
labels_per_unit: meta.labels_per_unit,
324+
let proof_metadata = ProofMetadata::new(meta, *challenge);
325+
let result = unsafe {
326+
crate::post_impl::verify_proof(verifier, *cproof, &proof_metadata, cfg, init_cfg)
325327
};
326328

327-
let result =
328-
unsafe { crate::post_impl::verify_proof(verifier, *cproof, &proof_metadata as _, cfg) };
329-
330329
assert_eq!(result, super::VerifyResult::Ok);
331330

332331
// Modify the proof to have different k2pow
@@ -338,7 +337,7 @@ mod tests {
338337
};
339338

340339
let result = unsafe {
341-
crate::post_impl::verify_proof(verifier, invalid_proof, &proof_metadata as _, cfg)
340+
crate::post_impl::verify_proof(verifier, invalid_proof, &proof_metadata, cfg, init_cfg)
342341
};
343342
assert_eq!(result, super::VerifyResult::Invalid);
344343

service/src/main.rs

+24-9
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,23 @@ struct Cli {
3939
#[derive(Args, Debug)]
4040
/// POST configuration - network parameters
4141
struct PostConfig {
42+
/// The minimal number of units that must be initialized.
43+
#[arg(long, default_value_t = 4)]
44+
pub min_num_units: u32,
45+
/// The maximal number of units that can be initialized.
46+
#[arg(long, default_value_t = u32::MAX)]
47+
pub max_num_units: u32,
48+
/// The number of labels per unit.
49+
#[arg(long, default_value_t = 4294967296)]
50+
pub labels_per_unit: u64,
4251
/// K1 specifies the difficulty for a label to be a candidate for a proof
43-
#[arg(long, default_value = "26")]
52+
#[arg(long, default_value_t = 26)]
4453
k1: u32,
4554
/// K2 is the number of labels below the required difficulty required for a proof
46-
#[arg(long, default_value = "37")]
55+
#[arg(long, default_value_t = 37)]
4756
k2: u32,
4857
/// K3 is the size of the subset of proof indices that is validated
49-
#[arg(long, default_value = "37")]
58+
#[arg(long, default_value_t = 37)]
5059
k3: u32,
5160
/// difficulty for the nonce proof of work (aka "k2pow")
5261
#[arg(
@@ -164,18 +173,24 @@ async fn main() -> eyre::Result<()> {
164173
log::info!("POST network parameters: {:?}", args.post_config);
165174
log::info!("POST proving settings: {:?}", args.post_settings);
166175

176+
let scrypt = post::config::ScryptParams::new(
177+
args.post_config.scrypt.n,
178+
args.post_config.scrypt.r,
179+
args.post_config.scrypt.p,
180+
);
167181
let service = post_service::service::PostService::new(
168182
args.dir,
169-
post::config::Config {
183+
post::config::ProofConfig {
170184
k1: args.post_config.k1,
171185
k2: args.post_config.k2,
172186
k3: args.post_config.k3,
173187
pow_difficulty: args.post_config.pow_difficulty,
174-
scrypt: post::config::ScryptParams::new(
175-
args.post_config.scrypt.n,
176-
args.post_config.scrypt.r,
177-
args.post_config.scrypt.p,
178-
),
188+
},
189+
post::config::InitConfig {
190+
min_num_units: args.post_config.min_num_units,
191+
max_num_units: args.post_config.max_num_units,
192+
labels_per_unit: args.post_config.labels_per_unit,
193+
scrypt,
179194
},
180195
args.post_settings.nonces,
181196
args.post_settings.threads,

service/src/service.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use post::{
1010
metadata::{PostMetadata, ProofMetadata},
1111
pow::randomx::{PoW, RandomXFlag},
1212
prove::Proof,
13-
verification::{Verifier, VerifyingParams},
13+
verification::Verifier,
1414
};
1515

1616
#[derive(Debug)]
@@ -27,7 +27,8 @@ struct ProofGenProcess {
2727

2828
pub struct PostService {
2929
datadir: PathBuf,
30-
cfg: post::config::Config,
30+
cfg: post::config::ProofConfig,
31+
init_cfg: post::config::InitConfig,
3132
nonces: usize,
3233
threads: usize,
3334
pow_flags: RandomXFlag,
@@ -40,7 +41,8 @@ pub struct PostService {
4041
impl PostService {
4142
pub fn new(
4243
datadir: PathBuf,
43-
cfg: post::config::Config,
44+
cfg: post::config::ProofConfig,
45+
init_cfg: post::config::InitConfig,
4446
nonces: usize,
4547
threads: usize,
4648
pow_flags: RandomXFlag,
@@ -49,6 +51,7 @@ impl PostService {
4951
proof_generation: Mutex::new(None),
5052
datadir,
5153
cfg,
54+
init_cfg,
5255
nonces,
5356
threads,
5457
pow_flags,
@@ -113,7 +116,7 @@ impl crate::client::PostService for PostService {
113116

114117
fn verify_proof(&self, proof: &Proof, metadata: &ProofMetadata) -> eyre::Result<()> {
115118
self.verifier
116-
.verify(proof, metadata, VerifyingParams::new(metadata, &self.cfg)?)
119+
.verify(proof, metadata, &self.cfg, &self.init_cfg)
117120
.wrap_err("verifying proof")
118121
}
119122

0 commit comments

Comments
 (0)