Skip to content

Commit f97547a

Browse files
committed
Refactor FlatPieces API to make it nicer to use and helpful in more cases
1 parent d07c4c2 commit f97547a

File tree

5 files changed

+34
-26
lines changed

5 files changed

+34
-26
lines changed

crates/sc-consensus-subspace/src/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use std::sync::Arc;
6767
use std::{cell::RefCell, task::Poll, time::Duration};
6868
use subspace_archiving::archiver::Archiver;
6969
use subspace_core_primitives::objects::BlockObjectMapping;
70-
use subspace_core_primitives::{FlatPieces, LocalChallenge, Piece, Signature, Tag, PIECE_SIZE};
70+
use subspace_core_primitives::{FlatPieces, LocalChallenge, Piece, Signature, Tag};
7171
use subspace_solving::{SubspaceCodec, SOLUTION_SIGNING_CONTEXT};
7272
use substrate_test_runtime::{Block as TestBlock, Hash};
7373

@@ -538,7 +538,7 @@ fn run_one_test(mutator: impl Fn(&mut TestHeader, Stage) + Send + Sync + 'static
538538
.await
539539
.unwrap()
540540
.iter()
541-
.flat_map(|flat_pieces| flat_pieces.chunks_exact(PIECE_SIZE))
541+
.flat_map(|flat_pieces| flat_pieces.as_pieces())
542542
.enumerate()
543543
.choose(&mut rand::thread_rng())
544544
.map(|(piece_index, piece)| (piece_index as u64, Piece::try_from(piece).unwrap()))

crates/subspace-archiving/tests/integration/archiver.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ fn archiver() {
130130
.chain(iter::repeat(block_1.as_ref()).zip(block_1_object_mapping.objects.iter()));
131131
let piece_objects = first_archived_segment
132132
.pieces
133-
.chunks_exact(PIECE_SIZE)
133+
.as_pieces()
134134
.zip(&first_archived_segment.object_mapping)
135135
.flat_map(|(piece, object_mapping)| {
136136
iter::repeat(piece.as_ref()).zip(&object_mapping.objects)
@@ -140,11 +140,7 @@ fn archiver() {
140140
}
141141

142142
// Check that all pieces are valid
143-
for (position, piece) in first_archived_segment
144-
.pieces
145-
.chunks_exact(PIECE_SIZE)
146-
.enumerate()
147-
{
143+
for (position, piece) in first_archived_segment.pieces.as_pieces().enumerate() {
148144
assert!(archiver::is_piece_valid(
149145
piece,
150146
first_archived_segment.root_block.records_root(),
@@ -193,7 +189,7 @@ fn archiver() {
193189
iter::repeat(block_1.as_ref()).zip(block_1_object_mapping.objects.iter().skip(2));
194190
let piece_objects = archived_segments[0]
195191
.pieces
196-
.chunks_exact(PIECE_SIZE)
192+
.as_pieces()
197193
.zip(&archived_segments[0].object_mapping)
198194
.flat_map(|(piece, object_mapping)| {
199195
iter::repeat(piece.as_ref()).zip(&object_mapping.objects)
@@ -231,7 +227,7 @@ fn archiver() {
231227
previous_root_block_hash
232228
);
233229

234-
for (position, piece) in archived_segment.pieces.chunks_exact(PIECE_SIZE).enumerate() {
230+
for (position, piece) in archived_segment.pieces.as_pieces().enumerate() {
235231
assert!(archiver::is_piece_valid(
236232
piece,
237233
archived_segment.root_block.records_root(),
@@ -274,7 +270,7 @@ fn archiver() {
274270
assert_eq!(last_archived_block.number, 3);
275271
assert_eq!(last_archived_block.partial_archived(), None);
276272

277-
for (position, piece) in archived_segment.pieces.chunks_exact(PIECE_SIZE).enumerate() {
273+
for (position, piece) in archived_segment.pieces.as_pieces().enumerate() {
278274
assert!(archiver::is_piece_valid(
279275
piece,
280276
archived_segment.root_block.records_root(),

crates/subspace-archiving/tests/integration/reconstructor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const SEGMENT_SIZE: usize = RECORD_SIZE * MERKLE_NUM_LEAVES / 2;
1616

1717
fn flat_pieces_to_regular(pieces: &FlatPieces) -> Vec<Piece> {
1818
pieces
19-
.chunks_exact(PIECE_SIZE)
19+
.as_pieces()
2020
.map(|piece| piece.try_into().unwrap())
2121
.collect()
2222
}

crates/subspace-core-primitives/src/lib.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,11 @@ impl AsMut<[u8]> for Piece {
256256
pub struct FlatPieces(Vec<u8>);
257257

258258
impl FlatPieces {
259-
/// Create new instance, returns error if `pieces` is not multiple of full pieces.
260-
pub fn new(pieces: Vec<u8>) -> Result<Self, Vec<u8>> {
261-
if pieces.len() % PIECE_SIZE != 0 {
262-
return Err(pieces);
263-
}
264-
265-
Ok(Self(pieces))
259+
/// Allocate `FlatPieces` that will hold `piece_count` pieces filled with zeroes.
260+
pub fn new(piece_count: usize) -> Self {
261+
let mut pieces = Vec::with_capacity(piece_count * PIECE_SIZE);
262+
pieces.resize(pieces.capacity(), 0);
263+
Self(pieces)
266264
}
267265

268266
/// Number of pieces contained.
@@ -274,13 +272,27 @@ impl FlatPieces {
274272
pub fn into_inner(self) -> Vec<u8> {
275273
self.0
276274
}
275+
276+
/// Iterator over individual pieces as byte slices.
277+
pub fn as_pieces(&self) -> impl ExactSizeIterator<Item = &[u8]> {
278+
self.0.chunks_exact(PIECE_SIZE)
279+
}
280+
281+
/// Iterator over individual pieces as byte slices.
282+
pub fn as_pieces_mut(&mut self) -> impl ExactSizeIterator<Item = &mut [u8]> {
283+
self.0.chunks_exact_mut(PIECE_SIZE)
284+
}
277285
}
278286

279287
impl TryFrom<Vec<u8>> for FlatPieces {
280288
type Error = Vec<u8>;
281289

282290
fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
283-
Self::new(value)
291+
if value.len() % PIECE_SIZE != 0 {
292+
return Err(value);
293+
}
294+
295+
Ok(Self(value))
284296
}
285297
}
286298

crates/subspace-solving/tests/integration/codec.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::iter;
2-
use subspace_core_primitives::PIECE_SIZE;
2+
use subspace_core_primitives::{FlatPieces, PIECE_SIZE};
33
use subspace_solving::SubspaceCodec;
44

55
#[test]
@@ -25,10 +25,10 @@ fn batch() {
2525
// Use 2.5 batches worth of pieces
2626
let piece_count = subspace_codec.batch_size() * 2 + subspace_codec.batch_size() / 2;
2727

28-
let mut pieces: Vec<u8> = vec![0u8; PIECE_SIZE * piece_count];
29-
pieces.chunks_exact_mut(PIECE_SIZE).for_each(|piece| {
28+
let mut pieces = FlatPieces::new(piece_count);
29+
for piece in pieces.as_pieces_mut() {
3030
piece.copy_from_slice(&rand::random::<[u8; PIECE_SIZE]>());
31-
});
31+
}
3232
let original_pieces = pieces.clone();
3333
let piece_indexes: Vec<u64> = iter::repeat_with(|| rand::random())
3434
.take(piece_count)
@@ -39,8 +39,8 @@ fn batch() {
3939
.unwrap();
4040

4141
for ((original_piece, piece), piece_index) in original_pieces
42-
.chunks_exact(PIECE_SIZE)
43-
.zip(pieces.chunks_exact_mut(PIECE_SIZE))
42+
.as_pieces()
43+
.zip(pieces.as_pieces_mut())
4444
.zip(piece_indexes)
4545
{
4646
assert_ne!(original_piece, piece);

0 commit comments

Comments
 (0)