From 5ab48381077a4011097730cb194220fd7f1d019c Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Wed, 2 Oct 2024 22:48:27 +0300 Subject: [PATCH] Move `Kzg` struct and related code into new `subspace-kzg` crate --- Cargo.lock | 35 +++++++++--- crates/pallet-subspace/Cargo.toml | 3 +- crates/pallet-subspace/src/mock.rs | 2 +- crates/sc-consensus-subspace-rpc/Cargo.toml | 1 + crates/sc-consensus-subspace-rpc/src/lib.rs | 2 +- crates/sc-consensus-subspace/Cargo.toml | 1 + crates/sc-consensus-subspace/src/archiver.rs | 2 +- crates/sc-consensus-subspace/src/lib.rs | 2 +- crates/sc-consensus-subspace/src/tests.rs | 4 +- crates/sc-consensus-subspace/src/verifier.rs | 2 +- crates/sp-consensus-subspace/Cargo.toml | 3 + crates/sp-consensus-subspace/src/lib.rs | 4 +- crates/subspace-archiving/Cargo.toml | 2 + .../subspace-archiving/benches/archiving.rs | 2 +- crates/subspace-archiving/src/archiver.rs | 2 +- .../incremental_record_commitments.rs | 2 +- .../src/piece_reconstructor.rs | 2 +- .../subspace-archiving/src/reconstructor.rs | 2 +- .../tests/integration/archiver.rs | 2 +- .../tests/integration/piece_reconstruction.rs | 2 +- .../tests/integration/reconstructor.rs | 2 +- crates/subspace-core-primitives/Cargo.toml | 28 +-------- crates/subspace-core-primitives/README.md | 0 crates/subspace-core-primitives/src/crypto.rs | 3 - crates/subspace-erasure-coding/Cargo.toml | 2 + .../benches/commitments.rs | 2 +- crates/subspace-erasure-coding/src/lib.rs | 2 +- crates/subspace-erasure-coding/src/tests.rs | 2 +- crates/subspace-farmer-components/Cargo.toml | 1 + .../benches/auditing.rs | 2 +- .../benches/plotting.rs | 2 +- .../benches/proving.rs | 2 +- .../benches/reading.rs | 2 +- .../src/plotting.rs | 2 +- .../subspace-farmer-components/src/proving.rs | 2 +- .../subspace-farmer-components/src/reading.rs | 2 +- .../src/segment_reconstruction.rs | 2 +- crates/subspace-farmer/Cargo.toml | 1 + .../bin/subspace-farmer/commands/benchmark.rs | 2 +- .../commands/cluster/controller.rs | 2 +- .../commands/cluster/farmer.rs | 2 +- .../commands/cluster/plotter.rs | 2 +- .../src/bin/subspace-farmer/commands/farm.rs | 2 +- .../farmer_piece_getter/piece_validator.rs | 2 +- crates/subspace-farmer/src/plotter/cpu.rs | 2 +- crates/subspace-farmer/src/plotter/gpu.rs | 2 +- .../subspace-farmer/src/single_disk_farm.rs | 2 +- .../src/single_disk_farm/farming.rs | 2 +- crates/subspace-service/Cargo.toml | 1 + crates/subspace-service/src/lib.rs | 2 +- crates/subspace-service/src/rpc.rs | 2 +- .../src/sync_from_dsn/piece_validator.rs | 2 +- crates/subspace-verification/Cargo.toml | 4 +- crates/subspace-verification/src/lib.rs | 4 +- shared/subspace-kzg/Cargo.toml | 54 ++++++++++++++++++ .../subspace-kzg}/benches/kzg.rs | 2 +- .../src}/eth-public-parameters.bin | Bin .../kzg.rs => shared/subspace-kzg/src/lib.rs | 14 ++--- .../kzg => shared/subspace-kzg/src}/tests.rs | 4 +- shared/subspace-proof-of-space-gpu/Cargo.toml | 2 + .../subspace-proof-of-space-gpu/src/cuda.rs | 3 +- .../src/cuda/tests.rs | 7 ++- test/subspace-test-client/Cargo.toml | 1 + test/subspace-test-client/src/lib.rs | 2 +- 64 files changed, 163 insertions(+), 97 deletions(-) delete mode 100644 crates/subspace-core-primitives/README.md create mode 100644 shared/subspace-kzg/Cargo.toml rename {crates/subspace-core-primitives => shared/subspace-kzg}/benches/kzg.rs (96%) rename {crates/subspace-core-primitives/src/crypto/kzg => shared/subspace-kzg/src}/eth-public-parameters.bin (100%) rename crates/subspace-core-primitives/src/crypto/kzg.rs => shared/subspace-kzg/src/lib.rs (98%) rename {crates/subspace-core-primitives/src/crypto/kzg => shared/subspace-kzg/src}/tests.rs (97%) diff --git a/Cargo.lock b/Cargo.lock index 2556a62221..0e65561e87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7881,6 +7881,7 @@ dependencies = [ "subspace-core-primitives", "subspace-erasure-coding", "subspace-farmer-components", + "subspace-kzg", "subspace-proof-of-space", "subspace-runtime-primitives", "subspace-verification", @@ -9993,6 +9994,7 @@ dependencies = [ "subspace-archiving", "subspace-core-primitives", "subspace-erasure-coding", + "subspace-kzg", "subspace-proof-of-space", "subspace-verification", "thiserror", @@ -10026,6 +10028,7 @@ dependencies = [ "subspace-core-primitives", "subspace-erasure-coding", "subspace-farmer-components", + "subspace-kzg", "subspace-networking", "subspace-rpc-primitives", "thiserror", @@ -11520,6 +11523,7 @@ dependencies = [ "sp-std", "sp-timestamp", "subspace-core-primitives", + "subspace-kzg", "subspace-proof-of-space", "subspace-verification", "thiserror", @@ -12395,6 +12399,7 @@ dependencies = [ "serde", "subspace-core-primitives", "subspace-erasure-coding", + "subspace-kzg", "subspace-verification", "thiserror", ] @@ -12405,22 +12410,15 @@ version = "0.1.0" dependencies = [ "blake3", "bytes", - "criterion", "derive_more 1.0.0", "hex", - "kzg", "num-traits", "parity-scale-codec", - "parking_lot 0.12.3", "rand", - "rand_core", "rayon", - "rust-kzg-blst", "scale-info", "serde", - "spin 0.9.8", "static_assertions", - "tracing", "uint 0.10.0", ] @@ -12449,6 +12447,7 @@ dependencies = [ "rand", "rust-kzg-blst", "subspace-core-primitives", + "subspace-kzg", ] [[package]] @@ -12524,6 +12523,7 @@ dependencies = [ "subspace-core-primitives", "subspace-erasure-coding", "subspace-farmer-components", + "subspace-kzg", "subspace-metrics", "subspace-networking", "subspace-proof-of-space", @@ -12566,6 +12566,7 @@ dependencies = [ "subspace-archiving", "subspace-core-primitives", "subspace-erasure-coding", + "subspace-kzg", "subspace-proof-of-space", "subspace-verification", "thiserror", @@ -12574,6 +12575,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "subspace-kzg" +version = "0.1.0" +dependencies = [ + "criterion", + "derive_more 1.0.0", + "kzg", + "parking_lot 0.12.3", + "rand", + "rand_core", + "rust-kzg-blst", + "spin 0.9.8", + "subspace-core-primitives", + "tracing", +] + [[package]] name = "subspace-malicious-operator" version = "0.1.0" @@ -12788,6 +12805,7 @@ dependencies = [ "subspace-core-primitives", "subspace-erasure-coding", "subspace-farmer-components", + "subspace-kzg", "subspace-proof-of-space", ] @@ -12967,6 +12985,7 @@ dependencies = [ "subspace-archiving", "subspace-core-primitives", "subspace-erasure-coding", + "subspace-kzg", "subspace-networking", "subspace-proof-of-space", "subspace-runtime-primitives", @@ -13003,6 +13022,7 @@ dependencies = [ "subspace-core-primitives", "subspace-erasure-coding", "subspace-farmer-components", + "subspace-kzg", "subspace-proof-of-space", "subspace-runtime-primitives", "subspace-service", @@ -13143,6 +13163,7 @@ dependencies = [ "parity-scale-codec", "schnorrkel", "subspace-core-primitives", + "subspace-kzg", "subspace-proof-of-space", "thiserror", ] diff --git a/crates/pallet-subspace/Cargo.toml b/crates/pallet-subspace/Cargo.toml index 9c644b701d..8b4bec2524 100644 --- a/crates/pallet-subspace/Cargo.toml +++ b/crates/pallet-subspace/Cargo.toml @@ -37,8 +37,9 @@ rand = { version = "0.8.5", features = ["min_const_gen"] } sp-io = { git = "https://github.com/subspace/polkadot-sdk", rev = "5871818e1d736f1843eb9078f886290695165c42" } subspace-archiving = { version = "0.1.0", path = "../subspace-archiving" } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" } -subspace-farmer-components = { version = "0.1.0", path = "../subspace-farmer-components" } subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding" } +subspace-farmer-components = { version = "0.1.0", path = "../subspace-farmer-components" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space" } [features] diff --git a/crates/pallet-subspace/src/mock.rs b/crates/pallet-subspace/src/mock.rs index 76358416cf..bdc0280e81 100644 --- a/crates/pallet-subspace/src/mock.rs +++ b/crates/pallet-subspace/src/mock.rs @@ -35,7 +35,6 @@ 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::Kzg; use subspace_core_primitives::pieces::{Piece, PieceOffset, Record}; use subspace_core_primitives::pos::PosSeed; use subspace_core_primitives::pot::PotOutput; @@ -53,6 +52,7 @@ use subspace_farmer_components::auditing::audit_sector_sync; use subspace_farmer_components::plotting::{plot_sector, CpuRecordsEncoder, PlotSectorOptions}; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; use subspace_farmer_components::FarmerProtocolInfo; +use subspace_kzg::Kzg; use subspace_proof_of_space::shim::ShimTable; use subspace_proof_of_space::{Table, TableGenerator}; use subspace_verification::is_within_solution_range; diff --git a/crates/sc-consensus-subspace-rpc/Cargo.toml b/crates/sc-consensus-subspace-rpc/Cargo.toml index d2f2a0f6c9..17e245872a 100644 --- a/crates/sc-consensus-subspace-rpc/Cargo.toml +++ b/crates/sc-consensus-subspace-rpc/Cargo.toml @@ -35,6 +35,7 @@ subspace-archiving = { version = "0.1.0", path = "../subspace-archiving" } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" } subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding" } subspace-farmer-components = { version = "0.1.0", path = "../subspace-farmer-components" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-networking = { version = "0.1.0", path = "../subspace-networking" } subspace-rpc-primitives = { version = "0.1.0", path = "../subspace-rpc-primitives" } thiserror = "1.0.64" diff --git a/crates/sc-consensus-subspace-rpc/src/lib.rs b/crates/sc-consensus-subspace-rpc/src/lib.rs index 1dc2b1fd47..a717559c88 100644 --- a/crates/sc-consensus-subspace-rpc/src/lib.rs +++ b/crates/sc-consensus-subspace-rpc/src/lib.rs @@ -53,13 +53,13 @@ use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Arc, Weak}; use std::time::Duration; use subspace_archiving::archiver::NewArchivedSegment; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::objects::GlobalObjectMapping; use subspace_core_primitives::pieces::{Piece, PieceIndex}; use subspace_core_primitives::segments::{HistorySize, SegmentHeader, SegmentIndex}; use subspace_core_primitives::{Blake3Hash, BlockHash, PublicKey, SlotNumber, Solution}; use subspace_erasure_coding::ErasureCoding; use subspace_farmer_components::FarmerProtocolInfo; +use subspace_kzg::Kzg; use subspace_networking::libp2p::Multiaddr; use subspace_rpc_primitives::{ FarmerAppInfo, RewardSignatureResponse, RewardSigningInfo, SlotInfo, SolutionResponse, diff --git a/crates/sc-consensus-subspace/Cargo.toml b/crates/sc-consensus-subspace/Cargo.toml index 742f729f78..c1ba02ada4 100644 --- a/crates/sc-consensus-subspace/Cargo.toml +++ b/crates/sc-consensus-subspace/Cargo.toml @@ -42,6 +42,7 @@ sp-runtime = { git = "https://github.com/subspace/polkadot-sdk", rev = "5871818e subspace-archiving = { version = "0.1.0", path = "../subspace-archiving" } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" } subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space" } subspace-verification = { version = "0.1.0", path = "../subspace-verification" } thiserror = "1.0.64" diff --git a/crates/sc-consensus-subspace/src/archiver.rs b/crates/sc-consensus-subspace/src/archiver.rs index 0f46456d25..14286b04d1 100644 --- a/crates/sc-consensus-subspace/src/archiver.rs +++ b/crates/sc-consensus-subspace/src/archiver.rs @@ -76,11 +76,11 @@ use std::sync::atomic::{AtomicU16, Ordering}; use std::sync::Arc; use std::time::Duration; use subspace_archiving::archiver::{Archiver, NewArchivedSegment}; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::objects::BlockObjectMapping; use subspace_core_primitives::segments::{RecordedHistorySegment, SegmentHeader, SegmentIndex}; use subspace_core_primitives::{BlockNumber, PublicKey}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; use tracing::{debug, info, trace, warn}; /// Number of WASM instances is 8, this is a bit lower to avoid warnings exceeding number of diff --git a/crates/sc-consensus-subspace/src/lib.rs b/crates/sc-consensus-subspace/src/lib.rs index 01bca2c342..744174c44f 100644 --- a/crates/sc-consensus-subspace/src/lib.rs +++ b/crates/sc-consensus-subspace/src/lib.rs @@ -42,8 +42,8 @@ use crate::notification::{SubspaceNotificationSender, SubspaceNotificationStream use crate::slot_worker::{NewSlotNotification, RewardSigningNotification}; use sp_consensus_subspace::ChainConstants; use sp_runtime::traits::Block as BlockT; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; /// State that must be shared between various consensus components. #[derive(Clone)] diff --git a/crates/sc-consensus-subspace/src/tests.rs b/crates/sc-consensus-subspace/src/tests.rs index af3324dc30..168d4d07d7 100644 --- a/crates/sc-consensus-subspace/src/tests.rs +++ b/crates/sc-consensus-subspace/src/tests.rs @@ -72,8 +72,8 @@ // use std::task::Poll; // use std::time::Duration; // use subspace_archiving::archiver::Archiver; -// use subspace_core_primitives::crypto::kzg; -// use subspace_core_primitives::crypto::kzg::{Kzg}; +// use subspace_kzg; +// use subspace_kzg::{Kzg}; // use subspace_core_primitives::objects::BlockObjectMapping; // use subspace_core_primitives::{ // ArchivedHistorySegment, FlatPieces, HistorySize, Piece, PieceIndex, PieceOffset, Solution, diff --git a/crates/sc-consensus-subspace/src/verifier.rs b/crates/sc-consensus-subspace/src/verifier.rs index 7b66028158..0ca47d227b 100644 --- a/crates/sc-consensus-subspace/src/verifier.rs +++ b/crates/sc-consensus-subspace/src/verifier.rs @@ -40,8 +40,8 @@ use std::num::NonZeroUsize; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; use std::thread::available_parallelism; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::{BlockNumber, PublicKey}; +use subspace_kzg::Kzg; use subspace_proof_of_space::Table; use subspace_verification::{check_reward_signature, verify_solution, VerifySolutionParams}; use tokio::runtime::Handle; diff --git a/crates/sp-consensus-subspace/Cargo.toml b/crates/sp-consensus-subspace/Cargo.toml index 4bc2ac90e4..35d5df2276 100644 --- a/crates/sp-consensus-subspace/Cargo.toml +++ b/crates/sp-consensus-subspace/Cargo.toml @@ -30,6 +30,7 @@ sp-runtime-interface = { default-features = false, git = "https://github.com/sub sp-std = { default-features = false, git = "https://github.com/subspace/polkadot-sdk", rev = "5871818e1d736f1843eb9078f886290695165c42" } sp-timestamp = { git = "https://github.com/subspace/polkadot-sdk", rev = "5871818e1d736f1843eb9078f886290695165c42", default-features = false } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives", default-features = false } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg", optional = true } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space", default-features = false } subspace-verification = { version = "0.1.0", path = "../subspace-verification", default-features = false } thiserror = { version = "1.0.64", optional = true } @@ -54,7 +55,9 @@ std = [ "sp-std/std", "sp-timestamp/std", "subspace-core-primitives/std", + "subspace-kzg/std", "subspace-proof-of-space/std", + "subspace-verification/kzg", "subspace-verification/std", "thiserror", ] diff --git a/crates/sp-consensus-subspace/src/lib.rs b/crates/sp-consensus-subspace/src/lib.rs index b831f402fa..4ec32ecc83 100644 --- a/crates/sp-consensus-subspace/src/lib.rs +++ b/crates/sp-consensus-subspace/src/lib.rs @@ -40,8 +40,6 @@ use sp_runtime::{ConsensusEngineId, Justification}; use sp_runtime_interface::pass_by::PassBy; use sp_runtime_interface::{pass_by, runtime_interface}; use sp_std::num::NonZeroU32; -#[cfg(feature = "std")] -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pot::{PotCheckpoints, PotOutput, PotSeed}; use subspace_core_primitives::segments::{ HistorySize, SegmentCommitment, SegmentHeader, SegmentIndex, @@ -51,6 +49,8 @@ use subspace_core_primitives::{ SolutionRange, }; #[cfg(feature = "std")] +use subspace_kzg::Kzg; +#[cfg(feature = "std")] use subspace_proof_of_space::chia::ChiaTable; #[cfg(feature = "std")] use subspace_proof_of_space::shim::ShimTable; diff --git a/crates/subspace-archiving/Cargo.toml b/crates/subspace-archiving/Cargo.toml index 32e7c47568..726250fd5d 100644 --- a/crates/subspace-archiving/Cargo.toml +++ b/crates/subspace-archiving/Cargo.toml @@ -22,6 +22,7 @@ rayon = { version = "1.10.0", optional = true } serde = { version = "1.0.110", optional = true, features = ["derive"] } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives", default-features = false } subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding", default-features = false } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg", default-features = false } thiserror = { version = "1.0.64", optional = true } [dev-dependencies] @@ -46,6 +47,7 @@ std = [ "serde", "subspace-core-primitives/std", "subspace-erasure-coding/std", + "subspace-kzg/std", "thiserror", ] diff --git a/crates/subspace-archiving/benches/archiving.rs b/crates/subspace-archiving/benches/archiving.rs index a26d7dcbbe..97a9423f91 100644 --- a/crates/subspace-archiving/benches/archiving.rs +++ b/crates/subspace-archiving/benches/archiving.rs @@ -2,9 +2,9 @@ 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::Kzg; use subspace_core_primitives::pieces::Record; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; const AMOUNT_OF_DATA: usize = 5 * 1024 * 1024; const SMALL_BLOCK_SIZE: usize = 500; diff --git a/crates/subspace-archiving/src/archiver.rs b/crates/subspace-archiving/src/archiver.rs index 6542e8859e..70bd601d62 100644 --- a/crates/subspace-archiving/src/archiver.rs +++ b/crates/subspace-archiving/src/archiver.rs @@ -30,7 +30,6 @@ 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::{Kzg, Scalar}; use subspace_core_primitives::objects::{ BlockObject, BlockObjectMapping, GlobalObject, PieceObject, PieceObjectMapping, }; @@ -41,6 +40,7 @@ use subspace_core_primitives::segments::{ }; use subspace_core_primitives::{Blake3Hash, BlockNumber, ScalarBytes}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::{Kzg, Scalar}; const INITIAL_LAST_ARCHIVED_BLOCK: LastArchivedBlock = LastArchivedBlock { number: 0, diff --git a/crates/subspace-archiving/src/archiver/incremental_record_commitments.rs b/crates/subspace-archiving/src/archiver/incremental_record_commitments.rs index bf5311344a..1b70f35e11 100644 --- a/crates/subspace-archiving/src/archiver/incremental_record_commitments.rs +++ b/crates/subspace-archiving/src/archiver/incremental_record_commitments.rs @@ -8,9 +8,9 @@ use core::ops::{Deref, DerefMut}; use parity_scale_codec::{Encode, Output}; #[cfg(feature = "parallel")] use rayon::prelude::*; -use subspace_core_primitives::crypto::kzg::{Commitment, Kzg, Scalar}; use subspace_core_primitives::pieces::RawRecord; use subspace_core_primitives::ScalarBytes; +use subspace_kzg::{Commitment, Kzg, Scalar}; /// State of incremental record commitments, encapsulated to hide implementation details and /// encapsulate tricky logic diff --git a/crates/subspace-archiving/src/piece_reconstructor.rs b/crates/subspace-archiving/src/piece_reconstructor.rs index 3ed4ed05f6..d018314bba 100644 --- a/crates/subspace-archiving/src/piece_reconstructor.rs +++ b/crates/subspace-archiving/src/piece_reconstructor.rs @@ -8,10 +8,10 @@ use alloc::vec::Vec; #[cfg(feature = "parallel")] use rayon::prelude::*; use subspace_core_primitives::crypto::blake3_254_hash_to_scalar; -use subspace_core_primitives::crypto::kzg::{Commitment, Kzg, Polynomial, Scalar}; use subspace_core_primitives::pieces::{Piece, RawRecord}; use subspace_core_primitives::segments::ArchivedHistorySegment; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::{Commitment, Kzg, Polynomial, Scalar}; /// Reconstructor-related instantiation error #[derive(Debug, Clone, PartialEq)] diff --git a/crates/subspace-archiving/src/reconstructor.rs b/crates/subspace-archiving/src/reconstructor.rs index 9d4fb91538..a16625e385 100644 --- a/crates/subspace-archiving/src/reconstructor.rs +++ b/crates/subspace-archiving/src/reconstructor.rs @@ -8,7 +8,6 @@ use alloc::string::String; use alloc::vec::Vec; use core::mem; use parity_scale_codec::Decode; -use subspace_core_primitives::crypto::kzg::Scalar; use subspace_core_primitives::pieces::{Piece, RawRecord}; use subspace_core_primitives::segments::{ ArchivedBlockProgress, ArchivedHistorySegment, LastArchivedBlock, RecordedHistorySegment, @@ -16,6 +15,7 @@ use subspace_core_primitives::segments::{ }; use subspace_core_primitives::BlockNumber; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Scalar; /// Reconstructor-related instantiation error #[derive(Debug, Clone, PartialEq)] diff --git a/crates/subspace-archiving/tests/integration/archiver.rs b/crates/subspace-archiving/tests/integration/archiver.rs index cf4be695bd..003f56f050 100644 --- a/crates/subspace-archiving/tests/integration/archiver.rs +++ b/crates/subspace-archiving/tests/integration/archiver.rs @@ -7,7 +7,6 @@ use std::io::Write; use std::iter; use std::num::NonZeroUsize; use subspace_archiving::archiver::{Archiver, ArchiverInstantiationError, SegmentItem}; -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::{ @@ -16,6 +15,7 @@ use subspace_core_primitives::segments::{ }; use subspace_core_primitives::Blake3Hash; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; use subspace_verification::is_piece_valid; fn extract_data>(data: &[u8], offset: O) -> &[u8] { diff --git a/crates/subspace-archiving/tests/integration/piece_reconstruction.rs b/crates/subspace-archiving/tests/integration/piece_reconstruction.rs index f9b7dea7de..69bc2d7e7e 100644 --- a/crates/subspace-archiving/tests/integration/piece_reconstruction.rs +++ b/crates/subspace-archiving/tests/integration/piece_reconstruction.rs @@ -4,11 +4,11 @@ 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::Kzg; use subspace_core_primitives::objects::BlockObjectMapping; use subspace_core_primitives::pieces::{FlatPieces, Piece, Record}; use subspace_core_primitives::segments::{ArchivedHistorySegment, RecordedHistorySegment}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; fn pieces_to_option_of_pieces(pieces: &FlatPieces) -> Vec> { pieces.pieces().map(Some).collect() diff --git a/crates/subspace-archiving/tests/integration/reconstructor.rs b/crates/subspace-archiving/tests/integration/reconstructor.rs index bfcf556610..05af807097 100644 --- a/crates/subspace-archiving/tests/integration/reconstructor.rs +++ b/crates/subspace-archiving/tests/integration/reconstructor.rs @@ -4,7 +4,6 @@ use std::iter; use std::num::NonZeroUsize; use subspace_archiving::archiver::Archiver; use subspace_archiving::reconstructor::{Reconstructor, ReconstructorError}; -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::{ @@ -12,6 +11,7 @@ use subspace_core_primitives::segments::{ SegmentIndex, }; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; fn pieces_to_option_of_pieces(pieces: &FlatPieces) -> Vec> { pieces.pieces().map(Some).collect() diff --git a/crates/subspace-core-primitives/Cargo.toml b/crates/subspace-core-primitives/Cargo.toml index 1746a34445..dd4340cbb4 100644 --- a/crates/subspace-core-primitives/Cargo.toml +++ b/crates/subspace-core-primitives/Cargo.toml @@ -8,49 +8,33 @@ edition = "2021" include = [ "/src", "/Cargo.toml", - "/README.md", ] -[lib] -# Necessary for CLI options to work on benches -bench = false - [dependencies] blake3 = { version = "1.5.4", default-features = false } bytes = { version = "1.7.1", default-features = false } derive_more = { version = "1.0.0", default-features = false, features = ["full"] } hex = { version = "0.4.3", default-features = false, features = ["alloc"] } -kzg = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4", default-features = false } num-traits = { version = "0.2.18", default-features = false } parity-scale-codec = { version = "3.6.12", default-features = false, features = ["bytes", "derive", "max-encoded-len"] } -parking_lot = { version = "0.12.2", optional = true } rayon = { version = "1.10.0", optional = true } -rust-kzg-blst = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4", default-features = false } scale-info = { version = "2.11.2", default-features = false, features = ["derive"] } serde = { version = "1.0.110", optional = true, default-features = false, features = ["alloc", "derive"] } -# Replacement for `parking_lot` in `no_std` environment -spin = "0.9.7" static_assertions = "1.1.0" -tracing = { version = "0.1.40", default-features = false } uint = { version = "0.10.0", default-features = false } [dev-dependencies] -criterion = "0.5.1" rand = { version = "0.8.5", features = ["min_const_gen"] } -rand_core = "0.6.4" [features] default = [ - "embedded-kzg-settings", "serde", "std", "parallel", ] -embedded-kzg-settings = [] -# Enables some APIs and internal parallelism for KZG +# Enables some APIs parallel = [ "blake3/rayon", - "rust-kzg-blst/parallel", "dep:rayon", ] serde = [ @@ -61,20 +45,10 @@ std = [ "blake3/std", "bytes/std", "derive_more/std", - "rust-kzg-blst/std", "hex/std", - "kzg/std", "num-traits/std", "parity-scale-codec/std", - # In no-std environment we use `spin` - "parking_lot", "scale-info/std", "serde?/std", - "tracing/std", "uint/std", ] - -[[bench]] -name = "kzg" -harness = false - diff --git a/crates/subspace-core-primitives/README.md b/crates/subspace-core-primitives/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/crates/subspace-core-primitives/src/crypto.rs b/crates/subspace-core-primitives/src/crypto.rs index 9032c88686..627ceb5213 100644 --- a/crates/subspace-core-primitives/src/crypto.rs +++ b/crates/subspace-core-primitives/src/crypto.rs @@ -15,9 +15,6 @@ //! Various cryptographic utilities used across Subspace Network. -#[cfg(feature = "embedded-kzg-settings")] -pub mod kzg; - use crate::{Blake3Hash, ScalarBytes}; /// BLAKE3 hashing of a single value. diff --git a/crates/subspace-erasure-coding/Cargo.toml b/crates/subspace-erasure-coding/Cargo.toml index 1a16abbf17..39416f1c34 100644 --- a/crates/subspace-erasure-coding/Cargo.toml +++ b/crates/subspace-erasure-coding/Cargo.toml @@ -18,6 +18,7 @@ bench = false kzg = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4", default-features = false } rust-kzg-blst = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4", default-features = false } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives", default-features = false } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg", default-features = false } [dev-dependencies] rust-kzg-blst = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4" } @@ -30,6 +31,7 @@ std = [ "kzg/std", "rust-kzg-blst/std", "subspace-core-primitives/std", + "subspace-kzg/std", ] parallel = ["rust-kzg-blst/parallel"] diff --git a/crates/subspace-erasure-coding/benches/commitments.rs b/crates/subspace-erasure-coding/benches/commitments.rs index 6283bf0e64..1d8c5244cf 100644 --- a/crates/subspace-erasure-coding/benches/commitments.rs +++ b/crates/subspace-erasure-coding/benches/commitments.rs @@ -2,9 +2,9 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; use kzg::G1; use rust_kzg_blst::types::g1::FsG1; use std::num::NonZeroUsize; -use subspace_core_primitives::crypto::kzg::Commitment; use subspace_core_primitives::segments::ArchivedHistorySegment; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Commitment; fn criterion_benchmark(c: &mut Criterion) { let num_shards = ArchivedHistorySegment::NUM_PIECES; diff --git a/crates/subspace-erasure-coding/src/lib.rs b/crates/subspace-erasure-coding/src/lib.rs index 412b49d454..7ea884974e 100644 --- a/crates/subspace-erasure-coding/src/lib.rs +++ b/crates/subspace-erasure-coding/src/lib.rs @@ -15,7 +15,7 @@ use kzg::{FFTSettings, PolyRecover, DAS, FFTG1, G1}; use rust_kzg_blst::types::fft_settings::FsFFTSettings; use rust_kzg_blst::types::g1::FsG1; use rust_kzg_blst::types::poly::FsPoly; -use subspace_core_primitives::crypto::kzg::{Commitment, Polynomial, Scalar}; +use subspace_kzg::{Commitment, Polynomial, Scalar}; /// Erasure coding abstraction. /// diff --git a/crates/subspace-erasure-coding/src/tests.rs b/crates/subspace-erasure-coding/src/tests.rs index 94d50fee1f..7a22cd29d9 100644 --- a/crates/subspace-erasure-coding/src/tests.rs +++ b/crates/subspace-erasure-coding/src/tests.rs @@ -3,8 +3,8 @@ use kzg::G1; use rust_kzg_blst::types::g1::FsG1; use std::iter; use std::num::NonZeroUsize; -use subspace_core_primitives::crypto::kzg::{Commitment, Scalar}; use subspace_core_primitives::ScalarBytes; +use subspace_kzg::{Commitment, Scalar}; // TODO: This could have been done in-place, once implemented can be exposed as a utility fn concatenated_to_interleaved(input: Vec) -> Vec diff --git a/crates/subspace-farmer-components/Cargo.toml b/crates/subspace-farmer-components/Cargo.toml index 0e4bd6ed65..6fa1335404 100644 --- a/crates/subspace-farmer-components/Cargo.toml +++ b/crates/subspace-farmer-components/Cargo.toml @@ -35,6 +35,7 @@ static_assertions = "1.1.0" subspace-archiving = { version = "0.1.0", path = "../subspace-archiving" } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" } subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space", features = ["parallel"] } subspace-verification = { version = "0.1.0", path = "../subspace-verification" } thiserror = "1.0.64" diff --git a/crates/subspace-farmer-components/benches/auditing.rs b/crates/subspace-farmer-components/benches/auditing.rs index 01acaf94ea..e5ed09ad20 100644 --- a/crates/subspace-farmer-components/benches/auditing.rs +++ b/crates/subspace-farmer-components/benches/auditing.rs @@ -7,7 +7,6 @@ use std::io::Write; use std::num::{NonZeroU64, NonZeroUsize}; use std::{env, fs, slice}; use subspace_archiving::archiver::Archiver; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::sectors::SectorId; use subspace_core_primitives::segments::{HistorySize, RecordedHistorySegment}; @@ -22,6 +21,7 @@ use subspace_farmer_components::sector::{ sector_size, SectorContentsMap, SectorMetadata, SectorMetadataChecksummed, }; use subspace_farmer_components::FarmerProtocolInfo; +use subspace_kzg::Kzg; use subspace_proof_of_space::chia::ChiaTable; use subspace_proof_of_space::Table; diff --git a/crates/subspace-farmer-components/benches/plotting.rs b/crates/subspace-farmer-components/benches/plotting.rs index d947a25261..afcb5ed1ae 100644 --- a/crates/subspace-farmer-components/benches/plotting.rs +++ b/crates/subspace-farmer-components/benches/plotting.rs @@ -4,7 +4,6 @@ use rand::prelude::*; use std::env; use std::num::{NonZeroU64, NonZeroUsize}; use subspace_archiving::archiver::Archiver; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::segments::{HistorySize, RecordedHistorySegment}; use subspace_core_primitives::PublicKey; @@ -12,6 +11,7 @@ use subspace_erasure_coding::ErasureCoding; use subspace_farmer_components::plotting::{plot_sector, CpuRecordsEncoder, PlotSectorOptions}; use subspace_farmer_components::sector::sector_size; use subspace_farmer_components::FarmerProtocolInfo; +use subspace_kzg::Kzg; use subspace_proof_of_space::chia::ChiaTable; use subspace_proof_of_space::Table; diff --git a/crates/subspace-farmer-components/benches/proving.rs b/crates/subspace-farmer-components/benches/proving.rs index 4fb4630ebe..bac02d1b68 100644 --- a/crates/subspace-farmer-components/benches/proving.rs +++ b/crates/subspace-farmer-components/benches/proving.rs @@ -11,7 +11,6 @@ use std::io::Write; use std::num::{NonZeroU64, NonZeroUsize}; use std::{env, fs, slice}; use subspace_archiving::archiver::Archiver; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::pos::PosSeed; use subspace_core_primitives::sectors::SectorId; @@ -28,6 +27,7 @@ use subspace_farmer_components::sector::{ sector_size, SectorContentsMap, SectorMetadata, SectorMetadataChecksummed, }; use subspace_farmer_components::FarmerProtocolInfo; +use subspace_kzg::Kzg; use subspace_proof_of_space::chia::ChiaTable; use subspace_proof_of_space::{Table, TableGenerator}; diff --git a/crates/subspace-farmer-components/benches/reading.rs b/crates/subspace-farmer-components/benches/reading.rs index 569468b55b..034d485383 100644 --- a/crates/subspace-farmer-components/benches/reading.rs +++ b/crates/subspace-farmer-components/benches/reading.rs @@ -8,7 +8,6 @@ use std::io::Write; use std::num::{NonZeroU64, NonZeroUsize}; use std::{env, fs, slice}; use subspace_archiving::archiver::Archiver; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::{PieceOffset, Record}; use subspace_core_primitives::sectors::SectorId; use subspace_core_primitives::segments::{HistorySize, RecordedHistorySegment}; @@ -23,6 +22,7 @@ use subspace_farmer_components::sector::{ sector_size, SectorContentsMap, SectorMetadata, SectorMetadataChecksummed, }; use subspace_farmer_components::{FarmerProtocolInfo, ReadAt, ReadAtSync}; +use subspace_kzg::Kzg; use subspace_proof_of_space::chia::ChiaTable; use subspace_proof_of_space::Table; diff --git a/crates/subspace-farmer-components/src/plotting.rs b/crates/subspace-farmer-components/src/plotting.rs index 4b459eb405..db63eb8c5a 100644 --- a/crates/subspace-farmer-components/src/plotting.rs +++ b/crates/subspace-farmer-components/src/plotting.rs @@ -24,7 +24,6 @@ use std::simd::Simd; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Duration; -use subspace_core_primitives::crypto::kzg::{Kzg, Scalar}; use subspace_core_primitives::crypto::{blake3_hash, blake3_hash_parallel}; use subspace_core_primitives::pieces::{PieceIndex, PieceOffset, Record}; use subspace_core_primitives::pos::PosSeed; @@ -32,6 +31,7 @@ use subspace_core_primitives::sectors::{SBucket, SectorId, SectorIndex}; use subspace_core_primitives::segments::HistorySize; use subspace_core_primitives::{Blake3Hash, PublicKey, ScalarBytes}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::{Kzg, Scalar}; use subspace_proof_of_space::{Table, TableGenerator}; use thiserror::Error; use tokio::sync::{AcquireError, Semaphore}; diff --git a/crates/subspace-farmer-components/src/proving.rs b/crates/subspace-farmer-components/src/proving.rs index 90d53d7d36..498bffd5cb 100644 --- a/crates/subspace-farmer-components/src/proving.rs +++ b/crates/subspace-farmer-components/src/proving.rs @@ -14,12 +14,12 @@ use crate::{ReadAt, ReadAtSync}; use futures::FutureExt; use std::collections::VecDeque; use std::io; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::{PieceOffset, Record}; use subspace_core_primitives::pos::PosSeed; use subspace_core_primitives::sectors::{SBucket, SectorId}; use subspace_core_primitives::{ChunkWitness, PublicKey, ScalarBytes, Solution, SolutionRange}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; use subspace_proof_of_space::Table; use thiserror::Error; diff --git a/crates/subspace-farmer-components/src/reading.rs b/crates/subspace-farmer-components/src/reading.rs index b50f39e882..1b867a479f 100644 --- a/crates/subspace-farmer-components/src/reading.rs +++ b/crates/subspace-farmer-components/src/reading.rs @@ -18,11 +18,11 @@ use std::simd::Simd; use std::str::FromStr; use std::{fmt, io}; use subspace_core_primitives::crypto::blake3_hash; -use subspace_core_primitives::crypto::kzg::Scalar; use subspace_core_primitives::pieces::{Piece, PieceOffset, Record}; use subspace_core_primitives::sectors::{SBucket, SectorId}; use subspace_core_primitives::ScalarBytes; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Scalar; use subspace_proof_of_space::{Table, TableGenerator}; use thiserror::Error; use tracing::debug; diff --git a/crates/subspace-farmer-components/src/segment_reconstruction.rs b/crates/subspace-farmer-components/src/segment_reconstruction.rs index 84439f542f..06beef8cb7 100644 --- a/crates/subspace-farmer-components/src/segment_reconstruction.rs +++ b/crates/subspace-farmer-components/src/segment_reconstruction.rs @@ -3,10 +3,10 @@ use futures::stream::FuturesOrdered; use futures::StreamExt; use std::sync::atomic::{AtomicUsize, Ordering}; use subspace_archiving::piece_reconstructor::{PiecesReconstructor, ReconstructorError}; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::{Piece, PieceIndex}; use subspace_core_primitives::segments::{ArchivedHistorySegment, RecordedHistorySegment}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; use thiserror::Error; use tokio::sync::Semaphore; use tokio::task::JoinError; diff --git a/crates/subspace-farmer/Cargo.toml b/crates/subspace-farmer/Cargo.toml index 96ac09ed0f..5a0b4ef17f 100644 --- a/crates/subspace-farmer/Cargo.toml +++ b/crates/subspace-farmer/Cargo.toml @@ -54,6 +54,7 @@ ss58-registry = "1.50.0" subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding" } subspace-farmer-components = { version = "0.1.0", path = "../subspace-farmer-components" } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-metrics = { version = "0.1.0", path = "../../shared/subspace-metrics", optional = true } subspace-networking = { version = "0.1.0", path = "../subspace-networking" } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space" } diff --git a/crates/subspace-farmer/src/bin/subspace-farmer/commands/benchmark.rs b/crates/subspace-farmer/src/bin/subspace-farmer/commands/benchmark.rs index 6fae118d61..a951ca4677 100644 --- a/crates/subspace-farmer/src/bin/subspace-farmer/commands/benchmark.rs +++ b/crates/subspace-farmer/src/bin/subspace-farmer/commands/benchmark.rs @@ -8,7 +8,6 @@ use std::collections::HashSet; use std::fs::OpenOptions; use std::num::NonZeroUsize; use std::path::PathBuf; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::{Blake3Hash, SolutionRange}; use subspace_erasure_coding::ErasureCoding; @@ -21,6 +20,7 @@ use subspace_farmer::single_disk_farm::{ use subspace_farmer::utils::{recommended_number_of_farming_threads, tokio_rayon_spawn_handler}; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; use subspace_farmer_components::sector::sector_size; +use subspace_kzg::Kzg; use subspace_proof_of_space::Table; use subspace_rpc_primitives::SlotInfo; diff --git a/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/controller.rs b/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/controller.rs index 490727703d..371063ea00 100644 --- a/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/controller.rs +++ b/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/controller.rs @@ -18,7 +18,6 @@ use std::path::PathBuf; use std::pin::{pin, Pin}; use std::sync::Arc; use std::time::Duration; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_farmer::cluster::controller::controller_service; use subspace_farmer::cluster::nats_client::NatsClient; use subspace_farmer::farm::plotted_pieces::PlottedPieces; @@ -30,6 +29,7 @@ use subspace_farmer::node_client::rpc_node_client::RpcNodeClient; use subspace_farmer::node_client::NodeClient; use subspace_farmer::single_disk_farm::identity::Identity; use subspace_farmer::utils::{run_future_in_dedicated_thread, AsyncJoinOnDrop}; +use subspace_kzg::Kzg; use subspace_networking::utils::piece_provider::PieceProvider; use tracing::info; diff --git a/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/farmer.rs b/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/farmer.rs index ca6488e15f..9ca65ddbee 100644 --- a/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/farmer.rs +++ b/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/farmer.rs @@ -16,7 +16,6 @@ use std::num::NonZeroUsize; use std::pin::{pin, Pin}; use std::sync::Arc; use std::time::Duration; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::PublicKey; use subspace_erasure_coding::ErasureCoding; @@ -35,6 +34,7 @@ use subspace_farmer::utils::{ recommended_number_of_farming_threads, run_future_in_dedicated_thread, AsyncJoinOnDrop, }; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; +use subspace_kzg::Kzg; use subspace_proof_of_space::Table; use tokio::sync::{Barrier, Semaphore}; use tracing::{error, info, info_span, warn, Instrument}; diff --git a/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/plotter.rs b/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/plotter.rs index 373537caf8..48c7812a8b 100644 --- a/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/plotter.rs +++ b/crates/subspace-farmer/src/bin/subspace-farmer/commands/cluster/plotter.rs @@ -8,7 +8,6 @@ use std::num::NonZeroUsize; use std::pin::Pin; use std::sync::Arc; use std::time::Duration; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_erasure_coding::ErasureCoding; use subspace_farmer::cluster::controller::ClusterPieceGetter; @@ -25,6 +24,7 @@ use subspace_farmer::utils::{ create_plotting_thread_pool_manager, parse_cpu_cores_sets, thread_pool_core_indices, }; use subspace_farmer_components::PieceGetter; +use subspace_kzg::Kzg; use subspace_proof_of_space::Table; use tokio::sync::Semaphore; use tracing::info; diff --git a/crates/subspace-farmer/src/bin/subspace-farmer/commands/farm.rs b/crates/subspace-farmer/src/bin/subspace-farmer/commands/farm.rs index 8423c35faa..4c61943eb6 100644 --- a/crates/subspace-farmer/src/bin/subspace-farmer/commands/farm.rs +++ b/crates/subspace-farmer/src/bin/subspace-farmer/commands/farm.rs @@ -18,7 +18,6 @@ use std::pin::pin; use std::str::FromStr; use std::sync::Arc; use std::time::Duration; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::PublicKey; use subspace_erasure_coding::ErasureCoding; @@ -49,6 +48,7 @@ use subspace_farmer::utils::{ }; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; use subspace_farmer_components::PieceGetter; +use subspace_kzg::Kzg; use subspace_metrics::{start_prometheus_metrics_server, RegistryAdapter}; use subspace_networking::utils::piece_provider::PieceProvider; use subspace_proof_of_space::Table; diff --git a/crates/subspace-farmer/src/farmer_piece_getter/piece_validator.rs b/crates/subspace-farmer/src/farmer_piece_getter/piece_validator.rs index ac9e5fb5e2..7427827955 100644 --- a/crates/subspace-farmer/src/farmer_piece_getter/piece_validator.rs +++ b/crates/subspace-farmer/src/farmer_piece_getter/piece_validator.rs @@ -2,8 +2,8 @@ use crate::node_client::NodeClient; use async_trait::async_trait; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::{Piece, PieceIndex}; +use subspace_kzg::Kzg; use subspace_networking::libp2p::PeerId; use subspace_networking::utils::piece_provider::PieceValidator; use subspace_networking::Node; diff --git a/crates/subspace-farmer/src/plotter/cpu.rs b/crates/subspace-farmer/src/plotter/cpu.rs index 5929c0b951..d1b860f97c 100644 --- a/crates/subspace-farmer/src/plotter/cpu.rs +++ b/crates/subspace-farmer/src/plotter/cpu.rs @@ -23,7 +23,6 @@ use std::pin::pin; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Instant; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::sectors::SectorIndex; use subspace_core_primitives::PublicKey; use subspace_erasure_coding::ErasureCoding; @@ -32,6 +31,7 @@ use subspace_farmer_components::plotting::{ EncodeSectorOptions, PlottingError, }; use subspace_farmer_components::{FarmerProtocolInfo, PieceGetter}; +use subspace_kzg::Kzg; use subspace_proof_of_space::Table; use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tokio::task::yield_now; diff --git a/crates/subspace-farmer/src/plotter/gpu.rs b/crates/subspace-farmer/src/plotter/gpu.rs index d7a48f778a..8b0cf2ccb9 100644 --- a/crates/subspace-farmer/src/plotter/gpu.rs +++ b/crates/subspace-farmer/src/plotter/gpu.rs @@ -24,7 +24,6 @@ use std::pin::pin; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Instant; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::sectors::SectorIndex; use subspace_core_primitives::PublicKey; use subspace_erasure_coding::ErasureCoding; @@ -33,6 +32,7 @@ use subspace_farmer_components::plotting::{ PlottingError, RecordsEncoder, }; use subspace_farmer_components::{FarmerProtocolInfo, PieceGetter}; +use subspace_kzg::Kzg; use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tokio::task::yield_now; use tracing::{warn, Instrument}; diff --git a/crates/subspace-farmer/src/single_disk_farm.rs b/crates/subspace-farmer/src/single_disk_farm.rs index 4b3dca5f24..0a0a27b31a 100644 --- a/crates/subspace-farmer/src/single_disk_farm.rs +++ b/crates/subspace-farmer/src/single_disk_farm.rs @@ -67,7 +67,6 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use std::{fmt, fs, io, mem}; use subspace_core_primitives::crypto::blake3_hash; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::sectors::SectorIndex; use subspace_core_primitives::segments::{HistorySize, SegmentIndex}; @@ -77,6 +76,7 @@ use subspace_farmer_components::file_ext::FileExt; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; use subspace_farmer_components::sector::{sector_size, SectorMetadata, SectorMetadataChecksummed}; use subspace_farmer_components::{FarmerProtocolInfo, ReadAtSync}; +use subspace_kzg::Kzg; use subspace_networking::KnownPeersManager; use subspace_proof_of_space::Table; use subspace_rpc_primitives::{FarmerAppInfo, SolutionResponse}; diff --git a/crates/subspace-farmer/src/single_disk_farm/farming.rs b/crates/subspace-farmer/src/single_disk_farm/farming.rs index 728c969288..1adb04b19f 100644 --- a/crates/subspace-farmer/src/single_disk_farm/farming.rs +++ b/crates/subspace-farmer/src/single_disk_farm/farming.rs @@ -19,7 +19,6 @@ use rayon::ThreadPool; use std::collections::HashSet; use std::sync::Arc; use std::time::Instant; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::pos::PosSeed; use subspace_core_primitives::sectors::SectorIndex; @@ -31,6 +30,7 @@ use subspace_farmer_components::proving::{ProvableSolutions, ProvingError}; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; use subspace_farmer_components::sector::{SectorMetadata, SectorMetadataChecksummed}; use subspace_farmer_components::ReadAtSync; +use subspace_kzg::Kzg; use subspace_proof_of_space::{Table, TableGenerator}; use subspace_rpc_primitives::{SlotInfo, SolutionResponse}; use tracing::{debug, error, info, trace, warn, Span}; diff --git a/crates/subspace-service/Cargo.toml b/crates/subspace-service/Cargo.toml index ccb4d6306b..30479a35c1 100644 --- a/crates/subspace-service/Cargo.toml +++ b/crates/subspace-service/Cargo.toml @@ -84,6 +84,7 @@ static_assertions = "1.1.0" subspace-archiving = { version = "0.1.0", path = "../subspace-archiving" } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives" } subspace-erasure-coding = { version = "0.1.0", path = "../subspace-erasure-coding" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-networking = { version = "0.1.0", path = "../subspace-networking" } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space" } subspace-runtime-primitives = { version = "0.1.0", path = "../subspace-runtime-primitives" } diff --git a/crates/subspace-service/src/lib.rs b/crates/subspace-service/src/lib.rs index 71cc1b4efb..dc86f7dd6e 100644 --- a/crates/subspace-service/src/lib.rs +++ b/crates/subspace-service/src/lib.rs @@ -125,11 +125,11 @@ use std::marker::PhantomData; use std::num::NonZeroUsize; use std::sync::Arc; use std::time::Duration; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::pot::PotSeed; use subspace_core_primitives::{BlockNumber, PublicKey, REWARD_SIGNING_CONTEXT}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; use subspace_networking::libp2p::multiaddr::Protocol; use subspace_networking::utils::piece_provider::PieceProvider; use subspace_proof_of_space::Table; diff --git a/crates/subspace-service/src/rpc.rs b/crates/subspace-service/src/rpc.rs index 8f85891010..e5b17a3edd 100644 --- a/crates/subspace-service/src/rpc.rs +++ b/crates/subspace-service/src/rpc.rs @@ -41,9 +41,9 @@ use sp_consensus::SyncOracle; use sp_consensus_subspace::SubspaceApi; use sp_objects::ObjectsApi; use std::sync::Arc; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::{BlockNumber, PublicKey}; use subspace_erasure_coding::ErasureCoding; +use subspace_kzg::Kzg; use subspace_networking::libp2p::Multiaddr; use subspace_runtime_primitives::opaque::Block; use subspace_runtime_primitives::{AccountId, Balance, Nonce}; diff --git a/crates/subspace-service/src/sync_from_dsn/piece_validator.rs b/crates/subspace-service/src/sync_from_dsn/piece_validator.rs index 6070d97df4..1bc44d6397 100644 --- a/crates/subspace-service/src/sync_from_dsn/piece_validator.rs +++ b/crates/subspace-service/src/sync_from_dsn/piece_validator.rs @@ -1,8 +1,8 @@ use async_trait::async_trait; use sc_client_api::AuxStore; use sc_consensus_subspace::archiver::SegmentHeadersStore; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::pieces::{Piece, PieceIndex}; +use subspace_kzg::Kzg; use subspace_networking::libp2p::PeerId; use subspace_networking::utils::piece_provider::PieceValidator; use subspace_networking::Node; diff --git a/crates/subspace-verification/Cargo.toml b/crates/subspace-verification/Cargo.toml index be16f3e0d7..30a133445b 100644 --- a/crates/subspace-verification/Cargo.toml +++ b/crates/subspace-verification/Cargo.toml @@ -19,15 +19,17 @@ include = [ codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } schnorrkel = { version = "0.11.4", default-features = false } subspace-core-primitives = { version = "0.1.0", path = "../subspace-core-primitives", default-features = false } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg", default-features = false, optional = true } subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-space", default-features = false } thiserror = { version = "1.0.64", optional = true } [features] default = ["std", "kzg"] -kzg = ["subspace-core-primitives/embedded-kzg-settings"] +kzg = ["subspace-kzg"] std = [ "codec/std", "schnorrkel/std", "subspace-core-primitives/std", + "subspace-kzg?/std", "thiserror" ] diff --git a/crates/subspace-verification/src/lib.rs b/crates/subspace-verification/src/lib.rs index 0029ad4d21..343f16508d 100644 --- a/crates/subspace-verification/src/lib.rs +++ b/crates/subspace-verification/src/lib.rs @@ -33,8 +33,6 @@ use schnorrkel::context::SigningContext; use schnorrkel::SignatureError; #[cfg(feature = "kzg")] use subspace_core_primitives::crypto::blake3_254_hash_to_scalar; -#[cfg(feature = "kzg")] -use subspace_core_primitives::crypto::kzg::{Commitment, Kzg, Scalar, Witness}; use subspace_core_primitives::crypto::{blake3_hash_list, blake3_hash_with_key}; #[cfg(feature = "kzg")] use subspace_core_primitives::pieces::{PieceArray, Record, RecordWitness}; @@ -52,6 +50,8 @@ use subspace_core_primitives::{ SolutionRange, }; #[cfg(feature = "kzg")] +use subspace_kzg::{Commitment, Kzg, Scalar, Witness}; +#[cfg(feature = "kzg")] use subspace_proof_of_space::Table; /// Errors encountered by the Subspace consensus primitives. diff --git a/shared/subspace-kzg/Cargo.toml b/shared/subspace-kzg/Cargo.toml new file mode 100644 index 0000000000..56050ca898 --- /dev/null +++ b/shared/subspace-kzg/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "subspace-kzg" +description = "KZG primitives for Subspace Network" +license = "Apache-2.0" +version = "0.1.0" +authors = ["Nazar Mokrynskyi "] +edition = "2021" +include = [ + "/src", + "/Cargo.toml", +] + +[lib] +# Necessary for CLI options to work on benches +bench = false + +[[bench]] +name = "kzg" +harness = false + +[dependencies] +derive_more = { version = "1.0.0", default-features = false, features = ["full"] } +kzg = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4", default-features = false } +parking_lot = { version = "0.12.2", optional = true } +rust-kzg-blst = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fcc623df3d7e8c0f30951a49bfea764f90bf4", default-features = false } +# Replacement for `parking_lot` in `no_std` environment +spin = "0.9.7" +subspace-core-primitives = { version = "0.1.0", path = "../../crates/subspace-core-primitives", default-features = false } +tracing = { version = "0.1.40", default-features = false } + +[dev-dependencies] +criterion = "0.5.1" +rand = { version = "0.8.5", features = ["min_const_gen"] } +rand_core = "0.6.4" + +[features] +default = [ + "std", + "parallel", +] +# Enables internal parallelism for KZG +parallel = [ + "rust-kzg-blst/parallel", +] +std = [ + "derive_more/std", + "kzg/std", + # In no-std environment we use `spin` + "parking_lot", + "rust-kzg-blst/std", + "subspace-core-primitives/std", + "tracing/std", +] + diff --git a/crates/subspace-core-primitives/benches/kzg.rs b/shared/subspace-kzg/benches/kzg.rs similarity index 96% rename from crates/subspace-core-primitives/benches/kzg.rs rename to shared/subspace-kzg/benches/kzg.rs index 5720f9dfe8..351faed3ab 100644 --- a/crates/subspace-core-primitives/benches/kzg.rs +++ b/shared/subspace-kzg/benches/kzg.rs @@ -1,7 +1,7 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use subspace_core_primitives::crypto::kzg::{Kzg, Scalar}; use subspace_core_primitives::pieces::RawRecord; use subspace_core_primitives::ScalarBytes; +use subspace_kzg::{Kzg, Scalar}; fn criterion_benchmark(c: &mut Criterion) { let values = (0..RawRecord::NUM_CHUNKS) diff --git a/crates/subspace-core-primitives/src/crypto/kzg/eth-public-parameters.bin b/shared/subspace-kzg/src/eth-public-parameters.bin similarity index 100% rename from crates/subspace-core-primitives/src/crypto/kzg/eth-public-parameters.bin rename to shared/subspace-kzg/src/eth-public-parameters.bin diff --git a/crates/subspace-core-primitives/src/crypto/kzg.rs b/shared/subspace-kzg/src/lib.rs similarity index 98% rename from crates/subspace-core-primitives/src/crypto/kzg.rs rename to shared/subspace-kzg/src/lib.rs index 0867bb81f4..07fc7e5f05 100644 --- a/crates/subspace-core-primitives/src/crypto/kzg.rs +++ b/shared/subspace-kzg/src/lib.rs @@ -1,13 +1,10 @@ -//! Tools for KZG commitment scheme +//! KZG primitives for Subspace Network #[cfg(test)] mod tests; extern crate alloc; -use crate::pieces::{RecordCommitment, RecordWitness}; -use crate::segments::SegmentCommitment; -use crate::{ChunkWitness, ScalarBytes}; use alloc::collections::btree_map::Entry; use alloc::collections::BTreeMap; #[cfg(not(feature = "std"))] @@ -29,6 +26,9 @@ use rust_kzg_blst::types::kzg_settings::FsKZGSettings; use rust_kzg_blst::types::poly::FsPoly; #[cfg(not(feature = "std"))] use spin::Mutex; +use subspace_core_primitives::pieces::{RecordCommitment, RecordWitness}; +use subspace_core_primitives::segments::SegmentCommitment; +use subspace_core_primitives::{ChunkWitness, ScalarBytes}; use tracing::debug; /// Embedded KZG settings as bytes, too big for `no_std` in most cases @@ -36,7 +36,7 @@ use tracing::debug; /// ```bash /// curl -s https://seq.ceremony.ethereum.org/info/current_state | jq '.transcripts[3].powersOfTau' | jq -r '.G1Powers + .G2Powers | map(.[2:]) | join("")' | xxd -r -p - eth-public-parameters.bin /// ``` -pub const EMBEDDED_KZG_SETTINGS_BYTES: &[u8] = include_bytes!("kzg/eth-public-parameters.bin"); +pub const EMBEDDED_KZG_SETTINGS_BYTES: &[u8] = include_bytes!("eth-public-parameters.bin"); /// Number of G1 powers stored in [`EMBEDDED_KZG_SETTINGS_BYTES`] pub const NUM_G1_POWERS: usize = 32_768; /// Number of G2 powers stored in [`EMBEDDED_KZG_SETTINGS_BYTES`] @@ -624,7 +624,7 @@ impl TryFrom<&ChunkWitness> for Witness { #[inline] fn try_from(witness: &ChunkWitness) -> Result { - Witness::try_from(&witness.0) + Witness::try_from(*witness) } } @@ -633,7 +633,7 @@ impl TryFrom for Witness { #[inline] fn try_from(witness: ChunkWitness) -> Result { - Witness::try_from(witness.0) + Witness::try_from(&witness) } } diff --git a/crates/subspace-core-primitives/src/crypto/kzg/tests.rs b/shared/subspace-kzg/src/tests.rs similarity index 97% rename from crates/subspace-core-primitives/src/crypto/kzg/tests.rs rename to shared/subspace-kzg/src/tests.rs index e1002c75fb..6442885dd4 100644 --- a/crates/subspace-core-primitives/src/crypto/kzg/tests.rs +++ b/shared/subspace-kzg/src/tests.rs @@ -1,7 +1,7 @@ -use crate::crypto::kzg::{Kzg, Scalar}; -use crate::ScalarBytes; +use crate::{Kzg, Scalar}; use rand::thread_rng; use rand_core::RngCore; +use subspace_core_primitives::ScalarBytes; #[test] fn basic() { diff --git a/shared/subspace-proof-of-space-gpu/Cargo.toml b/shared/subspace-proof-of-space-gpu/Cargo.toml index 852ae6246d..3888584b7d 100644 --- a/shared/subspace-proof-of-space-gpu/Cargo.toml +++ b/shared/subspace-proof-of-space-gpu/Cargo.toml @@ -19,6 +19,7 @@ rust-kzg-blst = { git = "https://github.com/grandinetech/rust-kzg", rev = "6c8fc #sppark = { git = "https://github.com/dot-asm/sppark", rev = "8eeafe0f6cc0ca8211b1be93922df1b5a118bbd2", optional = true } sppark = { version = "0.1.8", optional = true } subspace-core-primitives = { version = "0.1.0", path = "../../crates/subspace-core-primitives", default-features = false, optional = true } +subspace-kzg = { version = "0.1.0", path = "../subspace-kzg", optional = true } [dev-dependencies] subspace-erasure-coding = { version = "0.1.0", path = "../../crates/subspace-erasure-coding" } @@ -39,4 +40,5 @@ _gpu = [ "dep:rust-kzg-blst", "dep:sppark", "dep:subspace-core-primitives", + "dep:subspace-kzg", ] diff --git a/shared/subspace-proof-of-space-gpu/src/cuda.rs b/shared/subspace-proof-of-space-gpu/src/cuda.rs index 3de0f3882f..4927415c1b 100644 --- a/shared/subspace-proof-of-space-gpu/src/cuda.rs +++ b/shared/subspace-proof-of-space-gpu/src/cuda.rs @@ -7,9 +7,10 @@ mod tests; use rust_kzg_blst::types::fr::FsFr; use std::ops::DerefMut; -use subspace_core_primitives::crypto::kzg::Scalar; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::pos::{PosProof, PosSeed}; +use subspace_core_primitives::ScalarBytes; +use subspace_kzg::Scalar; extern "C" { /// # Returns diff --git a/shared/subspace-proof-of-space-gpu/src/cuda/tests.rs b/shared/subspace-proof-of-space-gpu/src/cuda/tests.rs index 1633764345..9cf23e4a05 100644 --- a/shared/subspace-proof-of-space-gpu/src/cuda/tests.rs +++ b/shared/subspace-proof-of-space-gpu/src/cuda/tests.rs @@ -36,9 +36,10 @@ fn basic() { let sector_id = SectorId::new(blake3_hash(b"hello"), 500); let history_size = HistorySize::ONE; let mut record = Record::new_boxed(); - record.iter_mut().enumerate().for_each(|(index, chunk)| { - *chunk = blake3_254_hash_to_scalar(&index.to_le_bytes()).to_bytes() - }); + record + .iter_mut() + .enumerate() + .for_each(|(index, chunk)| *chunk = *blake3_254_hash_to_scalar(&index.to_le_bytes())); let mut cpu_encoded_records = Record::new_zero_vec(2); for cpu_encoded_record in &mut cpu_encoded_records { diff --git a/test/subspace-test-client/Cargo.toml b/test/subspace-test-client/Cargo.toml index 369422e369..aea3ba2d82 100644 --- a/test/subspace-test-client/Cargo.toml +++ b/test/subspace-test-client/Cargo.toml @@ -36,6 +36,7 @@ subspace-archiving = { path = "../../crates/subspace-archiving" } subspace-core-primitives = { path = "../../crates/subspace-core-primitives" } subspace-erasure-coding = { path = "../../crates/subspace-erasure-coding" } subspace-farmer-components = { path = "../../crates/subspace-farmer-components" } +subspace-kzg = { version = "0.1.0", path = "../../shared/subspace-kzg" } subspace-proof-of-space = { path = "../../crates/subspace-proof-of-space" } subspace-runtime-primitives = { path = "../../crates/subspace-runtime-primitives" } subspace-service = { path = "../../crates/subspace-service" } diff --git a/test/subspace-test-client/src/lib.rs b/test/subspace-test-client/src/lib.rs index 20bdf60c9f..45cf607082 100644 --- a/test/subspace-test-client/src/lib.rs +++ b/test/subspace-test-client/src/lib.rs @@ -34,7 +34,6 @@ use sp_core::{Decode, Encode}; use std::num::{NonZeroU64, NonZeroUsize}; use std::slice; use std::sync::Arc; -use subspace_core_primitives::crypto::kzg::Kzg; use subspace_core_primitives::objects::BlockObjectMapping; use subspace_core_primitives::pieces::Record; use subspace_core_primitives::pos::PosSeed; @@ -47,6 +46,7 @@ use subspace_farmer_components::plotting::{ }; use subspace_farmer_components::reading::ReadSectorRecordChunksMode; use subspace_farmer_components::FarmerProtocolInfo; +use subspace_kzg::Kzg; use subspace_proof_of_space::{Table, TableGenerator}; use subspace_runtime_primitives::opaque::Block; use subspace_service::{FullClient, NewFull};