Skip to content

Commit b4e1ea2

Browse files
feat(filecoin-proofs): api for deals on chain and interactive po… (#912)
feat(filecoin-proofs): api for deals on chain and interactive porep
2 parents eeaec99 + ed2adbd commit b4e1ea2

38 files changed

+1623
-1516
lines changed

fil-proofs-tooling/src/bin/benchy/rational_post.rs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
use std::collections::BTreeMap;
2-
use std::io::stdout;
2+
use std::io::{stdout, Seek, SeekFrom, Write};
33

44
use fil_proofs_tooling::{measure, Metadata};
5-
use filecoin_proofs::fr32::write_padded;
6-
use filecoin_proofs::pieces::get_aligned_source;
75
use filecoin_proofs::types::{
86
PaddedBytesAmount, PoRepConfig, PoRepProofPartitions, PoStConfig, SectorSize,
97
UnpaddedBytesAmount,
108
};
11-
use filecoin_proofs::{generate_post, seal, verify_post, PrivateReplicaInfo, PublicReplicaInfo};
9+
use filecoin_proofs::{
10+
add_piece, generate_piece_commitment, generate_post, seal_commit, seal_pre_commit, verify_post,
11+
PrivateReplicaInfo, PublicReplicaInfo,
12+
};
1213
use log::info;
13-
use rand::random;
1414
use storage_proofs::sector::SectorId;
1515
use tempfile::NamedTempFile;
1616

@@ -58,8 +58,7 @@ pub fn run(sector_size: usize) -> Result<(), failure::Error> {
5858
UnpaddedBytesAmount::from(PaddedBytesAmount(sector_size as u64));
5959

6060
// Create files for the staged and sealed sectors.
61-
let mut staged_file =
62-
NamedTempFile::new().expect("could not create temp file for staged sector");
61+
let staged_file = NamedTempFile::new().expect("could not create temp file for staged sector");
6362

6463
let sealed_file = NamedTempFile::new().expect("could not create temp file for sealed sector");
6564

@@ -71,47 +70,68 @@ pub fn run(sector_size: usize) -> Result<(), failure::Error> {
7170

7271
// Generate the data from which we will create a replica, we will then prove the continued
7372
// storage of that replica using the PoSt.
74-
let data: Vec<u8> = (0..sector_size).map(|_| random()).collect();
73+
let piece_bytes: Vec<u8> = (0..sector_size).map(|_| rand::random::<u8>()).collect();
74+
75+
let mut piece_file = NamedTempFile::new()?;
76+
piece_file.write_all(&piece_bytes)?;
77+
piece_file.as_file_mut().sync_all()?;
78+
piece_file.as_file_mut().seek(SeekFrom::Start(0))?;
79+
80+
let piece_info =
81+
generate_piece_commitment(piece_file.as_file_mut(), sector_size_unpadded_bytes_ammount)?;
82+
piece_file.as_file_mut().seek(SeekFrom::Start(0))?;
7583

76-
// Write the aligned data to the staged sector file.
77-
let (_, mut aligned_data) =
78-
get_aligned_source(&data[..], &[], sector_size_unpadded_bytes_ammount);
84+
let mut staged_sector_file = NamedTempFile::new()?;
85+
add_piece(
86+
&mut piece_file,
87+
&mut staged_sector_file,
88+
sector_size_unpadded_bytes_ammount,
89+
&[],
90+
)?;
7991

80-
write_padded(&mut aligned_data, &mut staged_file)
81-
.expect("failed to write padded data to staged sector file");
92+
let piece_infos = vec![piece_info];
8293

8394
// Replicate the staged sector, write the replica file to `sealed_path`.
8495
let porep_config = PoRepConfig(SectorSize(sector_size as u64), N_PARTITIONS);
8596
let cache_dir = tempfile::tempdir().unwrap();
8697
let sector_id = SectorId::from(SECTOR_ID);
8798
let ticket = [0u8; 32];
8899

89-
let seal_output = seal(
100+
let seal_pre_commit_output = seal_pre_commit(
90101
porep_config,
91102
cache_dir.path(),
92103
staged_file.path(),
93104
sealed_file.path(),
94105
PROVER_ID,
95106
sector_id,
96107
ticket,
97-
&[sector_size_unpadded_bytes_ammount],
98-
)
99-
.expect("failed to seal");
108+
&piece_infos,
109+
)?;
110+
111+
let seed = [0u8; 32];
112+
let comm_r = seal_pre_commit_output.comm_r;
113+
let p_aux = seal_pre_commit_output.p_aux.clone();
114+
115+
let _seal_commit_output = seal_commit(
116+
porep_config,
117+
cache_dir.path(),
118+
PROVER_ID,
119+
sector_id,
120+
ticket,
121+
seed,
122+
seal_pre_commit_output,
123+
&piece_infos,
124+
)?;
100125

101126
// Store the replica's private and publicly facing info for proving and verifying respectively.
102127
let mut pub_replica_info: BTreeMap<SectorId, PublicReplicaInfo> = BTreeMap::new();
103128
let mut priv_replica_info: BTreeMap<SectorId, PrivateReplicaInfo> = BTreeMap::new();
104129

105-
pub_replica_info.insert(sector_id, PublicReplicaInfo::new(seal_output.comm_r));
130+
pub_replica_info.insert(sector_id, PublicReplicaInfo::new(comm_r));
106131

107132
priv_replica_info.insert(
108133
sector_id,
109-
PrivateReplicaInfo::new(
110-
sealed_path_string,
111-
seal_output.comm_r,
112-
seal_output.p_aux,
113-
cache_dir.into_path(),
114-
),
134+
PrivateReplicaInfo::new(sealed_path_string, comm_r, p_aux, cache_dir.into_path()),
115135
);
116136

117137
// Measure PoSt generation and verification.

fil-proofs-tooling/src/bin/benchy/stacked.rs

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn file_backed_mmap_from_zeroes(n: usize, use_tmp: bool) -> Result<MmapMut, fail
4444
}
4545

4646
fn dump_proof_bytes<H: Hasher>(
47-
all_partition_proofs: &[Vec<stacked::Proof<H>>],
47+
all_partition_proofs: &[Vec<stacked::Proof<H, Blake2sHasher>>],
4848
) -> Result<(), failure::Error> {
4949
let file = OpenOptions::new()
5050
.write(true)
@@ -132,24 +132,25 @@ where
132132
layer_challenges: layer_challenges.clone(),
133133
};
134134

135-
let pp = StackedDrg::<H>::setup(&sp)?;
135+
let pp = StackedDrg::<H, Blake2sHasher>::setup(&sp)?;
136136

137137
let (pub_in, priv_in, d) = if *bench_only {
138138
(None, None, None)
139139
} else {
140140
let mut data = file_backed_mmap_from_zeroes(nodes, *use_tmp)?;
141+
let seed = rng.gen();
141142

142143
let FuncMeasurement {
143144
cpu_time: replication_cpu_time,
144145
wall_time: replication_wall_time,
145146
return_value: (pub_inputs, priv_inputs),
146147
} = measure(|| {
147148
let (tau, (p_aux, t_aux)) =
148-
StackedDrg::<H>::replicate(&pp, &replica_id, &mut data, None)?;
149+
StackedDrg::<H, Blake2sHasher>::replicate(&pp, &replica_id, &mut data, None)?;
149150

150-
let pb = stacked::PublicInputs::<H::Domain> {
151+
let pb = stacked::PublicInputs::<H::Domain, <Blake2sHasher as Hasher>::Domain> {
151152
replica_id,
152-
seed: None,
153+
seed,
153154
tau: Some(tau.clone()),
154155
k: Some(0),
155156
};
@@ -188,8 +189,13 @@ where
188189
wall_time: vanilla_proving_wall_time,
189190
return_value: all_partition_proofs,
190191
} = measure(|| {
191-
StackedDrg::<H>::prove_all_partitions(&pp, &pub_inputs, &priv_inputs, *partitions)
192-
.map_err(|err| err.into())
192+
StackedDrg::<H, Blake2sHasher>::prove_all_partitions(
193+
&pp,
194+
&pub_inputs,
195+
&priv_inputs,
196+
*partitions,
197+
)
198+
.map_err(|err| err.into())
193199
})?;
194200

195201
report.outputs.vanilla_proving_wall_time_us =
@@ -212,7 +218,7 @@ where
212218

213219
for _ in 0..*samples {
214220
let m = measure(|| {
215-
let verified = StackedDrg::<H>::verify_all_partitions(
221+
let verified = StackedDrg::<H, Blake2sHasher>::verify_all_partitions(
216222
&pp,
217223
&pub_inputs,
218224
&all_partition_proofs,
@@ -259,7 +265,8 @@ where
259265
if let Some(data) = d {
260266
if *extract {
261267
let m = measure(|| {
262-
StackedDrg::<H>::extract_all(&pp, &replica_id, &data).map_err(|err| err.into())
268+
StackedDrg::<H, Blake2sHasher>::extract_all(&pp, &replica_id, &data)
269+
.map_err(|err| err.into())
263270
})?;
264271

265272
assert_ne!(&(*data), m.return_value.as_slice());
@@ -289,9 +296,9 @@ struct CircuitWorkMeasurement {
289296
}
290297

291298
fn do_circuit_work<H: 'static + Hasher>(
292-
pp: &<StackedDrg<H> as ProofScheme>::PublicParams,
293-
pub_in: Option<<StackedDrg<H> as ProofScheme>::PublicInputs>,
294-
priv_in: Option<<StackedDrg<H> as ProofScheme>::PrivateInputs>,
299+
pp: &<StackedDrg<H, Blake2sHasher> as ProofScheme>::PublicParams,
300+
pub_in: Option<<StackedDrg<H, Blake2sHasher> as ProofScheme>::PublicInputs>,
301+
priv_in: Option<<StackedDrg<H, Blake2sHasher> as ProofScheme>::PrivateInputs>,
295302
params: &Params,
296303
report: &mut Report,
297304
) -> Result<CircuitWorkMeasurement, failure::Error> {
@@ -315,7 +322,10 @@ fn do_circuit_work<H: 'static + Hasher>(
315322

316323
if *bench || *circuit {
317324
let mut cs = MetricCS::<Bls12>::new();
318-
StackedCompound::blank_circuit(&pp, &JJ_PARAMS).synthesize(&mut cs)?;
325+
<StackedCompound as CompoundProof<_, StackedDrg<H, Blake2sHasher>, _>>::blank_circuit(
326+
&pp, &JJ_PARAMS,
327+
)
328+
.synthesize(&mut cs)?;
319329

320330
report.outputs.circuit_num_inputs = Some(cs.num_inputs() as u64);
321331
report.outputs.circuit_num_constraints = Some(cs.num_constraints() as u64);
@@ -332,7 +342,10 @@ fn do_circuit_work<H: 'static + Hasher>(
332342
// We should also allow the serialized vanilla proofs to be passed (as a file) to the example
333343
// and skip replication/vanilla-proving entirely.
334344
let gparams =
335-
StackedCompound::groth_params(&compound_public_params.vanilla_params, &JJ_PARAMS)?;
345+
<StackedCompound as CompoundProof<_, StackedDrg<H, Blake2sHasher>, _>>::groth_params(
346+
&compound_public_params.vanilla_params,
347+
&JJ_PARAMS,
348+
)?;
336349

337350
let multi_proof = {
338351
let FuncMeasurement {

filecoin-proofs/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ os_type = "2.2.0"
3939
flate2 = { version = "1.0.9", features = ["rust_backend"]}
4040
tar = "0.4.26"
4141
rayon = "1.1.0"
42+
blake2s_simd = "0.5.8"
43+
hex = "0.4.0"
4244

4345
[dependencies.reqwest]
4446
version = "0.9"
@@ -49,6 +51,8 @@ features = ["default-tls-vendored"]
4951
gperftools = "0.2"
5052
criterion = "0.2"
5153
rexpect = "0.3.0"
54+
pretty_env_logger = "0.3.1"
55+
pretty_assertions = "0.6.1"
5256

5357
[features]
5458
default = []

filecoin-proofs/benches/preprocessing.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ fn preprocessing_benchmark(c: &mut Criterion) {
2727
let data = random_data(*size);
2828

2929
b.iter(|| {
30-
let mut tmpfile: File = tempfile::tempfile().unwrap();
30+
let tmpfile: File = tempfile::tempfile().unwrap();
3131

32-
write_padded_bench(&mut tmpfile, data.clone());
32+
write_padded_bench(tmpfile, data.clone());
3333
})
3434
},
3535
vec![128, 256, 512, 256_000, 512_000, 1024_000, 2048_000],
@@ -38,9 +38,9 @@ fn preprocessing_benchmark(c: &mut Criterion) {
3838
let data = random_data(*size);
3939

4040
b.iter(|| {
41-
let mut tmpfile: File = tempfile::tempfile().unwrap();
41+
let tmpfile: File = tempfile::tempfile().unwrap();
4242

43-
write_padded_unpadded_bench(&mut tmpfile, data.clone());
43+
write_padded_unpadded_bench(tmpfile, data.clone());
4444
})
4545
})
4646
.sample_size(2)
@@ -49,15 +49,15 @@ fn preprocessing_benchmark(c: &mut Criterion) {
4949
);
5050
}
5151

52-
fn write_padded_bench(file: &mut File, data: Vec<u8>) {
53-
let _ = write_padded(&mut &data[..], file).unwrap();
52+
fn write_padded_bench(mut file: File, data: Vec<u8>) {
53+
let _ = write_padded(&mut &data[..], &mut file).unwrap();
5454
let padded_written = file.seek(SeekFrom::End(0)).unwrap() as usize;
5555

5656
assert!(padded_written > data.len());
5757
}
5858

59-
fn write_padded_unpadded_bench(file: &mut File, data: Vec<u8>) {
60-
write_padded(&mut &data[..], file).unwrap();
59+
fn write_padded_unpadded_bench(mut file: File, data: Vec<u8>) {
60+
write_padded(&mut &data[..], &mut file).unwrap();
6161

6262
let padded_written = file.seek(SeekFrom::End(0)).unwrap() as usize;
6363

filecoin-proofs/examples/stacked.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub fn file_backed_mmap_from(data: &[u8]) -> MmapMut {
125125
unsafe { MmapOptions::new().map_mut(&tmpfile).unwrap() }
126126
}
127127

128-
fn dump_proof_bytes<H: Hasher>(all_partition_proofs: &[Vec<stacked::Proof<H>>]) {
128+
fn dump_proof_bytes<H: Hasher, G: Hasher>(all_partition_proofs: &[Vec<stacked::Proof<H, G>>]) {
129129
let file = OpenOptions::new()
130130
.write(true)
131131
.create(true)
@@ -180,7 +180,7 @@ fn do_the_work<H: 'static>(
180180

181181
info!("running setup");
182182
start_profile("setup");
183-
let pp = StackedDrg::<H>::setup(&sp).unwrap();
183+
let pp = StackedDrg::<H, Blake2sHasher>::setup(&sp).unwrap();
184184
info!("setup complete");
185185
stop_profile();
186186

@@ -196,16 +196,17 @@ fn do_the_work<H: 'static>(
196196
let mut replication_duration = Duration::new(0, 0);
197197

198198
info!("running replicate");
199+
let seed = rng.gen();
199200

200201
start_profile("replicate");
201202
let (tau, (p_aux, t_aux)) =
202-
StackedDrg::<H>::replicate(&pp, &replica_id, &mut data, None).unwrap();
203+
StackedDrg::<H, Blake2sHasher>::replicate(&pp, &replica_id, &mut data, None).unwrap();
203204
stop_profile();
204-
let pub_inputs = stacked::PublicInputs::<H::Domain> {
205+
let pub_inputs = stacked::PublicInputs::<H::Domain, <Blake2sHasher as Hasher>::Domain> {
205206
replica_id,
206207
tau: Some(tau.clone()),
207208
k: Some(0),
208-
seed: None,
209+
seed,
209210
};
210211

211212
let priv_inputs = stacked::PrivateInputs { p_aux, t_aux };
@@ -233,9 +234,13 @@ fn do_the_work<H: 'static>(
233234

234235
let start = Instant::now();
235236
start_profile("prove");
236-
let all_partition_proofs =
237-
StackedDrg::<H>::prove_all_partitions(&pp, &pub_inputs, &priv_inputs, partitions)
238-
.expect("failed to prove");
237+
let all_partition_proofs = StackedDrg::<H, Blake2sHasher>::prove_all_partitions(
238+
&pp,
239+
&pub_inputs,
240+
&priv_inputs,
241+
partitions,
242+
)
243+
.expect("failed to prove");
239244
stop_profile();
240245
let vanilla_proving = start.elapsed();
241246
total_proving += vanilla_proving;
@@ -251,9 +256,12 @@ fn do_the_work<H: 'static>(
251256
start_profile("verify");
252257
for _ in 0..samples {
253258
let start = Instant::now();
254-
let verified =
255-
StackedDrg::<H>::verify_all_partitions(&pp, &pub_inputs, &all_partition_proofs)
256-
.expect("failed during verification");
259+
let verified = StackedDrg::<H, Blake2sHasher>::verify_all_partitions(
260+
&pp,
261+
&pub_inputs,
262+
&all_partition_proofs,
263+
)
264+
.expect("failed during verification");
257265
if !verified {
258266
info!("Verification failed.");
259267
};
@@ -283,9 +291,11 @@ fn do_the_work<H: 'static>(
283291
info!("Performing circuit bench.");
284292
let mut cs = MetricCS::<Bls12>::new();
285293

286-
StackedCompound::blank_circuit(&pp, &JJ_PARAMS)
287-
.synthesize(&mut cs)
288-
.expect("failed to synthesize circuit");
294+
<StackedCompound as CompoundProof<_, StackedDrg<H, Blake2sHasher>, _>>::blank_circuit(
295+
&pp, &JJ_PARAMS,
296+
)
297+
.synthesize(&mut cs)
298+
.expect("failed to synthesize circuit");
289299

290300
info!("circuit_num_inputs: {}", cs.num_inputs());
291301
info!("circuit_num_constraints: {}", cs.num_constraints());
@@ -307,7 +317,7 @@ fn do_the_work<H: 'static>(
307317
// and skip replication/vanilla-proving entirely.
308318
info!("Performing circuit groth.");
309319
let gparams =
310-
StackedCompound::groth_params(&compound_public_params.vanilla_params, &JJ_PARAMS)
320+
<StackedCompound as CompoundProof<_, StackedDrg<H, Blake2sHasher>, _>>::groth_params(&compound_public_params.vanilla_params, &JJ_PARAMS)
311321
.unwrap();
312322

313323
let multi_proof = {
@@ -365,7 +375,8 @@ fn do_the_work<H: 'static>(
365375
let start = Instant::now();
366376
info!("Extracting.");
367377
start_profile("extract");
368-
let decoded_data = StackedDrg::<H>::extract_all(&pp, &replica_id, &data).unwrap();
378+
let decoded_data =
379+
StackedDrg::<H, Blake2sHasher>::extract_all(&pp, &replica_id, &data).unwrap();
369380
stop_profile();
370381
let extracting = start.elapsed();
371382
info!("extracting_time: {:?}", extracting);

0 commit comments

Comments
 (0)