From e89bd64d4cd32ef2b4ab8d52f935c1c2e5bf13b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 14 Aug 2024 13:44:30 +0000 Subject: [PATCH] fix(storagext): implement declare faults_recovered --- cli/artifacts/metadata.scale | Bin 143163 -> 146361 bytes .../storagext-cli/src/cmd/market.rs | 2 +- .../storagext-cli/src/cmd/storage_provider.rs | 30 +++- .../storagext/src/{ => clients}/market.rs | 0 .../storagext/src/clients/mod.rs | 5 + .../src/{ => clients}/storage_provider.rs | 51 ++++++- cli/polka-storage/storagext/src/lib.rs | 144 +++++++++++++++++- 7 files changed, 226 insertions(+), 6 deletions(-) rename cli/polka-storage/storagext/src/{ => clients}/market.rs (100%) create mode 100644 cli/polka-storage/storagext/src/clients/mod.rs rename cli/polka-storage/storagext/src/{ => clients}/storage_provider.rs (70%) diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale index 5802ed7f292b7b839143fd696491f46ea438093f..d4803cb7dd64b880d066663e8dc670e57529633d 100644 GIT binary patch delta 9459 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 bxl#+l=W10oPM15^v^(D::parse_json)] windowed_post: SubmitWindowedPoStParams, }, + + /// Declare faulty sectors. + DeclareFaults { + #[arg(value_parser = as ParseablePath>::parse_json)] + faults: Vec, + }, + + /// Declare recovered faulty sectors. + DeclareFaultsRecovered { + #[arg(value_parser = as ParseablePath>::parse_json)] + recoveries: Vec, + }, } impl StorageProviderCommand { @@ -123,7 +137,19 @@ impl StorageProviderCommand { .submit_windowed_post(&account_keypair, windowed_post.into()) .await?; - tracing::info!("[{}] Successfully submitted proof.", block_hash,); + tracing::info!("[{}] Successfully submitted proof.", block_hash); + } + StorageProviderCommand::DeclareFaults { faults } => { + let block_hash = client.declare_faults(&account_keypair, faults).await?; + + tracing::info!("[{}] Successfully declared faults.", block_hash); + } + StorageProviderCommand::DeclareFaultsRecovered { recoveries } => { + let block_hash = client + .declare_faults_recovered(&account_keypair, recoveries) + .await?; + + tracing::info!("[{}] Successfully declared faults.", block_hash); } } Ok(()) diff --git a/cli/polka-storage/storagext/src/market.rs b/cli/polka-storage/storagext/src/clients/market.rs similarity index 100% rename from cli/polka-storage/storagext/src/market.rs rename to cli/polka-storage/storagext/src/clients/market.rs diff --git a/cli/polka-storage/storagext/src/clients/mod.rs b/cli/polka-storage/storagext/src/clients/mod.rs new file mode 100644 index 000000000..095c4591f --- /dev/null +++ b/cli/polka-storage/storagext/src/clients/mod.rs @@ -0,0 +1,5 @@ +mod market; +mod storage_provider; + +pub use market::MarketClient; +pub use storage_provider::StorageProviderClient; diff --git a/cli/polka-storage/storagext/src/storage_provider.rs b/cli/polka-storage/storagext/src/clients/storage_provider.rs similarity index 70% rename from cli/polka-storage/storagext/src/storage_provider.rs rename to cli/polka-storage/storagext/src/clients/storage_provider.rs index 225c175cb..0bec86640 100644 --- a/cli/polka-storage/storagext/src/storage_provider.rs +++ b/cli/polka-storage/storagext/src/clients/storage_provider.rs @@ -5,7 +5,8 @@ use crate::{ self, bounded_vec::IntoBoundedByteVec, runtime_types::pallet_storage_provider::proofs::SubmitWindowedPoStParams, }, - BlockNumber, PolkaStorageConfig, ProveCommitSector, RegisteredPoStProof, SectorPreCommitInfo, + BlockNumber, FaultDeclaration, PolkaStorageConfig, ProveCommitSector, RecoveryDeclaration, + RegisteredPoStProof, SectorPreCommitInfo, }; /// The maximum number of deal IDs supported. @@ -121,4 +122,52 @@ impl StorageProviderClient { .traced_submission(&payload, account_keypair) .await } + + #[tracing::instrument( + level = "trace", + skip_all, + fields( + address = account_keypair.account_id().to_ss58check(), + ) + )] + pub async fn declare_faults( + &self, + account_keypair: &Keypair, + faults: Vec, + ) -> Result<::Hash, subxt::Error> + where + Keypair: subxt::tx::Signer, + { + let payload = runtime::tx() + .storage_provider() + .declare_faults(faults.into()); + + self.client + .traced_submission(&payload, account_keypair) + .await + } + + #[tracing::instrument( + level = "trace", + skip_all, + fields( + address = account_keypair.account_id().to_ss58check(), + ) + )] + pub async fn declare_faults_recovered( + &self, + account_keypair: &Keypair, + recoveries: Vec, + ) -> Result<::Hash, subxt::Error> + where + Keypair: subxt::tx::Signer, + { + let payload = runtime::tx() + .storage_provider() + .declare_faults_recovered(recoveries.into()); + + self.client + .traced_submission(&payload, account_keypair) + .await + } } diff --git a/cli/polka-storage/storagext/src/lib.rs b/cli/polka-storage/storagext/src/lib.rs index d74e8cff4..7e120dda7 100644 --- a/cli/polka-storage/storagext/src/lib.rs +++ b/cli/polka-storage/storagext/src/lib.rs @@ -1,11 +1,13 @@ -pub mod market; +pub mod clients; pub mod runtime; -pub mod storage_provider; + +use std::collections::BTreeSet; use cid::Cid; use codec::Encode; use frame_support::CloneNoBound; use primitives_proofs::{DealId, RegisteredPoStProof, RegisteredSealProof, SectorNumber}; +use runtime::runtime_types::bounded_collections::{bounded_btree_set, bounded_vec}; use subxt::{self, ext::sp_runtime::MultiSignature, tx::Signer, utils::Static}; pub use crate::runtime::{ @@ -162,3 +164,141 @@ impl From } } } + +#[derive(PartialEq, Eq, Debug, Clone, serde::Deserialize)] +pub struct FaultDeclaration { + pub deadline: u64, + pub partition: u32, + pub sectors: BTreeSet, +} + +impl From + for runtime::runtime_types::pallet_storage_provider::fault::FaultDeclaration +{ + fn from(value: FaultDeclaration) -> Self { + Self { + deadline: value.deadline, + partition: value.partition, + // Converts from BTreeSet -> Vec -> BoundedBTreeSet because subxt... + sectors: bounded_btree_set::BoundedBTreeSet(value.sectors.into_iter().collect()), + } + } +} + +impl From> + for runtime::runtime_types::pallet_storage_provider::fault::DeclareFaultsParams +{ + fn from(value: Vec) -> Self { + Self { + faults: bounded_vec::BoundedVec(value.into_iter().map(Into::into).collect()), + } + } +} +#[derive(PartialEq, Eq, Debug, Clone, serde::Deserialize)] +pub struct RecoveryDeclaration { + pub deadline: u64, + pub partition: u32, + pub sectors: BTreeSet, +} + +impl From + for runtime::runtime_types::pallet_storage_provider::fault::RecoveryDeclaration +{ + fn from(value: RecoveryDeclaration) -> Self { + Self { + deadline: value.deadline, + partition: value.partition, + // Converts from BTreeSet -> Vec -> BoundedBTreeSet because subxt... + sectors: bounded_btree_set::BoundedBTreeSet(value.sectors.into_iter().collect()), + } + } +} + +impl From> + for runtime::runtime_types::pallet_storage_provider::fault::DeclareFaultsRecoveredParams +{ + fn from(value: Vec) -> Self { + Self { + recoveries: bounded_vec::BoundedVec(value.into_iter().map(Into::into).collect()), + } + } +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeSet; + + use crate::{FaultDeclaration, RecoveryDeclaration}; + + #[test] + fn ensure_deserialization_faults() { + let declaration = r#" + { + "deadline": 0, + "partition": 0, + "sectors": [0, 1] + } + "#; + let result: FaultDeclaration = serde_json::from_str(declaration).unwrap(); + let expected = FaultDeclaration { + deadline: 0, + partition: 0, + sectors: BTreeSet::from_iter([0, 1].into_iter()), + }; + assert_eq!(expected, result); + } + + #[test] + fn ensure_deserialization_faults_vec() { + let declaration = r#" + [{ + "deadline": 0, + "partition": 0, + "sectors": [0, 1] + }] + "#; + let result: Vec = serde_json::from_str(declaration).unwrap(); + let expected = vec![FaultDeclaration { + deadline: 0, + partition: 0, + sectors: BTreeSet::from_iter([0, 1].into_iter()), + }]; + assert_eq!(expected, result); + } + + #[test] + fn ensure_deserialization_recoveries() { + let declaration = r#" + { + "deadline": 0, + "partition": 0, + "sectors": [0, 1] + } + "#; + let result: RecoveryDeclaration = serde_json::from_str(declaration).unwrap(); + let expected = RecoveryDeclaration { + deadline: 0, + partition: 0, + sectors: BTreeSet::from_iter([0, 1].into_iter()), + }; + assert_eq!(expected, result); + } + + #[test] + fn ensure_deserialization_recoveries_vec() { + let declaration = r#" + [{ + "deadline": 0, + "partition": 0, + "sectors": [0, 1] + }] + "#; + let result: Vec = serde_json::from_str(declaration).unwrap(); + let expected = vec![RecoveryDeclaration { + deadline: 0, + partition: 0, + sectors: BTreeSet::from_iter([0, 1].into_iter()), + }]; + assert_eq!(expected, result); + } +}