diff --git a/crates/pallet-subspace/Cargo.toml b/crates/pallet-subspace/Cargo.toml index 4aef1dad82..d2cb153c66 100644 --- a/crates/pallet-subspace/Cargo.toml +++ b/crates/pallet-subspace/Cargo.toml @@ -48,6 +48,9 @@ subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-spac [features] default = ["std"] +pot = [ + "sp-consensus-subspace/pot", +] std = [ "codec/std", "frame-benchmarking?/std", diff --git a/crates/pallet-subspace/src/mock.rs b/crates/pallet-subspace/src/mock.rs index f92f9e8163..faf5d0c277 100644 --- a/crates/pallet-subspace/src/mock.rs +++ b/crates/pallet-subspace/src/mock.rs @@ -257,6 +257,7 @@ pub fn make_pre_digest( let log = DigestItem::subspace_pre_digest(&PreDigest { slot, solution, + #[cfg(feature = "pot")] proof_of_time: Default::default(), }); Digest { logs: vec![log] } diff --git a/crates/sc-consensus-subspace/Cargo.toml b/crates/sc-consensus-subspace/Cargo.toml index 234bf9a34f..f21cf0ab53 100644 --- a/crates/sc-consensus-subspace/Cargo.toml +++ b/crates/sc-consensus-subspace/Cargo.toml @@ -65,3 +65,9 @@ thiserror = "1.0.38" #substrate-test-runtime = { version = "2.0.0", path = "../../substrate/substrate-test-runtime" } #substrate-test-runtime-client = { version = "2.0.0", path = "../../substrate/substrate-test-runtime-client" } #tokio = "1.27.0" + +[features] +pot = [ + "sc-proof-of-time/pot", + "sp-consensus-subspace/pot", +] diff --git a/crates/sc-consensus-subspace/src/lib.rs b/crates/sc-consensus-subspace/src/lib.rs index 91538c0060..de871d2f39 100644 --- a/crates/sc-consensus-subspace/src/lib.rs +++ b/crates/sc-consensus-subspace/src/lib.rs @@ -61,9 +61,10 @@ use sp_consensus::{ BlockOrigin, Environment, Error as ConsensusError, Proposer, SelectChain, SyncOracle, }; use sp_consensus_slots::{Slot, SlotDuration}; +#[cfg(feature = "pot")] +use sp_consensus_subspace::digests::PreDigest; use sp_consensus_subspace::digests::{ - extract_pre_digest, extract_subspace_digest_items, Error as DigestError, PreDigest, - SubspaceDigestItems, + extract_pre_digest, extract_subspace_digest_items, Error as DigestError, SubspaceDigestItems, }; use sp_consensus_subspace::{ check_header, ChainConstants, CheckedHeader, FarmerPublicKey, FarmerSignature, SubspaceApi, @@ -975,6 +976,7 @@ where None => parent_subspace_digest_items.solution_range, }; + #[cfg(feature = "pot")] if let Some(proof_of_time) = self.proof_of_time.as_ref() { let ret = self.proof_of_time_verification( proof_of_time.as_ref(), @@ -1116,6 +1118,7 @@ where /// Verifies the proof of time in the received block. #[allow(clippy::too_many_arguments)] + #[cfg(feature = "pot")] fn proof_of_time_verification( &self, proof_of_time: &dyn PotConsensusState, diff --git a/crates/sc-consensus-subspace/src/slot_worker.rs b/crates/sc-consensus-subspace/src/slot_worker.rs index 2f4d9a3342..d8e3c7b21c 100644 --- a/crates/sc-consensus-subspace/src/slot_worker.rs +++ b/crates/sc-consensus-subspace/src/slot_worker.rs @@ -28,7 +28,9 @@ use sc_consensus::{JustificationSyncLink, StorageChanges}; use sc_consensus_slots::{ BackoffAuthoringBlocksStrategy, SimpleSlotWorker, SlotInfo, SlotLenienceType, SlotProportion, }; -use sc_proof_of_time::{PotConsensusState, PotGetBlockProofsError}; +use sc_proof_of_time::PotConsensusState; +#[cfg(feature = "pot")] +use sc_proof_of_time::PotGetBlockProofsError; use sc_telemetry::TelemetryHandle; use sc_utils::mpsc::tracing_unbounded; use schnorrkel::context::SigningContext; @@ -36,22 +38,24 @@ use sp_api::{ApiError, NumberFor, ProvideRuntimeApi, TransactionFor}; use sp_blockchain::{Error as ClientError, HeaderBackend, HeaderMetadata}; use sp_consensus::{BlockOrigin, Environment, Error as ConsensusError, Proposer, SyncOracle}; use sp_consensus_slots::Slot; -use sp_consensus_subspace::digests::{ - extract_pre_digest, CompatibleDigestItem, PotPreDigest, PreDigest, -}; +#[cfg(feature = "pot")] +use sp_consensus_subspace::digests::PotPreDigest; +use sp_consensus_subspace::digests::{extract_pre_digest, CompatibleDigestItem, PreDigest}; use sp_consensus_subspace::{FarmerPublicKey, FarmerSignature, SignedVote, SubspaceApi, Vote}; use sp_core::crypto::ByteArray; use sp_core::H256; -use sp_runtime::traits::{ - Block as BlockT, Header, NumberFor as BlockNumberFor, One, Saturating, Zero, -}; +#[cfg(feature = "pot")] +use sp_runtime::traits::NumberFor as BlockNumberFor; +use sp_runtime::traits::{Block as BlockT, Header, One, Saturating, Zero}; use sp_runtime::DigestItem; use std::future::Future; use std::marker::PhantomData; use std::pin::Pin; use std::sync::Arc; +#[cfg(feature = "pot")] +use subspace_core_primitives::SlotNumber; use subspace_core_primitives::{ - BlockNumber, PublicKey, Randomness, RewardSignature, SectorId, SlotNumber, Solution, + BlockNumber, PublicKey, Randomness, RewardSignature, SectorId, Solution, }; use subspace_proof_of_space::Table; use subspace_verification::{ @@ -59,6 +63,7 @@ use subspace_verification::{ }; /// Errors while building the block proof of time. +#[cfg(feature = "pot")] #[derive(Debug, thiserror::Error)] pub enum PotCreateError { /// Parent block has no proof of time digest. @@ -132,6 +137,8 @@ where pub(super) max_block_proposal_slot_portion: Option, pub(super) telemetry: Option, pub(super) segment_headers_store: SegmentHeadersStore, + // TODO: Un-suppress once we enable PoT unconditionally + #[allow(dead_code)] pub(super) proof_of_time: Option>, pub(super) _pos_table: PhantomData, } @@ -350,12 +357,14 @@ where // block reward is claimed if maybe_pre_digest.is_none() && solution_distance <= solution_range / 2 { info!(target: "subspace", "🚜 Claimed block at slot {slot}"); + #[cfg(feature = "pot")] let proof_of_time = self .build_block_pot(parent_header, &parent_pre_digest, slot.into()) .ok()?; maybe_pre_digest.replace(PreDigest { solution, slot, + #[cfg(feature = "pot")] proof_of_time, }); } else if !parent_header.number().is_zero() { @@ -586,6 +595,7 @@ where } /// Builds the proof of time for the block being proposed. + #[cfg(feature = "pot")] fn build_block_pot( &self, parent_header: &Block::Header, diff --git a/crates/sc-proof-of-time/Cargo.toml b/crates/sc-proof-of-time/Cargo.toml index b14bac05b9..54e78a0a07 100644 --- a/crates/sc-proof-of-time/Cargo.toml +++ b/crates/sc-proof-of-time/Cargo.toml @@ -26,3 +26,6 @@ parking_lot = "0.12.1" thiserror = "1.0.38" tokio = { version = "1.28.2", features = ["time"] } tracing = "0.1.37" + +[features] +pot = [] diff --git a/crates/sc-proof-of-time/src/utils.rs b/crates/sc-proof-of-time/src/utils.rs index 7d8d4ed285..7f35d3b562 100644 --- a/crates/sc-proof-of-time/src/utils.rs +++ b/crates/sc-proof-of-time/src/utils.rs @@ -57,6 +57,9 @@ where block_hash: info.best_hash.to_fixed_bytes(), block_number: info.best_number, slot_number: pre_digest.slot.into(), + #[cfg(feature = "pot")] pot_pre_digest: pre_digest.proof_of_time.unwrap_or_default(), + #[cfg(not(feature = "pot"))] + pot_pre_digest: Default::default(), }) } diff --git a/crates/sp-consensus-subspace/Cargo.toml b/crates/sp-consensus-subspace/Cargo.toml index 9cc0fa7bf5..ad3d1b1ea6 100644 --- a/crates/sp-consensus-subspace/Cargo.toml +++ b/crates/sp-consensus-subspace/Cargo.toml @@ -38,6 +38,7 @@ thiserror = { version = "1.0.38", optional = true } [features] default = ["std"] +pot = [] std = [ "async-trait", "codec/std", diff --git a/crates/sp-consensus-subspace/src/digests.rs b/crates/sp-consensus-subspace/src/digests.rs index c48714196d..3b66c6b77c 100644 --- a/crates/sp-consensus-subspace/src/digests.rs +++ b/crates/sp-consensus-subspace/src/digests.rs @@ -40,6 +40,7 @@ pub struct PreDigest { pub slot: Slot, /// Solution (includes PoR) pub solution: Solution, + #[cfg(feature = "pot")] /// Proof of time included in the block /// TODO: It is Option<> for now for testing, to be removed /// when PoT feature is permanently enabled. @@ -648,6 +649,7 @@ where FarmerPublicKey::unchecked_from([0u8; 32]), FarmerPublicKey::unchecked_from([0u8; 32]), ), + #[cfg(feature = "pot")] proof_of_time: Default::default(), }); } diff --git a/crates/sp-consensus-subspace/src/tests.rs b/crates/sp-consensus-subspace/src/tests.rs index 0f92b22d76..03cf9fdc03 100644 --- a/crates/sp-consensus-subspace/src/tests.rs +++ b/crates/sp-consensus-subspace/src/tests.rs @@ -42,6 +42,7 @@ fn test_is_equivocation_proof_valid() { logs: vec![DigestItem::subspace_pre_digest(&PreDigest { slot, solution: solution.clone(), + #[cfg(feature = "pot")] proof_of_time: Default::default(), })], }, @@ -67,6 +68,7 @@ fn test_is_equivocation_proof_valid() { logs: vec![DigestItem::subspace_pre_digest(&PreDigest { slot, solution, + #[cfg(feature = "pot")] proof_of_time: Default::default(), })], }, diff --git a/crates/sp-lightclient/Cargo.toml b/crates/sp-lightclient/Cargo.toml index 49d2e3a1a2..c4628d9931 100644 --- a/crates/sp-lightclient/Cargo.toml +++ b/crates/sp-lightclient/Cargo.toml @@ -40,6 +40,9 @@ subspace-proof-of-space = { version = "0.1.0", path = "../subspace-proof-of-spac [features] default = ["std"] +pot = [ + "sp-consensus-subspace/pot", +] std = [ "codec/std", "scale-info/std", diff --git a/crates/sp-lightclient/src/tests.rs b/crates/sp-lightclient/src/tests.rs index 84b78608aa..804c8933b8 100644 --- a/crates/sp-lightclient/src/tests.rs +++ b/crates/sp-lightclient/src/tests.rs @@ -235,6 +235,7 @@ fn valid_header( let pre_digest = PreDigest { slot: slot.into(), solution, + #[cfg(feature = "pot")] proof_of_time: Default::default(), }; let digests = vec![ diff --git a/crates/subspace-node/Cargo.toml b/crates/subspace-node/Cargo.toml index 06100b7053..eba1156a44 100644 --- a/crates/subspace-node/Cargo.toml +++ b/crates/subspace-node/Cargo.toml @@ -77,6 +77,12 @@ substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/su [features] default = ["do-not-enforce-cost-of-storage"] +pot = [ + "sc-consensus-subspace/pot", + "sc-proof-of-time/pot", + "sp-consensus-subspace/pot", + "subspace-runtime/pot", +] do-not-enforce-cost-of-storage = [ "subspace-runtime/do-not-enforce-cost-of-storage" ] diff --git a/crates/subspace-runtime/Cargo.toml b/crates/subspace-runtime/Cargo.toml index 0f41d1a10f..8faa0bb079 100644 --- a/crates/subspace-runtime/Cargo.toml +++ b/crates/subspace-runtime/Cargo.toml @@ -68,6 +68,10 @@ hex-literal = "0.4.0" [features] default = ["std"] +pot = [ + "pallet-subspace/pot", + "sp-consensus-subspace/pot", +] std = [ "codec/std", "domain-runtime-primitives/std", diff --git a/crates/subspace-service/Cargo.toml b/crates/subspace-service/Cargo.toml index 19b3ed49a2..60f2061e2a 100644 --- a/crates/subspace-service/Cargo.toml +++ b/crates/subspace-service/Cargo.toml @@ -86,3 +86,8 @@ pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", git = "htt [features] default = [] +pot = [ + "sc-consensus-subspace/pot", + "sc-proof-of-time/pot", + "sp-consensus-subspace/pot", +] diff --git a/test/subspace-test-service/Cargo.toml b/test/subspace-test-service/Cargo.toml index 9bf243f89c..9f9aab05c9 100644 --- a/test/subspace-test-service/Cargo.toml +++ b/test/subspace-test-service/Cargo.toml @@ -63,3 +63,6 @@ tracing = "0.1.37" [dev-dependencies] sp-keyring = { git = "https://github.com/subspace/substrate", rev = "55c157cff49b638a59d81a9f971f0f9a66829c71" } + +[features] +pot = [] diff --git a/test/subspace-test-service/src/lib.rs b/test/subspace-test-service/src/lib.rs index 6fc5f54e7b..b5a98856c2 100644 --- a/test/subspace-test-service/src/lib.rs +++ b/test/subspace-test-service/src/lib.rs @@ -594,6 +594,7 @@ impl MockConsensusNode { let pre_digest: PreDigest = PreDigest { slot, solution: self.mock_solution.clone(), + #[cfg(feature = "pot")] proof_of_time: Default::default(), }; let mut digest = Digest::default();