Skip to content

Commit 517d03f

Browse files
links234ffarall
andauthored
Feat: MSP move bucket (Moonsong-Labs#276)
* implement file transfer bucket allowlist; move bucket bsp tasks; * add msp task * add move-bucket test; fixes; drive-by refactor of waits * fix lint/merge * increase test time * fix indexer payment tracking * fix lint * add todos * ammed PR review * fix merge * fix merge * fix merge * ammend review comments * Update client/file-transfer-service/src/handler.rs Co-authored-by: Facundo Farall <[email protected]> * fix warning from merge --------- Co-authored-by: Facundo Farall <[email protected]>
1 parent c10a3e3 commit 517d03f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1797
-341
lines changed

Cargo.lock

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/blockchain-service/src/commands.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use anyhow::Result;
22
use async_trait::async_trait;
33
use log::{debug, warn};
4+
use sc_network::Multiaddr;
45
use serde_json::Number;
6+
use sp_api::ApiError;
7+
use sp_core::H256;
58

69
use pallet_file_system_runtime_api::{
710
QueryBspConfirmChunksToProveForFileError, QueryFileEarliestVolunteerTickError,
@@ -17,11 +20,9 @@ use pallet_storage_providers_runtime_api::{
1720
};
1821
use shc_actors_framework::actor::ActorHandle;
1922
use shc_common::types::{
20-
BlockNumber, BucketId, ChunkId, ForestLeaf, MainStorageProviderId, Multiaddresses, ProviderId,
23+
BlockNumber, BucketId, ChunkId, ForestLeaf, MainStorageProviderId, ProviderId,
2124
RandomnessOutput, StorageHubEventsVec, StorageProviderId, TickNumber, TrieRemoveMutation,
2225
};
23-
use sp_api::ApiError;
24-
use sp_core::H256;
2526
use storage_hub_runtime::{AccountId, Balance, StorageDataUnit};
2627

2728
use super::{
@@ -92,7 +93,7 @@ pub enum BlockchainServiceCommand {
9293
QueryProviderMultiaddresses {
9394
provider_id: ProviderId,
9495
callback:
95-
tokio::sync::oneshot::Sender<Result<Multiaddresses, QueryProviderMultiaddressesError>>,
96+
tokio::sync::oneshot::Sender<Result<Vec<Multiaddr>, QueryProviderMultiaddressesError>>,
9697
},
9798
QueueSubmitProofRequest {
9899
request: SubmitProofRequest,
@@ -248,8 +249,8 @@ pub trait BlockchainServiceInterface {
248249
/// Query the MSP multiaddresses.
249250
async fn query_provider_multiaddresses(
250251
&self,
251-
msp_id: ProviderId,
252-
) -> Result<Multiaddresses, QueryProviderMultiaddressesError>;
252+
provider_id: ProviderId,
253+
) -> Result<Vec<Multiaddr>, QueryProviderMultiaddressesError>;
253254

254255
/// Queue a SubmitProofRequest to be processed.
255256
async fn queue_submit_proof_request(&self, request: SubmitProofRequest) -> Result<()>;
@@ -517,7 +518,7 @@ impl BlockchainServiceInterface for ActorHandle<BlockchainService> {
517518
async fn query_provider_multiaddresses(
518519
&self,
519520
provider_id: ProviderId,
520-
) -> Result<Multiaddresses, QueryProviderMultiaddressesError> {
521+
) -> Result<Vec<Multiaddr>, QueryProviderMultiaddressesError> {
521522
let (callback, rx) = tokio::sync::oneshot::channel();
522523
let message = BlockchainServiceCommand::QueryProviderMultiaddresses {
523524
provider_id,

client/blockchain-service/src/events.rs

+73
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,39 @@ pub struct SpStopStoringInsolventUser {
246246
}
247247
impl EventBusMessage for SpStopStoringInsolventUser {}
248248

249+
#[derive(Debug, Clone)]
250+
pub struct MoveBucketRequested {
251+
pub bucket_id: BucketId,
252+
pub new_msp_id: ProviderId,
253+
}
254+
impl EventBusMessage for MoveBucketRequested {}
255+
256+
#[derive(Debug, Clone)]
257+
pub struct MoveBucketRequestedForNewMsp {
258+
pub bucket_id: BucketId,
259+
}
260+
impl EventBusMessage for MoveBucketRequestedForNewMsp {}
261+
262+
#[derive(Debug, Clone)]
263+
pub struct MoveBucketRejected {
264+
pub bucket_id: BucketId,
265+
pub msp_id: ProviderId,
266+
}
267+
impl EventBusMessage for MoveBucketRejected {}
268+
269+
#[derive(Debug, Clone)]
270+
pub struct MoveBucketAccepted {
271+
pub bucket_id: BucketId,
272+
pub msp_id: ProviderId,
273+
}
274+
impl EventBusMessage for MoveBucketAccepted {}
275+
276+
#[derive(Debug, Clone)]
277+
pub struct MoveBucketExpired {
278+
pub bucket_id: BucketId,
279+
pub msp_id: ProviderId,
280+
}
281+
impl EventBusMessage for MoveBucketExpired {}
249282
/// BSP stopped storing a specific file.
250283
///
251284
/// This event is emitted when a BSP confirm stop storing a file.
@@ -300,6 +333,11 @@ pub struct BlockchainServiceEventBusProvider {
300333
user_without_funds_event_bus: EventBus<UserWithoutFunds>,
301334
sp_stop_storing_insolvent_user_event_bus: EventBus<SpStopStoringInsolventUser>,
302335
finalised_msp_stopped_storing_bucket_event_bus: EventBus<FinalisedMspStoppedStoringBucket>,
336+
move_bucket_requested_event_bus: EventBus<MoveBucketRequested>,
337+
move_bucket_rejected_event_bus: EventBus<MoveBucketRejected>,
338+
move_bucket_accepted_event_bus: EventBus<MoveBucketAccepted>,
339+
move_bucket_expired_event_bus: EventBus<MoveBucketExpired>,
340+
move_bucket_requested_for_new_msp_event_bus: EventBus<MoveBucketRequestedForNewMsp>,
303341
bsp_stop_storing_event_bus: EventBus<BspConfirmStoppedStoring>,
304342
finalised_bsp_stop_storing_event_bus: EventBus<FinalisedBspConfirmStoppedStoring>,
305343
notify_period_event_bus: EventBus<NotifyPeriod>,
@@ -323,6 +361,11 @@ impl BlockchainServiceEventBusProvider {
323361
user_without_funds_event_bus: EventBus::new(),
324362
sp_stop_storing_insolvent_user_event_bus: EventBus::new(),
325363
finalised_msp_stopped_storing_bucket_event_bus: EventBus::new(),
364+
move_bucket_requested_event_bus: EventBus::new(),
365+
move_bucket_rejected_event_bus: EventBus::new(),
366+
move_bucket_accepted_event_bus: EventBus::new(),
367+
move_bucket_expired_event_bus: EventBus::new(),
368+
move_bucket_requested_for_new_msp_event_bus: EventBus::new(),
326369
bsp_stop_storing_event_bus: EventBus::new(),
327370
finalised_bsp_stop_storing_event_bus: EventBus::new(),
328371
notify_period_event_bus: EventBus::new(),
@@ -422,6 +465,36 @@ impl ProvidesEventBus<FinalisedMspStoppedStoringBucket> for BlockchainServiceEve
422465
}
423466
}
424467

468+
impl ProvidesEventBus<MoveBucketRequested> for BlockchainServiceEventBusProvider {
469+
fn event_bus(&self) -> &EventBus<MoveBucketRequested> {
470+
&self.move_bucket_requested_event_bus
471+
}
472+
}
473+
474+
impl ProvidesEventBus<MoveBucketRejected> for BlockchainServiceEventBusProvider {
475+
fn event_bus(&self) -> &EventBus<MoveBucketRejected> {
476+
&self.move_bucket_rejected_event_bus
477+
}
478+
}
479+
480+
impl ProvidesEventBus<MoveBucketAccepted> for BlockchainServiceEventBusProvider {
481+
fn event_bus(&self) -> &EventBus<MoveBucketAccepted> {
482+
&self.move_bucket_accepted_event_bus
483+
}
484+
}
485+
486+
impl ProvidesEventBus<MoveBucketExpired> for BlockchainServiceEventBusProvider {
487+
fn event_bus(&self) -> &EventBus<MoveBucketExpired> {
488+
&self.move_bucket_expired_event_bus
489+
}
490+
}
491+
492+
impl ProvidesEventBus<MoveBucketRequestedForNewMsp> for BlockchainServiceEventBusProvider {
493+
fn event_bus(&self) -> &EventBus<MoveBucketRequestedForNewMsp> {
494+
&self.move_bucket_requested_for_new_msp_event_bus
495+
}
496+
}
497+
425498
impl ProvidesEventBus<BspConfirmStoppedStoring> for BlockchainServiceEventBusProvider {
426499
fn event_bus(&self) -> &EventBus<BspConfirmStoppedStoring> {
427500
&self.bsp_stop_storing_event_bus

client/blockchain-service/src/handler.rs

+38-3
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ use crate::{
5252
events::{
5353
AcceptedBspVolunteer, BlockchainServiceEventBusProvider, BspConfirmStoppedStoring,
5454
FinalisedBspConfirmStoppedStoring, FinalisedMspStoppedStoringBucket,
55-
FinalisedTrieRemoveMutationsApplied, LastChargeableInfoUpdated, NewStorageRequest,
56-
SlashableProvider, SpStopStoringInsolventUser, UserWithoutFunds,
55+
FinalisedTrieRemoveMutationsApplied, LastChargeableInfoUpdated, MoveBucketAccepted,
56+
MoveBucketExpired, MoveBucketRejected, MoveBucketRequested, MoveBucketRequestedForNewMsp,
57+
NewStorageRequest, SlashableProvider, SpStopStoringInsolventUser, UserWithoutFunds,
5758
},
5859
state::{
5960
BlockchainServiceStateStore, LastProcessedBlockNumberCf,
@@ -504,7 +505,8 @@ impl Actor for BlockchainService {
504505
.unwrap_or_else(|_| {
505506
error!(target: LOG_TARGET, "Failed to query provider multiaddresses");
506507
Err(QueryProviderMultiaddressesError::InternalError)
507-
});
508+
})
509+
.map(convert_raw_multiaddresses_to_multiaddr);
508510

509511
match callback.send(multiaddresses) {
510512
Ok(_) => {
@@ -1248,6 +1250,39 @@ impl BlockchainService {
12481250
size,
12491251
})
12501252
}
1253+
RuntimeEvent::FileSystem(
1254+
pallet_file_system::Event::MoveBucketRequested {
1255+
who: _,
1256+
bucket_id,
1257+
new_msp_id,
1258+
},
1259+
) => {
1260+
self.emit(MoveBucketRequested {
1261+
bucket_id,
1262+
new_msp_id,
1263+
});
1264+
if self.provider_ids.contains(&new_msp_id) {
1265+
self.emit(MoveBucketRequestedForNewMsp { bucket_id });
1266+
}
1267+
}
1268+
RuntimeEvent::FileSystem(
1269+
pallet_file_system::Event::MoveBucketRejected { bucket_id, msp_id },
1270+
) => {
1271+
self.emit(MoveBucketRejected { bucket_id, msp_id });
1272+
}
1273+
RuntimeEvent::FileSystem(
1274+
pallet_file_system::Event::MoveBucketAccepted { bucket_id, msp_id },
1275+
) => {
1276+
self.emit(MoveBucketAccepted { bucket_id, msp_id });
1277+
}
1278+
RuntimeEvent::FileSystem(
1279+
pallet_file_system::Event::MoveBucketRequestExpired {
1280+
bucket_id,
1281+
msp_id,
1282+
},
1283+
) => {
1284+
self.emit(MoveBucketExpired { bucket_id, msp_id });
1285+
}
12511286
RuntimeEvent::FileSystem(
12521287
pallet_file_system::Event::BspConfirmStoppedStoring {
12531288
bsp_id,

client/common/src/blockchain_utils.rs

+18-14
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,25 @@ pub fn get_events_at_block(
5757
pub fn convert_raw_multiaddresses_to_multiaddr(multiaddresses: Multiaddresses) -> Vec<Multiaddr> {
5858
let mut multiaddress_vec: Vec<Multiaddr> = Vec::new();
5959
for raw_multiaddr in multiaddresses.into_iter() {
60-
let multiaddress = match std::str::from_utf8(&raw_multiaddr) {
61-
Ok(s) => match Multiaddr::from_str(s) {
62-
Ok(multiaddr) => multiaddr,
63-
Err(e) => {
64-
error!("Failed to parse Multiaddress from string: {:?}", e);
65-
continue;
66-
}
67-
},
60+
if let Some(multiaddress) = convert_raw_multiaddress_to_multiaddr(&raw_multiaddr) {
61+
multiaddress_vec.push(multiaddress);
62+
}
63+
}
64+
multiaddress_vec
65+
}
66+
67+
pub fn convert_raw_multiaddress_to_multiaddr(raw_multiaddr: &[u8]) -> Option<Multiaddr> {
68+
match std::str::from_utf8(raw_multiaddr) {
69+
Ok(s) => match Multiaddr::from_str(s) {
70+
Ok(multiaddr) => Some(multiaddr),
6871
Err(e) => {
69-
error!("Failed to parse Multiaddress from bytes: {:?}", e);
70-
continue;
72+
error!("Failed to parse Multiaddress from string: {:?}", e);
73+
None
7174
}
72-
};
73-
74-
multiaddress_vec.push(multiaddress);
75+
},
76+
Err(e) => {
77+
error!("Failed to parse Multiaddress from bytes: {:?}", e);
78+
None
79+
}
7580
}
76-
multiaddress_vec
7781
}

client/common/src/types.rs

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub type StorageProviderId = pallet_storage_providers::types::StorageProviderId<
4949
pub type MainStorageProviderId = pallet_storage_providers::types::ProviderIdFor<Runtime>;
5050
pub type ProviderId = pallet_proofs_dealer::types::ProviderIdFor<Runtime>;
5151
pub type Multiaddresses = pallet_storage_providers::types::Multiaddresses<Runtime>;
52+
pub type MultiAddress = pallet_storage_providers::types::MultiAddress<Runtime>;
5253
pub type RandomnessOutput = pallet_proofs_dealer::types::RandomnessOutputFor<Runtime>;
5354
pub type ForestLeaf = pallet_proofs_dealer::types::KeyFor<Runtime>;
5455
pub type ForestRoot = pallet_proofs_dealer::types::ForestRootFor<Runtime>;
@@ -62,6 +63,8 @@ pub type KeyProofs = BTreeMap<ForestLeaf, KeyProof>;
6263
pub type Balance = pallet_storage_providers::types::BalanceOf<Runtime>;
6364
pub type OpaqueBlock = storage_hub_runtime::opaque::Block;
6465
pub type BlockHash = <OpaqueBlock as BlockT>::Hash;
66+
pub type PeerId = pallet_file_system::types::PeerId<Runtime>;
67+
6568
/// Type alias for the events vector.
6669
///
6770
/// The events vector is a storage element in the FRAME system pallet, which stores all the events

client/file-transfer-service/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ async-trait = { workspace = true }
2525
array-bytes = { workspace = true }
2626
futures = { workspace = true }
2727
codec = { workspace = true }
28+
chrono = { workspace = true }
2829

2930
# Substrate
3031
sc-client-api = { workspace = true }

0 commit comments

Comments
 (0)