Skip to content

Commit

Permalink
Hide Kzg struct behind embedded-kzg-settings feature and invert `…
Browse files Browse the repository at this point in the history
…subspace-archiving` <-> `subspace-verification` dependency
  • Loading branch information
nazar-pc committed Oct 2, 2024
1 parent ea0bb74 commit 2b3372b
Show file tree
Hide file tree
Showing 33 changed files with 291 additions and 292 deletions.
5 changes: 3 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crates/pallet-subspace/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ use std::simd::Simd;
use std::sync::{Once, OnceLock};
use std::{iter, slice};
use subspace_archiving::archiver::{Archiver, NewArchivedSegment};
use subspace_core_primitives::crypto::kzg::{embedded_kzg_settings, Kzg};
use subspace_core_primitives::crypto::kzg::Kzg;
use subspace_core_primitives::pieces::{Piece, PieceOffset, Record};
use subspace_core_primitives::pos::PosSeed;
use subspace_core_primitives::pot::PotOutput;
Expand Down Expand Up @@ -67,7 +67,7 @@ const MAX_PIECES_IN_SECTOR: u16 = 1;
fn kzg_instance() -> &'static Kzg {
static KZG: OnceLock<Kzg> = OnceLock::new();

KZG.get_or_init(|| Kzg::new(embedded_kzg_settings()))
KZG.get_or_init(Kzg::new)
}

fn erasure_coding_instance() -> &'static ErasureCoding {
Expand Down
2 changes: 1 addition & 1 deletion crates/sc-consensus-subspace/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
// use std::time::Duration;
// use subspace_archiving::archiver::Archiver;
// use subspace_core_primitives::crypto::kzg;
// use subspace_core_primitives::crypto::kzg::{embedded_kzg_settings, Kzg};
// use subspace_core_primitives::crypto::kzg::{Kzg};
// use subspace_core_primitives::objects::BlockObjectMapping;
// use subspace_core_primitives::{
// ArchivedHistorySegment, FlatPieces, HistorySize, Piece, PieceIndex, PieceOffset, Solution,
Expand Down
1 change: 1 addition & 0 deletions crates/subspace-archiving/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ thiserror = { version = "1.0.64", optional = true }
criterion = "0.5.1"
rand = { version = "0.8.5", features = ["min_const_gen"] }
subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" }
subspace-verification = { version = "0.1.0", path = "../subspace-verification" }

[features]
default = ["std"]
Expand Down
3 changes: 1 addition & 2 deletions crates/subspace-archiving/benches/archiving.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion};
use rand::{thread_rng, Rng};
use std::num::NonZeroUsize;
use subspace_archiving::archiver::Archiver;
use subspace_core_primitives::crypto::kzg;
use subspace_core_primitives::crypto::kzg::Kzg;
use subspace_core_primitives::pieces::Record;
use subspace_erasure_coding::ErasureCoding;
Expand All @@ -13,7 +12,7 @@ const SMALL_BLOCK_SIZE: usize = 500;
fn criterion_benchmark(c: &mut Criterion) {
let mut input = vec![0u8; AMOUNT_OF_DATA];
thread_rng().fill(input.as_mut_slice());
let kzg = Kzg::new(kzg::embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down
91 changes: 2 additions & 89 deletions crates/subspace-archiving/src/archiver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ use parity_scale_codec::{Compact, CompactLen, Decode, Encode, Input, Output};
#[cfg(feature = "parallel")]
use rayon::prelude::*;
use subspace_core_primitives::crypto::blake3_254_hash_to_scalar;
use subspace_core_primitives::crypto::kzg::{Commitment, Kzg, Scalar, Witness};
use subspace_core_primitives::crypto::kzg::{Kzg, Scalar};
use subspace_core_primitives::objects::{
BlockObject, BlockObjectMapping, GlobalObject, PieceObject, PieceObjectMapping,
};
use subspace_core_primitives::pieces::{PieceArray, RawRecord, RecordWitness};
use subspace_core_primitives::pieces::RawRecord;
use subspace_core_primitives::segments::{
ArchivedBlockProgress, ArchivedHistorySegment, LastArchivedBlock, RecordedHistorySegment,
SegmentCommitment, SegmentHeader, SegmentIndex,
Expand Down Expand Up @@ -840,90 +840,3 @@ impl Archiver {
}
}
}

/// Validate witness embedded within a piece produced by archiver
pub fn is_piece_valid(
kzg: &Kzg,
piece: &PieceArray,
segment_commitment: &SegmentCommitment,
position: u32,
) -> bool {
let (record, commitment, witness) = piece.split();
let witness = match Witness::try_from_bytes(witness) {
Ok(witness) => witness,
_ => {
return false;
}
};

let mut scalars = Vec::with_capacity(record.len().next_power_of_two());

for record_chunk in record.iter() {
match Scalar::try_from(record_chunk) {
Ok(scalar) => {
scalars.push(scalar);
}
_ => {
return false;
}
}
}

// Number of scalars for KZG must be a power of two elements
scalars.resize(scalars.capacity(), Scalar::default());

let polynomial = match kzg.poly(&scalars) {
Ok(polynomial) => polynomial,
_ => {
return false;
}
};

if kzg
.commit(&polynomial)
.map(|commitment| commitment.to_bytes())
.as_ref()
!= Ok(commitment)
{
return false;
}

let Ok(segment_commitment) = Commitment::try_from(segment_commitment) else {
return false;
};

let commitment_hash = Scalar::try_from(blake3_254_hash_to_scalar(commitment.as_ref()))
.expect("Create correctly by dedicated hash function; qed");

kzg.verify(
&segment_commitment,
ArchivedHistorySegment::NUM_PIECES,
position,
&commitment_hash,
&witness,
)
}

/// Validate witness for record commitment hash produced by archiver
pub fn is_record_commitment_hash_valid(
kzg: &Kzg,
record_commitment_hash: &Scalar,
commitment: &SegmentCommitment,
witness: &RecordWitness,
position: u32,
) -> bool {
let Ok(commitment) = Commitment::try_from(commitment) else {
return false;
};
let Ok(witness) = Witness::try_from(witness) else {
return false;
};

kzg.verify(
&commitment,
ArchivedHistorySegment::NUM_PIECES,
position,
record_commitment_hash,
&witness,
)
}
20 changes: 10 additions & 10 deletions crates/subspace-archiving/tests/integration/archiver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use std::assert_matches::assert_matches;
use std::io::Write;
use std::iter;
use std::num::NonZeroUsize;
use subspace_archiving::archiver;
use subspace_archiving::archiver::{Archiver, ArchiverInstantiationError, SegmentItem};
use subspace_core_primitives::crypto::kzg::{embedded_kzg_settings, Kzg};
use subspace_core_primitives::crypto::kzg::Kzg;
use subspace_core_primitives::objects::{BlockObject, BlockObjectMapping, PieceObject};
use subspace_core_primitives::pieces::{Piece, Record};
use subspace_core_primitives::segments::{
Expand All @@ -17,6 +16,7 @@ use subspace_core_primitives::segments::{
};
use subspace_core_primitives::Blake3Hash;
use subspace_erasure_coding::ErasureCoding;
use subspace_verification::is_piece_valid;

fn extract_data<O: Into<u64>>(data: &[u8], offset: O) -> &[u8] {
let offset: u64 = offset.into();
Expand Down Expand Up @@ -63,7 +63,7 @@ fn compare_block_objects_to_piece_objects<'a>(

#[test]
fn archiver() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -197,7 +197,7 @@ fn archiver() {
.map(|(position, piece)| {
(
position,
archiver::is_piece_valid(
is_piece_valid(
&kzg,
piece,
&first_archived_segment.segment_header.segment_commitment(),
Expand Down Expand Up @@ -320,7 +320,7 @@ fn archiver() {
.map(|(position, piece)| {
(
position,
archiver::is_piece_valid(
is_piece_valid(
&kzg,
piece,
&archived_segment.segment_header.segment_commitment(),
Expand Down Expand Up @@ -380,7 +380,7 @@ fn archiver() {
.map(|(position, piece)| {
(
position,
archiver::is_piece_valid(
is_piece_valid(
&kzg,
piece,
&archived_segment.segment_header.segment_commitment(),
Expand All @@ -397,7 +397,7 @@ fn archiver() {

#[test]
fn invalid_usage() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -469,7 +469,7 @@ fn invalid_usage() {

#[test]
fn one_byte_smaller_segment() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -508,7 +508,7 @@ fn one_byte_smaller_segment() {

#[test]
fn spill_over_edge_case() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -570,7 +570,7 @@ fn spill_over_edge_case() {

#[test]
fn object_on_the_edge_of_segment() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use rayon::prelude::*;
use std::num::NonZeroUsize;
use subspace_archiving::archiver::Archiver;
use subspace_archiving::piece_reconstructor::{PiecesReconstructor, ReconstructorError};
use subspace_core_primitives::crypto::kzg::{embedded_kzg_settings, Kzg};
use subspace_core_primitives::crypto::kzg::Kzg;
use subspace_core_primitives::objects::BlockObjectMapping;
use subspace_core_primitives::pieces::{FlatPieces, Piece, Record};
use subspace_core_primitives::segments::{ArchivedHistorySegment, RecordedHistorySegment};
Expand All @@ -23,7 +23,7 @@ fn get_random_block() -> Vec<u8> {

#[test]
fn segment_reconstruction_works() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -69,7 +69,7 @@ fn segment_reconstruction_works() {

#[test]
fn piece_reconstruction_works() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -119,7 +119,7 @@ fn piece_reconstruction_works() {

#[test]
fn segment_reconstruction_fails() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -160,7 +160,7 @@ fn segment_reconstruction_fails() {

#[test]
fn piece_reconstruction_fails() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down
8 changes: 4 additions & 4 deletions crates/subspace-archiving/tests/integration/reconstructor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::iter;
use std::num::NonZeroUsize;
use subspace_archiving::archiver::Archiver;
use subspace_archiving::reconstructor::{Reconstructor, ReconstructorError};
use subspace_core_primitives::crypto::kzg::{embedded_kzg_settings, Kzg};
use subspace_core_primitives::crypto::kzg::Kzg;
use subspace_core_primitives::objects::BlockObjectMapping;
use subspace_core_primitives::pieces::{FlatPieces, Piece, Record};
use subspace_core_primitives::segments::{
Expand All @@ -19,7 +19,7 @@ fn pieces_to_option_of_pieces(pieces: &FlatPieces) -> Vec<Option<Piece>> {

#[test]
fn basic() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -250,7 +250,7 @@ fn basic() {

#[test]
fn partial_data() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down Expand Up @@ -333,7 +333,7 @@ fn partial_data() {

#[test]
fn invalid_usage() {
let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();
let erasure_coding = ErasureCoding::new(
NonZeroUsize::new(Record::NUM_S_BUCKETS.next_power_of_two().ilog2() as usize)
.expect("Not zero; qed"),
Expand Down
4 changes: 2 additions & 2 deletions crates/subspace-core-primitives/benches/kzg.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use subspace_core_primitives::crypto::kzg::{embedded_kzg_settings, Kzg, Scalar};
use subspace_core_primitives::crypto::kzg::{Kzg, Scalar};
use subspace_core_primitives::pieces::RawRecord;
use subspace_core_primitives::ScalarBytes;

Expand All @@ -8,7 +8,7 @@ fn criterion_benchmark(c: &mut Criterion) {
.map(|_| Scalar::from(rand::random::<[u8; ScalarBytes::SAFE_BYTES]>()))
.collect::<Vec<_>>();

let kzg = Kzg::new(embedded_kzg_settings());
let kzg = Kzg::new();

c.bench_function("create-polynomial", |b| {
b.iter(|| {
Expand Down
1 change: 1 addition & 0 deletions crates/subspace-core-primitives/src/crypto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

//! Various cryptographic utilities used across Subspace Network.

#[cfg(feature = "embedded-kzg-settings")]
pub mod kzg;

use crate::{Blake3Hash, ScalarBytes};
Expand Down
Loading

0 comments on commit 2b3372b

Please sign in to comment.