Skip to content

Commit 01a03d7

Browse files
feat(filecoin-proofs): switch generate_piece_commitment to accept io::Read
1 parent f5f7d9b commit 01a03d7

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

filecoin-proofs/src/api/mod.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -381,14 +381,13 @@ pub fn verify_piece_inclusion_proof(
381381

382382
/// Takes a piece file at `unpadded_piece_path` and the size of the piece and returns the comm_p.
383383
///
384-
pub fn generate_piece_commitment<T: Into<PathBuf> + AsRef<Path>>(
385-
unpadded_piece_path: T,
384+
pub fn generate_piece_commitment<T: std::io::Read>(
385+
unpadded_piece_file: T,
386386
unpadded_piece_size: UnpaddedBytesAmount,
387387
) -> error::Result<Commitment> {
388-
let mut unpadded_piece_file = File::open(unpadded_piece_path)?;
389388
let mut padded_piece_file = tempfile()?;
390389

391-
let (_, mut source) = get_aligned_source(&mut unpadded_piece_file, &[], unpadded_piece_size);
390+
let (_, mut source) = get_aligned_source(unpadded_piece_file, &[], unpadded_piece_size);
392391
write_padded(&mut source, &mut padded_piece_file)?;
393392

394393
let _ = padded_piece_file.seek(SeekFrom::Start(0))?;
@@ -455,6 +454,7 @@ fn pad_safe_fr(unpadded: &FrSafe) -> Fr32Ary {
455454
#[cfg(test)]
456455
mod tests {
457456
use std::collections::BTreeMap;
457+
use std::io::{Seek, SeekFrom};
458458

459459
use crate::constants::SECTOR_SIZE_ONE_KIB;
460460
use crate::error::ExpectWithBacktrace;
@@ -470,8 +470,10 @@ mod tests {
470470
fn generate_comm_p(data: &[u8]) -> Result<Commitment, failure::Error> {
471471
let mut file = NamedTempFile::new().expects("could not create named temp file");
472472
file.write_all(data)?;
473+
file.seek(SeekFrom::Start(0))?;
474+
473475
let comm_p =
474-
generate_piece_commitment(file.path(), UnpaddedBytesAmount(data.len() as u64))?;
476+
generate_piece_commitment(file.as_file_mut(), UnpaddedBytesAmount(data.len() as u64))?;
475477
Ok(comm_p)
476478
}
477479

@@ -704,9 +706,11 @@ mod tests {
704706

705707
let mut piece_file = NamedTempFile::new()?;
706708
piece_file.write_all(&piece_bytes)?;
707-
piece_file.seek(SeekFrom::Start(0))?;
709+
piece_file.as_file_mut().sync_all()?;
710+
piece_file.as_file_mut().seek(SeekFrom::Start(0))?;
708711

709-
let comm_p = generate_piece_commitment(&piece_file.path(), number_of_bytes_in_piece)?;
712+
let comm_p = generate_piece_commitment(piece_file.as_file_mut(), number_of_bytes_in_piece)?;
713+
piece_file.as_file_mut().seek(SeekFrom::Start(0))?;
710714

711715
let mut staged_sector_file = NamedTempFile::new()?;
712716
add_piece(

filecoin-proofs/src/fr32.rs

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -650,11 +650,21 @@ where
650650
let mut buffer = [0; CHUNK_SIZE];
651651
let mut written = 0;
652652

653-
while let Ok(bytes_read) = source.read(&mut buffer) {
654-
if bytes_read == 0 {
655-
break;
653+
loop {
654+
match source.read(&mut buffer) {
655+
Ok(bytes_read) => {
656+
if bytes_read == 0 {
657+
break;
658+
}
659+
written += write_padded_aux(&FR32_PADDING_MAP, &buffer[..bytes_read], target)?;
660+
}
661+
Err(err) => {
662+
if err.kind() == io::ErrorKind::Interrupted {
663+
continue;
664+
}
665+
return Err(err);
666+
}
656667
}
657-
written += write_padded_aux(&FR32_PADDING_MAP, &buffer[..bytes_read], target)?;
658668
}
659669

660670
Ok(written)
@@ -1174,6 +1184,46 @@ mod tests {
11741184
}
11751185
}
11761186

1187+
#[test]
1188+
fn test_write_padded_chained_byte_source() {
1189+
let random_bytes: Vec<u8> = (0..127).map(|_| rand::random::<u8>()).collect();
1190+
1191+
// read 127 bytes from a non-chained source
1192+
let (n, output_x) = {
1193+
let mut input_x = Cursor::new(random_bytes.clone());
1194+
let mut output_x = Cursor::new(Vec::new());
1195+
1196+
let n_x = write_padded(&mut input_x, &mut output_x).unwrap();
1197+
output_x.seek(SeekFrom::Start(0)).expect("could not seek");
1198+
1199+
let mut buf_x = Vec::new();
1200+
output_x.read_to_end(&mut buf_x).expect("could not seek");
1201+
1202+
(n_x, buf_x)
1203+
};
1204+
1205+
// read 127 bytes from a 32-byte buffer and then a 95-byte buffer
1206+
let (m, output_y) = {
1207+
let mut input_y =
1208+
Cursor::new(random_bytes.iter().take(32).cloned().collect::<Vec<u8>>()).chain(
1209+
Cursor::new(random_bytes.iter().skip(32).cloned().collect::<Vec<u8>>()),
1210+
);
1211+
1212+
let mut output_y = Cursor::new(Vec::new());
1213+
1214+
let n_y = write_padded(&mut input_y, &mut output_y).unwrap();
1215+
output_y.seek(SeekFrom::Start(0)).expect("could not seek");
1216+
1217+
let mut buf_y = Vec::new();
1218+
output_y.read_to_end(&mut buf_y).expect("could not seek");
1219+
1220+
(n_y, buf_y)
1221+
};
1222+
1223+
assert_eq!(n, m, "should have written same number of bytes");
1224+
assert_eq!(output_x, output_y, "should have written same bytes")
1225+
}
1226+
11771227
// `write_padded` for 127 bytes of 1s, splitting it in two calls of varying
11781228
// sizes, from 0 to the full size, generating many unaligned calls, check padding.
11791229
#[test]

0 commit comments

Comments
 (0)