diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index e0f68b81..c52feaaa 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -135,6 +135,8 @@ pub type ReportSign = BoundedVec>; pub type Report = BoundedVec>; pub type Cert = BoundedVec>; +pub type TerrName = BoundedVec>; + #[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] pub enum DataType { File, diff --git a/pallets/audit/src/benchmarking.rs b/pallets/audit/src/benchmarking.rs index 42754233..079af644 100644 --- a/pallets/audit/src/benchmarking.rs +++ b/pallets/audit/src/benchmarking.rs @@ -1,5 +1,5 @@ use super::*; -use crate::{Pallet as Audit, *}; +use crate::{Pallet as Audit}; // // use cp_cess_common::{IpAddress, Hash, DataType}; // // use codec::{alloc::string::ToString, Decode}; use frame_benchmarking::{ @@ -137,7 +137,7 @@ pub fn bench_generate_challenge(miner: AccountOf) -> Result<(), &' benchmarks! { submit_idle_proof { log::info!("start submit_idle_proof"); - pallet_tee_worker::benchmarking::generate_workers::(); + pallet_tee_worker::benchmarking::generate_workers::()?; let miner: AccountOf = account("miner1", 100, SEED); pallet_sminer::benchmarking::register_positive_miner::(miner.clone())?; let _ = pallet_file_bank::benchmarking::cert_idle_for_miner::(miner.clone())?; @@ -151,7 +151,7 @@ benchmarks! { submit_service_proof { log::info!("start submit_service_proof"); - pallet_tee_worker::benchmarking::generate_workers::(); + pallet_tee_worker::benchmarking::generate_workers::()?; let miner: AccountOf = account("miner1", 100, SEED); pallet_sminer::benchmarking::register_positive_miner::(miner.clone())?; let _ = pallet_file_bank::benchmarking::cert_idle_for_miner::(miner.clone())?; @@ -165,7 +165,7 @@ benchmarks! { submit_verify_idle_result { log::info!("start submit_verify_idle_result"); - pallet_tee_worker::benchmarking::generate_workers::(); + pallet_tee_worker::benchmarking::generate_workers::()?; let miner: AccountOf = account("miner1", 100, SEED); pallet_sminer::benchmarking::register_positive_miner::(miner.clone())?; let _ = pallet_file_bank::benchmarking::cert_idle_for_miner::(miner.clone())?; @@ -203,7 +203,7 @@ benchmarks! { submit_verify_service_result { log::info!("start submit_verify_service_result"); - pallet_tee_worker::benchmarking::generate_workers::(); + pallet_tee_worker::benchmarking::generate_workers::()?; let miner: AccountOf = account("miner1", 100, SEED); pallet_sminer::benchmarking::register_positive_miner::(miner.clone())?; let _ = pallet_file_bank::benchmarking::cert_idle_for_miner::(miner.clone())?; diff --git a/pallets/cess-treasury/src/lib.rs b/pallets/cess-treasury/src/lib.rs index 621bc62c..b736f3c8 100644 --- a/pallets/cess-treasury/src/lib.rs +++ b/pallets/cess-treasury/src/lib.rs @@ -10,7 +10,7 @@ use frame_support::{ // use sp_std::prelude::*; use sp_runtime::{ SaturatedConversion, Perbill, - traits::{CheckedAdd, CheckedSub, CheckedDiv, AccountIdConversion}, + traits::{CheckedAdd, CheckedSub, AccountIdConversion}, }; use frame_system::{ pallet_prelude::OriginFor, @@ -83,7 +83,7 @@ pub mod pallet { pub enum Error { /// Data operation overflow Overflow, - + /// Logically speaking, errors that should not occur Unexpected, } diff --git a/pallets/file-bank/src/benchmarking.rs b/pallets/file-bank/src/benchmarking.rs index 1d724633..837be487 100755 --- a/pallets/file-bank/src/benchmarking.rs +++ b/pallets/file-bank/src/benchmarking.rs @@ -80,12 +80,13 @@ pub fn cert_idle_for_miner(miner: T::AccountId) -> Result<(), &'stati } pub fn buy_space(user: T::AccountId) -> Result<(), &'static str> { + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; ::Currency::make_free_balance_be( &user, 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"), ); - pallet_storage_handler::Pallet::::buy_space(RawOrigin::Signed(user).into(), 10)?; + pallet_storage_handler::Pallet::::mint_territory(RawOrigin::Signed(user).into(), 10, territory_name)?; Ok(()) } @@ -107,10 +108,12 @@ pub fn initialize_file_from_scratch() -> Result<(), &'static str> { let bucket_name = "test-bucket1".as_bytes().to_vec(); let file_hash: Hash = Hash([80u8; 64]); let file_size: u128 = SEGMENT_SIZE * 3; + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let user_brief = UserBrief:: { user: user.clone(), file_name: file_name.try_into().map_err(|_e| "file name convert err")?, bucket_name: bucket_name.try_into().map_err(|_e| "bucket name convert err")?, + territory_name, }; let mut deal_info: BoundedVec, T::SegmentCount> = Default::default(); @@ -229,10 +232,12 @@ benchmarks! { let bucket_name = "test-bucket1".as_bytes().to_vec(); let file_hash: Hash = Hash([80u8; 64]); let file_size: u128 = SEGMENT_SIZE * 3; + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let user_brief = UserBrief:: { user: user.clone(), file_name: file_name.try_into().map_err(|_e| "file name convert err")?, bucket_name: bucket_name.try_into().map_err(|_e| "bucket name convert err")?, + territory_name, }; let mut deal_info: BoundedVec, T::SegmentCount> = Default::default(); @@ -280,10 +285,12 @@ benchmarks! { let bucket_name = "test-bucket1".as_bytes().to_vec(); let file_hash: Hash = Hash([80u8; 64]); let file_size: u128 = SEGMENT_SIZE * 3; + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let user_brief = UserBrief:: { user: user.clone(), file_name: file_name.try_into().map_err(|_e| "file name convert err")?, bucket_name: bucket_name.try_into().map_err(|_e| "bucket name convert err")?, + territory_name, }; let mut deal_info: BoundedVec, T::SegmentCount> = Default::default(); @@ -336,10 +343,12 @@ benchmarks! { let bucket_name = "test-bucket1".as_bytes().to_vec(); let file_hash: Hash = Hash([80u8; 64]); let file_size: u128 = SEGMENT_SIZE * 3; + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let user_brief = UserBrief:: { user: user.clone(), file_name: file_name.try_into().map_err(|_e| "file name convert err")?, bucket_name: bucket_name.try_into().map_err(|_e| "bucket name convert err")?, + territory_name, }; let mut deal_info: BoundedVec, T::SegmentCount> = Default::default(); @@ -414,10 +423,12 @@ benchmarks! { let bucket_name = "test-bucket1".as_bytes().to_vec(); let file_hash: Hash = Hash([80u8; 64]); let file_size: u128 = SEGMENT_SIZE * 3; + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let user_brief = UserBrief:: { user: user.clone(), file_name: file_name.try_into().map_err(|_e| "file name convert err")?, bucket_name: bucket_name.try_into().map_err(|_e| "bucket name convert err")?, + territory_name, }; let mut deal_info: BoundedVec, T::SegmentCount> = Default::default(); @@ -516,10 +527,12 @@ benchmarks! { let bucket_name = "test-bucket1".as_bytes().to_vec(); let file_hash: Hash = Hash([80u8; 64]); let file_size: u128 = SEGMENT_SIZE * 3; + let territory_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let user_brief = UserBrief:: { user: user.clone(), file_name: file_name.try_into().map_err(|_e| "file name convert err")?, bucket_name: bucket_name.try_into().map_err(|_e| "bucket name convert err")?, + territory_name, }; let mut deal_info: BoundedVec, T::SegmentCount> = Default::default(); @@ -650,26 +663,4 @@ benchmarks! { let (_, space) = T::MinerControl::get_power(&miner2)?; assert_eq!(space, FRAGMENT_SIZE); } - - ownership_transfer { - log::info!("start ownership_transfer"); - initialize_file_from_scratch::()?; - let user: AccountOf = account("user1", 100, SEED); - let user2: AccountOf = account("user2", 100, SEED); - buy_space::(user2.clone())?; - let file_name = "test-file".as_bytes().to_vec(); - let bucket_name = "test-bucket1".as_bytes().to_vec(); - let bucket_name: BoundedVec = bucket_name.try_into().unwrap(); - FileBank::::create_bucket(RawOrigin::Signed(user2.clone()).into(), user2.clone(), bucket_name.clone())?; - let user_brief = UserBrief:: { - user: user2.clone(), - file_name: file_name.try_into().map_err(|_e| "file name convert err")?, - bucket_name: bucket_name.clone(), - }; - }: _(RawOrigin::Signed(user.clone()), user_brief, Hash([80u8; 64])) - verify { - assert!(>::contains_key(&user2, &bucket_name)); - let info = >::try_get(&user2, &bucket_name).unwrap(); - assert!(info.object_list.contains(&Hash([80u8; 64]))); - } } \ No newline at end of file diff --git a/pallets/file-bank/src/functions.rs b/pallets/file-bank/src/functions.rs index 29629bf1..bdabb9f2 100644 --- a/pallets/file-bank/src/functions.rs +++ b/pallets/file-bank/src/functions.rs @@ -124,7 +124,7 @@ impl Pallet { let deal_info = >::try_get(deal_hash).map_err(|_| Error::::NonExistent)?; let segment_len = deal_info.segment_list.len() as u128; let needed_space = Self::cal_file_size(segment_len); - T::StorageHandle::unlock_user_space(&deal_info.user.user, needed_space)?; + T::StorageHandle::unlock_user_space(&deal_info.user.user, &deal_info.user.territory_name, needed_space)?; // unlock mienr space for complete_info in deal_info.complete_list { T::MinerControl::unlock_space(&complete_info.miner, FRAGMENT_SIZE * segment_len)?; @@ -194,7 +194,7 @@ impl Pallet { if acc == &user_brief.user { let file_size = Self::cal_file_size(file.segment_list.len() as u128); if user_clear { - T::StorageHandle::update_user_space(acc, 2, file_size)?; + T::StorageHandle::sub_territory_used_space(acc, &user_brief.territory_name, file_size)?; } file.owner.remove(index); break; @@ -264,8 +264,13 @@ impl Pallet { } if user_clear { - T::StorageHandle::update_user_space(acc, 2, total_fragment_dec as u128 * FRAGMENT_SIZE)?; - weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); + for user_brief in file.owner { + if &user_brief.user == acc { + T::StorageHandle::sub_territory_used_space(acc, &user_brief.territory_name, total_fragment_dec as u128 * FRAGMENT_SIZE)?; + weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); + break; + } + } } T::StorageHandle::sub_total_service_space(total_fragment_dec as u128 * FRAGMENT_SIZE)?; weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); @@ -319,9 +324,13 @@ impl Pallet { user: &AccountOf, file_hash: Hash, file_size: u128, + territory_name: TerrName, ) -> DispatchResult { - let file_info = - UserFileSliceInfo { file_hash: file_hash, file_size }; + let file_info = UserFileSliceInfo { + territory_name, + file_hash: file_hash, + file_size, + }; >::try_mutate(user, |v| -> DispatchResult { ensure!(!v.contains(&file_info), Error::::Existed); v.try_push(file_info).map_err(|_| Error::::StorageLimitReached)?; diff --git a/pallets/file-bank/src/impls/mod.rs b/pallets/file-bank/src/impls/mod.rs index 175fcf55..e8fd8c18 100644 --- a/pallets/file-bank/src/impls/mod.rs +++ b/pallets/file-bank/src/impls/mod.rs @@ -1,5 +1,2 @@ pub mod receptionist; -pub use receptionist::*; - pub mod dealimpl; -pub use dealimpl::*; \ No newline at end of file diff --git a/pallets/file-bank/src/impls/receptionist.rs b/pallets/file-bank/src/impls/receptionist.rs index aa677caa..89289fa9 100644 --- a/pallets/file-bank/src/impls/receptionist.rs +++ b/pallets/file-bank/src/impls/receptionist.rs @@ -10,8 +10,8 @@ impl Receptionist { .checked_mul(15).ok_or(Error::::Overflow)? .checked_div(10).ok_or(Error::::Overflow)? .checked_mul(file.segment_list.len() as u128).ok_or(Error::::Overflow)?; - ensure!(T::StorageHandle::get_user_avail_space(&user_brief.user)? > needed_space, Error::::InsufficientAvailableSpace); - T::StorageHandle::update_user_space(&user_brief.user, 1, needed_space)?; + ensure!(T::StorageHandle::get_user_avail_space(&user_brief.user, &user_brief.territory_name)? > needed_space, Error::::InsufficientAvailableSpace); + T::StorageHandle::add_territory_used_space(&user_brief.user, &user_brief.territory_name, needed_space)?; if >::contains_key(&user_brief.user, &user_brief.bucket_name) { Pallet::::add_file_to_bucket(&user_brief.user, &user_brief.bucket_name, &file_hash)?; @@ -19,7 +19,7 @@ impl Receptionist { Pallet::::create_bucket_helper(&user_brief.user, &user_brief.bucket_name, Some(file_hash))?; } - Pallet::::add_user_hold_fileslice(&user_brief.user, file_hash, needed_space)?; + Pallet::::add_user_hold_fileslice(&user_brief.user, file_hash, needed_space, user_brief.territory_name.clone())?; file.owner.try_push(user_brief.clone()).map_err(|_e| Error::::BoundedVecError)?; Ok(()) @@ -35,7 +35,7 @@ impl Receptionist { needed_space: u128, file_size: u128, ) -> DispatchResult { - T::StorageHandle::lock_user_space(&user_brief.user, needed_space)?; + T::StorageHandle::lock_user_space(&user_brief.user, &user_brief.territory_name, needed_space)?; // TODO! Replace the file_hash param Pallet::::generate_deal(file_hash.clone(), deal_info, user_brief.clone(), file_size)?; @@ -59,7 +59,7 @@ impl Receptionist { let segment_count = deal_info.segment_list.len(); let needed_space = Pallet::::cal_file_size(segment_count as u128); - T::StorageHandle::unlock_and_used_user_space(&deal_info.user.user, needed_space)?; + T::StorageHandle::unlock_and_used_user_space(&deal_info.user.user, &deal_info.user.territory_name, needed_space)?; T::StorageHandle::sub_total_idle_space(needed_space)?; T::StorageHandle::add_total_service_space(needed_space)?; @@ -68,7 +68,7 @@ impl Receptionist { } else { Pallet::::create_bucket_helper(&deal_info.user.user, &deal_info.user.bucket_name, Some(deal_hash))?; } - Pallet::::add_user_hold_fileslice(&deal_info.user.user, deal_hash.clone(), needed_space)?; + Pallet::::add_user_hold_fileslice(&deal_info.user.user, deal_hash.clone(), needed_space, deal_info.user.territory_name.clone())?; >::remove(deal_hash); Pallet::::deposit_event(Event::::StorageCompleted{ file_hash: deal_hash }); } diff --git a/pallets/file-bank/src/lib.rs b/pallets/file-bank/src/lib.rs index 6da0156f..8c5e6c32 100755 --- a/pallets/file-bank/src/lib.rs +++ b/pallets/file-bank/src/lib.rs @@ -27,7 +27,6 @@ use frame_support::traits::{ FindAuthor, Randomness, StorageVersion, - schedule::{Anon as ScheduleAnon, Named as ScheduleNamed}, }; // use sc_network::Multiaddr; @@ -64,7 +63,7 @@ use pallet_storage_handler::StorageHandle; use cp_scheduler_credit::SchedulerCreditCounter; use sp_runtime::{ traits::{ - BlockNumberProvider, CheckedAdd, Dispatchable + BlockNumberProvider, CheckedAdd }, RuntimeDebug, SaturatedConversion, }; @@ -106,13 +105,6 @@ pub mod pallet { type RuntimeCall: From>; - type FScheduler: ScheduleNamed, Self::SProposal, Self::SPalletsOrigin>; - - type AScheduler: ScheduleAnon, Self::SProposal, Self::SPalletsOrigin>; - /// Overarching type of all pallets origins. - type SPalletsOrigin: From>; - /// The SProposal. - type SProposal: Parameter + Dispatchable + From>; // Find the consensus of the current block type FindAuthor: FindAuthor; // Used to find out whether the schedule exists @@ -192,6 +184,8 @@ pub mod pallet { StorageCompleted { file_hash: Hash }, CalculateReport { miner: AccountOf, file_hash: Hash }, + + TerritoryFileDelivery { file_hash: Hash, new_territory: TerrName }, } #[pallet::error] @@ -261,6 +255,8 @@ pub mod pallet { MinerError, /// Does not comply with the rules: fragments of a segment need to be stored on different miners RulesNotAllowed, + /// The status of the file needs to be Active + NotActive, } #[pallet::storage] @@ -272,6 +268,7 @@ pub mod pallet { pub(super) type File = StorageMap<_, Blake2_128Concat, Hash, FileInfo>; + // todo! Consider that the storage structure can be optimized to BTreeMap #[pallet::storage] #[pallet::getter(fn user_hold_file_list)] pub(super) type UserHoldFileList = StorageMap< @@ -313,7 +310,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn clear_user_list)] pub(super) type ClearUserList = - StorageValue<_, BoundedVec, ConstU32<5000>>, ValueQuery>; + StorageValue<_, BoundedVec<(AccountOf, TerrName), ConstU32<2000>>, ValueQuery>; #[pallet::storage] #[pallet::getter(fn task_failed_count)] @@ -331,22 +328,25 @@ pub mod pallet { let mut weight: Weight = Weight::zero(); // FOR TESTING if now % days == 0u32.saturated_into() { - let (temp_weight, acc_list) = T::StorageHandle::frozen_task(); + let (temp_weight, clear_list) = T::StorageHandle::frozen_task(); weight = weight.saturating_add(temp_weight); - let temp_acc_list: BoundedVec, ConstU32<5000>> = - acc_list.try_into().unwrap_or_default(); + let temp_acc_list: BoundedVec<(AccountOf, TerrName), ConstU32<2000>> = + clear_list.try_into().unwrap_or_default(); ClearUserList::::put(temp_acc_list); weight = weight.saturating_add(T::DbWeight::get().writes(1)); } let mut count: u32 = 0; - let acc_list = ClearUserList::::get(); + let clear_list = ClearUserList::::get(); weight = weight.saturating_add(T::DbWeight::get().reads(1)); - for acc in acc_list.iter() { + for (acc, territory_name) in clear_list.iter() { // todo! Delete in blocks, and delete a part of each block if let Ok(mut file_info_list) = >::try_get(&acc) { weight = weight.saturating_add(T::DbWeight::get().reads(1)); while let Some(file_info) = file_info_list.pop() { + if file_info.territory_name != *territory_name { + continue; + } count = count.checked_add(1).unwrap_or(ONCE_MAX_CLEAR_FILE); if count == ONCE_MAX_CLEAR_FILE { >::insert(&acc, file_info_list); @@ -368,25 +368,21 @@ pub mod pallet { weight = weight.saturating_add(temp_weight); } } + + if let Err(e) = Self::bucket_remove_file(&file_info.file_hash, &acc, &file) { + log::error!("[FileBank]: space lease, delete file from bucket report a bug! {:?}", e); + } } else { log::error!("space lease, delete file bug!"); log::error!("acc: {:?}, file_hash: {:?}", &acc, &file_info.file_hash); } - } - match T::StorageHandle::delete_user_space_storage(&acc) { - Ok(temp_weight) => weight = weight.saturating_add(temp_weight), - Err(e) => log::info!("delete user sapce error: {:?}, \n failed user: {:?}", e, acc), + } ClearUserList::::mutate(|target_list| { - target_list.retain(|temp_acc| temp_acc != acc); + target_list.retain(|temp_acc| temp_acc.0 != *acc); }); - - >::remove(&acc); - // todo! clear all - let _ = >::clear_prefix(&acc, 100000, None); - >::remove(&acc); } } @@ -431,11 +427,10 @@ pub mod pallet { if >::contains_key(&file_hash) { Receptionist::::fly_upload_file(file_hash, user_brief.clone())?; } else { - let needed_space = SEGMENT_SIZE - .checked_mul(30).ok_or(Error::::Overflow)? - .checked_div(10).ok_or(Error::::Overflow)? + let needed_space = FRAGMENT_SIZE + .checked_mul(FRAGMENT_COUNT.into()).ok_or(Error::::Overflow)? .checked_mul(deal_info.len() as u128).ok_or(Error::::Overflow)?; - ensure!(T::StorageHandle::get_user_avail_space(&user_brief.user)? > needed_space, Error::::InsufficientAvailableSpace); + ensure!(T::StorageHandle::get_user_avail_space(&user_brief.user, &user_brief.territory_name)? > needed_space, Error::::InsufficientAvailableSpace); Receptionist::::generate_deal(file_hash, deal_info, user_brief.clone(), needed_space, file_size)?; } @@ -443,71 +438,113 @@ pub mod pallet { Ok(()) } - - /// Transfer Ownership of a File - /// - /// This function allows the owner of a file to transfer ownership to another account. The file is identified by its unique - /// `file_hash`, and the ownership is transferred to the target user specified in the `target_brief`. The sender of the - /// transaction must be the current owner of the file. - /// - /// Parameters: - /// - `origin`: The origin of the transaction, representing the current owner of the file. - /// - `target_brief`: User brief information of the target user to whom ownership is being transferred. - /// - `file_hash`: The unique hash identifier of the file to be transferred + #[pallet::call_index(2)] #[transactional] - /// FIX ME - #[pallet::weight(::WeightInfo::ownership_transfer())] - pub fn ownership_transfer( + #[pallet::weight(::WeightInfo::calculate_report())] + pub fn territory_file_delivery( origin: OriginFor, - target_brief: UserBrief, + user: AccountOf, file_hash: Hash, + target_territory: TerrName, ) -> DispatchResult { let sender = ensure_signed(origin)?; - let file = >::try_get(&file_hash).map_err(|_| Error::::FileNonExistent)?; - //If the file does not exist, false will also be returned - ensure!(Self::check_is_file_owner(&sender, &file_hash), Error::::NotOwner); - ensure!(!Self::check_is_file_owner(&target_brief.user, &file_hash), Error::::IsOwned); - - ensure!(file.stat == FileState::Active, Error::::Unprepared); - ensure!(>::contains_key(&target_brief.user, &target_brief.bucket_name), Error::::NonExistent); - //Modify the space usage of target acc, - //and determine whether the space is enough to support transfer - let file_size = Self::cal_file_size(file.segment_list.len() as u128); - T::StorageHandle::update_user_space(&target_brief.user, 1, file_size)?; - //Increase the ownership of the file for target acc - >::try_mutate(&file_hash, |file_opt| -> DispatchResult { - let file = file_opt.as_mut().ok_or(Error::::FileNonExistent)?; - file.owner.try_push(target_brief.clone()).map_err(|_| Error::::BoundedVecError)?; - Ok(()) - })?; - //Add files to the bucket of target acc - >::try_mutate( - &target_brief.user, - &target_brief.bucket_name, - |bucket_info_opt| -> DispatchResult { - let bucket_info = bucket_info_opt.as_mut().ok_or(Error::::NonExistent)?; - bucket_info.object_list.try_push(file_hash.clone()).map_err(|_| Error::::LengthExceedsLimit)?; - Ok(()) - })?; - //Increase the corresponding space usage for target acc - Self::add_user_hold_fileslice( - &target_brief.user, - file_hash.clone(), - file_size, - )?; - //Clean up the file holding information of the original user - let file = >::try_get(&file_hash).map_err(|_| Error::::NonExistent)?; + ensure!(Self::check_permission(sender.clone(), user.clone()), Error::::NoPermission); + ensure!(Self::check_is_file_owner(&user, &file_hash), Error::::NotOwner); + let mut file_info = >::try_get(&file_hash).map_err(|_| Error::::NonExistent)?; + ensure!(file_info.stat == FileState::Active, Error::::NotActive); + T::StorageHandle::check_territry_owner(&user, &target_territory)?; + + for user_brief in file_info.owner.iter_mut() { + if user_brief.user == user { + let space = FRAGMENT_SIZE + .checked_mul(FRAGMENT_COUNT.into()).ok_or(Error::::Overflow)? + .checked_mul(file_info.segment_list.len() as u128).ok_or(Error::::Overflow)?; + T::StorageHandle::sub_territory_used_space(&user, &user_brief.territory_name, space)?; + T::StorageHandle::add_territory_used_space(&user, &target_territory, space)?; + user_brief.territory_name = target_territory.clone(); + } + } - let _ = Self::delete_user_file(&file_hash, &sender, &file)?; + UserHoldFileList::::mutate(&user, |slice_list| -> DispatchResult { + for slice_info in slice_list.iter_mut() { + if slice_info.file_hash == file_hash { + slice_info.territory_name = target_territory.clone(); + } + } - Self::bucket_remove_file(&file_hash, &sender, &file)?; + Ok(()) + })?; - Self::remove_user_hold_file_list(&file_hash, &sender)?; - // let _ = Self::clear_user_file(file_hash.clone(), &sender, true)?; + Self::deposit_event(Event::::TerritoryFileDelivery { file_hash: file_hash, new_territory: target_territory }); Ok(()) } + + /// Transfer Ownership of a File + /// + /// This function allows the owner of a file to transfer ownership to another account. The file is identified by its unique + /// `file_hash`, and the ownership is transferred to the target user specified in the `target_brief`. The sender of the + /// transaction must be the current owner of the file. + /// + /// Parameters: + /// - `origin`: The origin of the transaction, representing the current owner of the file. + /// - `target_brief`: User brief information of the target user to whom ownership is being transferred. + /// - `file_hash`: The unique hash identifier of the file to be transferred + // #[pallet::call_index(2)] + // #[transactional] + // /// FIX ME + // #[pallet::weight(::WeightInfo::ownership_transfer())] + // pub fn ownership_transfer( + // origin: OriginFor, + // target_brief: UserBrief, + // file_hash: Hash, + // ) -> DispatchResult { + // let sender = ensure_signed(origin)?; + // let file = >::try_get(&file_hash).map_err(|_| Error::::FileNonExistent)?; + // //If the file does not exist, false will also be returned + // ensure!(Self::check_is_file_owner(&sender, &file_hash), Error::::NotOwner); + // ensure!(!Self::check_is_file_owner(&target_brief.user, &file_hash), Error::::IsOwned); + + // ensure!(file.stat == FileState::Active, Error::::Unprepared); + // ensure!(>::contains_key(&target_brief.user, &target_brief.bucket_name), Error::::NonExistent); + // //Modify the space usage of target acc, + // //and determine whether the space is enough to support transfer + // let file_size = Self::cal_file_size(file.segment_list.len() as u128); + // T::StorageHandle::add_territory_used_space(&target_brief.user, &target_brief.territory_name, file_size)?; + // //Increase the ownership of the file for target acc + // >::try_mutate(&file_hash, |file_opt| -> DispatchResult { + // let file = file_opt.as_mut().ok_or(Error::::FileNonExistent)?; + // file.owner.try_push(target_brief.clone()).map_err(|_| Error::::BoundedVecError)?; + // Ok(()) + // })?; + // //Add files to the bucket of target acc + // >::try_mutate( + // &target_brief.user, + // &target_brief.bucket_name, + // |bucket_info_opt| -> DispatchResult { + // let bucket_info = bucket_info_opt.as_mut().ok_or(Error::::NonExistent)?; + // bucket_info.object_list.try_push(file_hash.clone()).map_err(|_| Error::::LengthExceedsLimit)?; + // Ok(()) + // })?; + // //Increase the corresponding space usage for target acc + // Self::add_user_hold_fileslice( + // &target_brief.user, + // file_hash.clone(), + // file_size, + // )?; + // //Clean up the file holding information of the original user + // let file = >::try_get(&file_hash).map_err(|_| Error::::NonExistent)?; + + // let _ = Self::delete_user_file(&file_hash, &sender, &file)?; + + // Self::bucket_remove_file(&file_hash, &sender, &file)?; + + // Self::remove_user_hold_file_list(&file_hash, &sender)?; + // // let _ = Self::clear_user_file(file_hash.clone(), &sender, true)?; + + // Ok(()) + // } /// Transfer Report for a Storage Deal /// diff --git a/pallets/file-bank/src/types.rs b/pallets/file-bank/src/types.rs index 8e8df44a..08c5a289 100755 --- a/pallets/file-bank/src/types.rs +++ b/pallets/file-bank/src/types.rs @@ -83,6 +83,7 @@ pub struct FragmentInfo { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, MaxEncodedLen, TypeInfo)] pub struct UserFileSliceInfo { + pub(super) territory_name: TerrName, pub(super) file_hash: Hash, pub(super) file_size: u128, } @@ -101,7 +102,8 @@ pub struct BucketInfo { pub struct UserBrief { pub user: AccountOf, pub file_name: BoundedVec, - pub bucket_name: BoundedVec, + pub bucket_name: BoundedVec, + pub territory_name: TerrName, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, MaxEncodedLen, TypeInfo)] diff --git a/pallets/file-bank/src/weights.rs b/pallets/file-bank/src/weights.rs index a8230a04..ed201e7b 100644 --- a/pallets/file-bank/src/weights.rs +++ b/pallets/file-bank/src/weights.rs @@ -1,8 +1,8 @@ //! Autogenerated weights for `pallet_file_bank` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-04-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `ytqaljn-virtual-machine`, CPU: `12th Gen Intel(R) Core(TM) i5-12400` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("cess-initial-testnet")`, DB CACHE: `1024` @@ -48,7 +48,6 @@ pub trait WeightInfo { fn claim_restoral_order() -> Weight; fn claim_restoral_noexist_order() -> Weight; fn restoral_order_complete() -> Weight; - fn ownership_transfer() -> Weight; } /// Weights for `pallet_file_bank` using the Substrate node and recommended hardware. @@ -68,39 +67,39 @@ impl WeightInfo for SubstrateWeight { /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) fn cert_idle_space() -> Weight { // Proof Size summary in bytes: - // Measured: `4088` + // Measured: `4154` // Estimated: `206644` - // Minimum execution time: 100_224_000 picoseconds. - Weight::from_parts(141_159_000, 206644) + // Minimum execution time: 79_859_000 picoseconds. + Weight::from_parts(97_178_000, 206644) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: `FileBank::File` (r:1 w:0) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `FileBank::DealMap` (r:0 w:1) - /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833655), added: 836130, mode: `MaxEncodedLen`) + /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833719), added: 836194, mode: `MaxEncodedLen`) /// The range of component `v` is `[1, 30]`. fn upload_declaration(v: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `530` - // Estimated: `9292572` - // Minimum execution time: 32_363_000 picoseconds. - Weight::from_parts(40_900_937, 9292572) - // Standard Error: 88_475 - .saturating_add(Weight::from_parts(1_750_349, 0).saturating_mul(v.into())) + // Measured: `707` + // Estimated: `12492572` + // Minimum execution time: 28_071_000 picoseconds. + Weight::from_parts(30_658_375, 12492572) + // Standard Error: 53_614 + .saturating_add(Weight::from_parts(1_036_572, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Sminer::MinerItems` (r:1 w:1) /// Proof: `Sminer::MinerItems` (`max_values`: None, `max_size`: Some(203179), added: 205654, mode: `MaxEncodedLen`) /// Storage: `FileBank::DealMap` (r:1 w:1) - /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833655), added: 836130, mode: `MaxEncodedLen`) + /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833719), added: 836194, mode: `MaxEncodedLen`) /// Storage: `Sminer::PendingReplacements` (r:12 w:12) /// Proof: `Sminer::PendingReplacements` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:1) /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:1) @@ -110,18 +109,18 @@ impl WeightInfo for SubstrateWeight { /// Storage: `FileBank::UserBucketList` (r:1 w:1) /// Proof: `FileBank::UserBucketList` (`max_values`: None, `max_size`: Some(64050), added: 66525, mode: `MaxEncodedLen`) /// Storage: `FileBank::UserHoldFileList` (r:1 w:1) - /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(40000052), added: 40002527, mode: `MaxEncodedLen`) + /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(72000052), added: 72002527, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:0 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// The range of component `v` is `[1, 30]`. fn transfer_report(v: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `4816 + v * (833 ±0)` - // Estimated: `40003517` - // Minimum execution time: 132_079_000 picoseconds. - Weight::from_parts(160_182_023, 40003517) - // Standard Error: 159_673 - .saturating_add(Weight::from_parts(2_559_055, 0).saturating_mul(v.into())) + // Measured: `4996 + v * (833 ±0)` + // Estimated: `72003517` + // Minimum execution time: 111_060_000 picoseconds. + Weight::from_parts(125_282_482, 72003517) + // Standard Error: 102_713 + .saturating_add(Weight::from_parts(2_403_862, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(20_u64)) .saturating_add(T::DbWeight::get().writes(21_u64)) } @@ -130,7 +129,7 @@ impl WeightInfo for SubstrateWeight { /// Storage: `TeeWorker::Workers` (r:1 w:0) /// Proof: `TeeWorker::Workers` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// Storage: `Sminer::MinerItems` (r:1 w:1) /// Proof: `Sminer::MinerItems` (`max_values`: None, `max_size`: Some(203179), added: 205654, mode: `MaxEncodedLen`) /// Storage: `SchedulerCredit::CurrentCounters` (r:1 w:1) @@ -139,10 +138,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `TeeWorker::LastWork` (`max_values`: None, `max_size`: None, mode: `Measured`) fn calculate_report() -> Weight { // Proof Size summary in bytes: - // Measured: `5898` - // Estimated: `9292572` - // Minimum execution time: 124_194_000 picoseconds. - Weight::from_parts(157_038_000, 9292572) + // Measured: `5896` + // Estimated: `12492572` + // Minimum execution time: 111_739_000 picoseconds. + Weight::from_parts(134_085_000, 12492572) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -161,34 +160,33 @@ impl WeightInfo for SubstrateWeight { /// The range of component `v` is `[8, 30]`. fn replace_idle_space() -> Weight { // Proof Size summary in bytes: - // Measured: `4688` + // Measured: `4721` // Estimated: `206644` - // Minimum execution time: 109_706_000 picoseconds. - Weight::from_parts(135_706_783, 206644) - // Standard Error: 161_111 + // Minimum execution time: 93_598_000 picoseconds. + Weight::from_parts(127_838_388, 206644) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// Storage: `Sminer::RestoralTarget` (r:12 w:0) /// Proof: `Sminer::RestoralTarget` (`max_values`: None, `max_size`: Some(116), added: 2591, mode: `MaxEncodedLen`) /// Storage: `Sminer::MinerItems` (r:12 w:12) /// Proof: `Sminer::MinerItems` (`max_values`: None, `max_size`: Some(203179), added: 205654, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:1) /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `FileBank::Bucket` (r:1 w:1) /// Proof: `FileBank::Bucket` (`max_values`: None, `max_size`: Some(32033158), added: 32035633, mode: `MaxEncodedLen`) /// Storage: `FileBank::UserHoldFileList` (r:1 w:1) - /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(40000052), added: 40002527, mode: `MaxEncodedLen`) + /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(72000052), added: 72002527, mode: `MaxEncodedLen`) fn delete_file() -> Weight { // Proof Size summary in bytes: - // Measured: `41009` - // Estimated: `40003517` - // Minimum execution time: 360_656_000 picoseconds. - Weight::from_parts(470_737_000, 40003517) + // Measured: `41192` + // Estimated: `72003517` + // Minimum execution time: 313_412_000 picoseconds. + Weight::from_parts(342_840_000, 72003517) .saturating_add(T::DbWeight::get().reads(29_u64)) .saturating_add(T::DbWeight::get().writes(17_u64)) } @@ -198,10 +196,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `FileBank::UserBucketList` (`max_values`: None, `max_size`: Some(64050), added: 66525, mode: `MaxEncodedLen`) fn create_bucket() -> Weight { // Proof Size summary in bytes: - // Measured: `180` + // Measured: `175` // Estimated: `32036623` - // Minimum execution time: 19_414_000 picoseconds. - Weight::from_parts(20_234_000, 32036623) + // Minimum execution time: 23_136_000 picoseconds. + Weight::from_parts(23_895_000, 32036623) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -211,23 +209,23 @@ impl WeightInfo for SubstrateWeight { /// Proof: `FileBank::UserBucketList` (`max_values`: None, `max_size`: Some(64050), added: 66525, mode: `MaxEncodedLen`) fn delete_bucket() -> Weight { // Proof Size summary in bytes: - // Measured: `403` + // Measured: `398` // Estimated: `32036623` - // Minimum execution time: 24_268_000 picoseconds. - Weight::from_parts(24_934_000, 32036623) + // Minimum execution time: 19_279_000 picoseconds. + Weight::from_parts(19_772_000, 32036623) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `FileBank::RestoralOrder` (r:1 w:1) /// Proof: `FileBank::RestoralOrder` (`max_values`: None, `max_size`: Some(284), added: 2759, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) fn generate_restoral_order() -> Weight { // Proof Size summary in bytes: - // Measured: `1759` - // Estimated: `9292572` - // Minimum execution time: 44_623_000 picoseconds. - Weight::from_parts(57_460_000, 9292572) + // Measured: `1757` + // Estimated: `12492572` + // Minimum execution time: 37_904_000 picoseconds. + Weight::from_parts(43_099_000, 12492572) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -237,10 +235,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `FileBank::RestoralOrder` (`max_values`: None, `max_size`: Some(284), added: 2759, mode: `MaxEncodedLen`) fn claim_restoral_order() -> Weight { // Proof Size summary in bytes: - // Measured: `4376` + // Measured: `4371` // Estimated: `206644` - // Minimum execution time: 46_358_000 picoseconds. - Weight::from_parts(62_091_000, 206644) + // Minimum execution time: 36_747_000 picoseconds. + Weight::from_parts(40_101_000, 206644) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -251,13 +249,13 @@ impl WeightInfo for SubstrateWeight { /// Storage: `Sminer::RestoralTarget` (r:1 w:0) /// Proof: `Sminer::RestoralTarget` (`max_values`: None, `max_size`: Some(116), added: 2591, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) fn claim_restoral_noexist_order() -> Weight { // Proof Size summary in bytes: - // Measured: `5610` - // Estimated: `9292572` - // Minimum execution time: 56_499_000 picoseconds. - Weight::from_parts(70_522_000, 9292572) + // Measured: `5608` + // Estimated: `12492572` + // Minimum execution time: 47_926_000 picoseconds. + Weight::from_parts(60_855_000, 12492572) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -266,37 +264,20 @@ impl WeightInfo for SubstrateWeight { /// Storage: `FileBank::RestoralOrder` (r:1 w:1) /// Proof: `FileBank::RestoralOrder` (`max_values`: None, `max_size`: Some(284), added: 2759, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// Storage: `Sminer::PendingReplacements` (r:1 w:1) /// Proof: `Sminer::PendingReplacements` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) /// Storage: `Sminer::RestoralTarget` (r:1 w:0) /// Proof: `Sminer::RestoralTarget` (`max_values`: None, `max_size`: Some(116), added: 2591, mode: `MaxEncodedLen`) fn restoral_order_complete() -> Weight { // Proof Size summary in bytes: - // Measured: `9249` - // Estimated: `9292572` - // Minimum execution time: 104_003_000 picoseconds. - Weight::from_parts(127_926_000, 9292572) + // Measured: `9247` + // Estimated: `12492572` + // Minimum execution time: 83_862_000 picoseconds. + Weight::from_parts(92_463_000, 12492572) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) - /// Storage: `FileBank::Bucket` (r:2 w:2) - /// Proof: `FileBank::Bucket` (`max_values`: None, `max_size`: Some(32033158), added: 32035633, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:2 w:2) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) - /// Storage: `FileBank::UserHoldFileList` (r:2 w:2) - /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(40000052), added: 40002527, mode: `MaxEncodedLen`) - fn ownership_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `2609` - // Estimated: `80006044` - // Minimum execution time: 89_104_000 picoseconds. - Weight::from_parts(106_946_000, 80006044) - .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(7_u64)) - } } // For backwards compatibility and tests. @@ -315,39 +296,39 @@ impl WeightInfo for () { /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) fn cert_idle_space() -> Weight { // Proof Size summary in bytes: - // Measured: `4088` + // Measured: `4154` // Estimated: `206644` - // Minimum execution time: 100_224_000 picoseconds. - Weight::from_parts(141_159_000, 206644) + // Minimum execution time: 79_859_000 picoseconds. + Weight::from_parts(97_178_000, 206644) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: `FileBank::File` (r:1 w:0) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `FileBank::DealMap` (r:0 w:1) - /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833655), added: 836130, mode: `MaxEncodedLen`) + /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833719), added: 836194, mode: `MaxEncodedLen`) /// The range of component `v` is `[1, 30]`. fn upload_declaration(v: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `530` - // Estimated: `9292572` - // Minimum execution time: 32_363_000 picoseconds. - Weight::from_parts(40_900_937, 9292572) - // Standard Error: 88_475 - .saturating_add(Weight::from_parts(1_750_349, 0).saturating_mul(v.into())) + // Measured: `707` + // Estimated: `12492572` + // Minimum execution time: 28_071_000 picoseconds. + Weight::from_parts(30_658_375, 12492572) + // Standard Error: 53_614 + .saturating_add(Weight::from_parts(1_036_572, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Sminer::MinerItems` (r:1 w:1) /// Proof: `Sminer::MinerItems` (`max_values`: None, `max_size`: Some(203179), added: 205654, mode: `MaxEncodedLen`) /// Storage: `FileBank::DealMap` (r:1 w:1) - /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833655), added: 836130, mode: `MaxEncodedLen`) + /// Proof: `FileBank::DealMap` (`max_values`: None, `max_size`: Some(833719), added: 836194, mode: `MaxEncodedLen`) /// Storage: `Sminer::PendingReplacements` (r:12 w:12) /// Proof: `Sminer::PendingReplacements` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:1) /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:1) @@ -357,18 +338,18 @@ impl WeightInfo for () { /// Storage: `FileBank::UserBucketList` (r:1 w:1) /// Proof: `FileBank::UserBucketList` (`max_values`: None, `max_size`: Some(64050), added: 66525, mode: `MaxEncodedLen`) /// Storage: `FileBank::UserHoldFileList` (r:1 w:1) - /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(40000052), added: 40002527, mode: `MaxEncodedLen`) + /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(72000052), added: 72002527, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:0 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// The range of component `v` is `[1, 30]`. fn transfer_report(v: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `4816 + v * (833 ±0)` - // Estimated: `40003517` - // Minimum execution time: 132_079_000 picoseconds. - Weight::from_parts(160_182_023, 40003517) - // Standard Error: 159_673 - .saturating_add(Weight::from_parts(2_559_055, 0).saturating_mul(v.into())) + // Measured: `4996 + v * (833 ±0)` + // Estimated: `72003517` + // Minimum execution time: 111_060_000 picoseconds. + Weight::from_parts(125_282_482, 72003517) + // Standard Error: 102_713 + .saturating_add(Weight::from_parts(2_403_862, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(20_u64)) .saturating_add(RocksDbWeight::get().writes(21_u64)) } @@ -377,7 +358,7 @@ impl WeightInfo for () { /// Storage: `TeeWorker::Workers` (r:1 w:0) /// Proof: `TeeWorker::Workers` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// Storage: `Sminer::MinerItems` (r:1 w:1) /// Proof: `Sminer::MinerItems` (`max_values`: None, `max_size`: Some(203179), added: 205654, mode: `MaxEncodedLen`) /// Storage: `SchedulerCredit::CurrentCounters` (r:1 w:1) @@ -386,10 +367,10 @@ impl WeightInfo for () { /// Proof: `TeeWorker::LastWork` (`max_values`: None, `max_size`: None, mode: `Measured`) fn calculate_report() -> Weight { // Proof Size summary in bytes: - // Measured: `5898` - // Estimated: `9292572` - // Minimum execution time: 124_194_000 picoseconds. - Weight::from_parts(157_038_000, 9292572) + // Measured: `5896` + // Estimated: `12492572` + // Minimum execution time: 111_739_000 picoseconds. + Weight::from_parts(134_085_000, 12492572) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -408,34 +389,33 @@ impl WeightInfo for () { /// The range of component `v` is `[8, 30]`. fn replace_idle_space() -> Weight { // Proof Size summary in bytes: - // Measured: `4688` + // Measured: `4721` // Estimated: `206644` - // Minimum execution time: 109_706_000 picoseconds. - Weight::from_parts(135_706_783, 206644) - // Standard Error: 161_111 + // Minimum execution time: 93_598_000 picoseconds. + Weight::from_parts(127_838_388, 206644) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// Storage: `Sminer::RestoralTarget` (r:12 w:0) /// Proof: `Sminer::RestoralTarget` (`max_values`: None, `max_size`: Some(116), added: 2591, mode: `MaxEncodedLen`) /// Storage: `Sminer::MinerItems` (r:12 w:12) /// Proof: `Sminer::MinerItems` (`max_values`: None, `max_size`: Some(203179), added: 205654, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:1) /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `FileBank::Bucket` (r:1 w:1) /// Proof: `FileBank::Bucket` (`max_values`: None, `max_size`: Some(32033158), added: 32035633, mode: `MaxEncodedLen`) /// Storage: `FileBank::UserHoldFileList` (r:1 w:1) - /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(40000052), added: 40002527, mode: `MaxEncodedLen`) + /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(72000052), added: 72002527, mode: `MaxEncodedLen`) fn delete_file() -> Weight { // Proof Size summary in bytes: - // Measured: `41009` - // Estimated: `40003517` - // Minimum execution time: 360_656_000 picoseconds. - Weight::from_parts(470_737_000, 40003517) + // Measured: `41192` + // Estimated: `72003517` + // Minimum execution time: 313_412_000 picoseconds. + Weight::from_parts(342_840_000, 72003517) .saturating_add(RocksDbWeight::get().reads(29_u64)) .saturating_add(RocksDbWeight::get().writes(17_u64)) } @@ -445,10 +425,10 @@ impl WeightInfo for () { /// Proof: `FileBank::UserBucketList` (`max_values`: None, `max_size`: Some(64050), added: 66525, mode: `MaxEncodedLen`) fn create_bucket() -> Weight { // Proof Size summary in bytes: - // Measured: `180` + // Measured: `175` // Estimated: `32036623` - // Minimum execution time: 19_414_000 picoseconds. - Weight::from_parts(20_234_000, 32036623) + // Minimum execution time: 23_136_000 picoseconds. + Weight::from_parts(23_895_000, 32036623) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -458,23 +438,23 @@ impl WeightInfo for () { /// Proof: `FileBank::UserBucketList` (`max_values`: None, `max_size`: Some(64050), added: 66525, mode: `MaxEncodedLen`) fn delete_bucket() -> Weight { // Proof Size summary in bytes: - // Measured: `403` + // Measured: `398` // Estimated: `32036623` - // Minimum execution time: 24_268_000 picoseconds. - Weight::from_parts(24_934_000, 32036623) + // Minimum execution time: 19_279_000 picoseconds. + Weight::from_parts(19_772_000, 32036623) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `FileBank::RestoralOrder` (r:1 w:1) /// Proof: `FileBank::RestoralOrder` (`max_values`: None, `max_size`: Some(284), added: 2759, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) fn generate_restoral_order() -> Weight { // Proof Size summary in bytes: - // Measured: `1759` - // Estimated: `9292572` - // Minimum execution time: 44_623_000 picoseconds. - Weight::from_parts(57_460_000, 9292572) + // Measured: `1757` + // Estimated: `12492572` + // Minimum execution time: 37_904_000 picoseconds. + Weight::from_parts(43_099_000, 12492572) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -484,10 +464,10 @@ impl WeightInfo for () { /// Proof: `FileBank::RestoralOrder` (`max_values`: None, `max_size`: Some(284), added: 2759, mode: `MaxEncodedLen`) fn claim_restoral_order() -> Weight { // Proof Size summary in bytes: - // Measured: `4376` + // Measured: `4371` // Estimated: `206644` - // Minimum execution time: 46_358_000 picoseconds. - Weight::from_parts(62_091_000, 206644) + // Minimum execution time: 36_747_000 picoseconds. + Weight::from_parts(40_101_000, 206644) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -498,13 +478,13 @@ impl WeightInfo for () { /// Storage: `Sminer::RestoralTarget` (r:1 w:0) /// Proof: `Sminer::RestoralTarget` (`max_values`: None, `max_size`: Some(116), added: 2591, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) fn claim_restoral_noexist_order() -> Weight { // Proof Size summary in bytes: - // Measured: `5610` - // Estimated: `9292572` - // Minimum execution time: 56_499_000 picoseconds. - Weight::from_parts(70_522_000, 9292572) + // Measured: `5608` + // Estimated: `12492572` + // Minimum execution time: 47_926_000 picoseconds. + Weight::from_parts(60_855_000, 12492572) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -513,35 +493,18 @@ impl WeightInfo for () { /// Storage: `FileBank::RestoralOrder` (r:1 w:1) /// Proof: `FileBank::RestoralOrder` (`max_values`: None, `max_size`: Some(284), added: 2759, mode: `MaxEncodedLen`) /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) + /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(12489107), added: 12491582, mode: `MaxEncodedLen`) /// Storage: `Sminer::PendingReplacements` (r:1 w:1) /// Proof: `Sminer::PendingReplacements` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) /// Storage: `Sminer::RestoralTarget` (r:1 w:0) /// Proof: `Sminer::RestoralTarget` (`max_values`: None, `max_size`: Some(116), added: 2591, mode: `MaxEncodedLen`) fn restoral_order_complete() -> Weight { // Proof Size summary in bytes: - // Measured: `9249` - // Estimated: `9292572` - // Minimum execution time: 104_003_000 picoseconds. - Weight::from_parts(127_926_000, 9292572) + // Measured: `9247` + // Estimated: `12492572` + // Minimum execution time: 83_862_000 picoseconds. + Weight::from_parts(92_463_000, 12492572) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: `FileBank::File` (r:1 w:1) - /// Proof: `FileBank::File` (`max_values`: None, `max_size`: Some(9289107), added: 9291582, mode: `MaxEncodedLen`) - /// Storage: `FileBank::Bucket` (r:2 w:2) - /// Proof: `FileBank::Bucket` (`max_values`: None, `max_size`: Some(32033158), added: 32035633, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:2 w:2) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) - /// Storage: `FileBank::UserHoldFileList` (r:2 w:2) - /// Proof: `FileBank::UserHoldFileList` (`max_values`: None, `max_size`: Some(40000052), added: 40002527, mode: `MaxEncodedLen`) - fn ownership_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `2609` - // Estimated: `80006044` - // Minimum execution time: 89_104_000 picoseconds. - Weight::from_parts(106_946_000, 80006044) - .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(7_u64)) - } } diff --git a/pallets/sminer/src/helper.rs b/pallets/sminer/src/helper.rs index ffbb99ea..fb52caa4 100644 --- a/pallets/sminer/src/helper.rs +++ b/pallets/sminer/src/helper.rs @@ -161,8 +161,6 @@ impl Pallet { pub(super) fn calculate_miner_reward( miner: &AccountOf, ) -> DispatchResult { - let now = frame_system::Pallet::::block_number(); - let one_day = T::OneDayBlock::get(); let order_list = >::mutate(&miner, |snap_shot_list| -> Result, BlockNumberFor>>, DispatchError> { if snap_shot_list.len() == 0 { return Ok(Default::default()); diff --git a/pallets/sminer/src/lib.rs b/pallets/sminer/src/lib.rs index cb125de2..a28bd817 100644 --- a/pallets/sminer/src/lib.rs +++ b/pallets/sminer/src/lib.rs @@ -35,7 +35,7 @@ use sp_runtime::traits::Zero; use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AccountIdConversion, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, Dispatchable, SaturatedConversion}, + traits::{AccountIdConversion, CheckedAdd, CheckedSub, CheckedMul, Dispatchable, SaturatedConversion}, RuntimeDebug, Perbill }; use sp_staking::StakingInterface; diff --git a/pallets/staking/src/pallet/impls.rs b/pallets/staking/src/pallet/impls.rs index fbf29aab..13c346fb 100755 --- a/pallets/staking/src/pallet/impls.rs +++ b/pallets/staking/src/pallet/impls.rs @@ -28,15 +28,15 @@ use frame_support::{ pallet_prelude::*, traits::{ Currency, Defensive, DefensiveSaturating, EstimateNextNewSession, Get, Imbalance, - InspectLockableCurrency, Len, OnUnbalanced, TryCollect, UnixTime, + InspectLockableCurrency, Len, OnUnbalanced, TryCollect, }, weights::Weight, }; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use pallet_session::historical; use sp_runtime::{ - traits::{Bounded, Convert, One, SaturatedConversion, Saturating, StaticLookup, Zero}, - Perbill, Percent, + traits::{Bounded, Convert, One, Saturating, StaticLookup, Zero}, + Perbill, }; use sp_staking::{ currency_to_vote::CurrencyToVote, @@ -49,7 +49,7 @@ use sp_std::prelude::*; use crate::{ election_size_tracker::StaticTracker, log, slashing, weights::WeightInfo, ActiveEraInfo, - BalanceOf, EraInfo, EraPayout, Exposure, ExposureOf, Forcing, IndividualExposure, + BalanceOf, EraInfo, Exposure, ExposureOf, Forcing, IndividualExposure, LedgerIntegrityState, MaxNominationsOf, MaxWinnersOf, Nominations, NominationsQuota, PositiveImbalanceOf, RewardDestination, SessionInterface, StakingLedger, ValidatorPrefs, }; @@ -533,7 +533,7 @@ impl Pallet { /// Compute payout for era. fn end_era(active_era: ActiveEraInfo, _session_index: SessionIndex) { // Note: active_era_start can be None if end era is called during genesis config. - if let Some(active_era_start) = active_era.start { + if let Some(_active_era_start) = active_era.start { let (validator_payout, sminer_payout) = Self::rewards_in_era(active_era.index); Self::deposit_event(Event::::EraPaid { diff --git a/pallets/storage-handler/src/benchmarking.rs b/pallets/storage-handler/src/benchmarking.rs index ba2bf7eb..6827b5c9 100644 --- a/pallets/storage-handler/src/benchmarking.rs +++ b/pallets/storage-handler/src/benchmarking.rs @@ -14,48 +14,174 @@ pub fn increase_idle_space(space: u128) { } benchmarks! { - buy_space { + mint_territory { let caller: AccountOf = account("user1", 100, SEED); let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); T::Currency::make_free_balance_be(&caller, free); increase_idle_space::(100 * G_BYTE); - }: _(RawOrigin::Signed(caller.clone()), 10) + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + }: _(RawOrigin::Signed(caller.clone()), 10, terr_name.clone()) verify { - assert!(>::contains_key(&caller)) + assert!(>::contains_key(&caller, &terr_name)) } - expansion_space { + expanding_territory { let caller: AccountOf = account("user1", 100, SEED); let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); T::Currency::make_free_balance_be(&caller, free); increase_idle_space::(100 * G_BYTE); - StorageHandler::::buy_space(RawOrigin::Signed(caller.clone()).into(), 10)?; - }: _(RawOrigin::Signed(caller.clone()), 10) + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone(), 10) verify { - assert!(>::contains_key(&caller)); - let user_owned_space_info = >::try_get(&caller).unwrap(); - assert_eq!(user_owned_space_info.total_space, 20 * G_BYTE) + assert!(>::contains_key(&caller, &terr_name)); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + assert_eq!(territory_info.total_space, 20 * G_BYTE); + assert!(>::contains_key(&territory_info.token)); } - renewal_space { + renewal_territory { let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); T::Currency::make_free_balance_be(&caller, free); increase_idle_space::(100 * G_BYTE); - StorageHandler::::buy_space(RawOrigin::Signed(caller.clone()).into(), 10)?; - }: _(RawOrigin::Signed(caller.clone()), 10) + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone(), 10) verify { - assert!(>::contains_key(&caller)); - let user_owned_space_info = >::try_get(&caller).unwrap(); - assert_eq!(user_owned_space_info.deadline, (40u32 * 14400u32).saturated_into()) + assert!(>::contains_key(&caller, &terr_name)); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + assert_eq!(territory_info.deadline, (40u32 * 14400u32).saturated_into()); + } + + treeitory_consignment { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let price: BalanceOf = 100_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone(), price) + verify { + assert!(>::contains_key(&caller, &terr_name)); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + assert!(>::contains_key(&territory_info.token)); + assert_eq!(territory_info.state, TerritoryState::OnConsignment); + } + + buy_consignment { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let price: BalanceOf = 100_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + StorageHandler::::treeitory_consignment(RawOrigin::Signed(caller.clone()).into(), terr_name.clone(), price)?; + let buyer: AccountOf = account("user2", 100, SEED); + T::Currency::make_free_balance_be(&buyer, free); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + }: _(RawOrigin::Signed(buyer.clone()), territory_info.token.clone(), terr_name.clone()) + verify { + assert!(>::contains_key(&territory_info.token)); + let consignment_info = >::try_get(&territory_info.token).unwrap(); + assert!(consignment_info.locked); + } + + exec_consignment { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let price: BalanceOf = 100_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + StorageHandler::::treeitory_consignment(RawOrigin::Signed(caller.clone()).into(), terr_name.clone(), price)?; + let buyer: AccountOf = account("user2", 100, SEED); + T::Currency::make_free_balance_be(&buyer, free); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + StorageHandler::::buy_consignment(RawOrigin::Signed(buyer.clone()).into(), territory_info.token.clone(), terr_name.clone())?; + }: _(RawOrigin::Root, territory_info.token.clone(), terr_name.clone()) + verify { + assert!(>::contains_key(&buyer, &terr_name)) + } + + cancel_consignment { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let price: BalanceOf = 100_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + StorageHandler::::treeitory_consignment(RawOrigin::Signed(caller.clone()).into(), terr_name.clone(), price)?; + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone()) + verify { + assert!(!>::contains_key(&territory_info.token)) + } + + cancel_purchase_action { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let price: BalanceOf = 100_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + StorageHandler::::treeitory_consignment(RawOrigin::Signed(caller.clone()).into(), terr_name.clone(), price)?; + let buyer: AccountOf = account("user2", 100, SEED); + T::Currency::make_free_balance_be(&buyer, free); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + StorageHandler::::buy_consignment(RawOrigin::Signed(buyer.clone()).into(), territory_info.token.clone(), terr_name.clone())?; + let consignment_info = >::try_get(&territory_info.token).unwrap(); + assert!(consignment_info.locked); + }: _(RawOrigin::Signed(buyer.clone()), territory_info.token.clone()) + verify { + let consignment_info = >::try_get(&territory_info.token).unwrap(); + assert!(!consignment_info.locked); + } + + territory_grants { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let receiver: AccountOf = account("user2", 100, SEED); + assert!(>::contains_key(&caller, &terr_name)); + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone(), receiver.clone()) + verify { + let tname: TerrName = territory_info.token.0.to_vec().try_into().unwrap(); + assert!(!>::contains_key(&caller, &terr_name)); + assert!(>::contains_key(&receiver, &tname)); + } + + territory_rename { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + let new_name: TerrName = "t2".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + assert!(>::contains_key(&caller, &terr_name)); + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone(), new_name.clone()) + verify { + assert!(!>::contains_key(&caller, &terr_name)); + assert!(>::contains_key(&caller, &new_name)); } create_order { let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); T::Currency::make_free_balance_be(&caller, free); increase_idle_space::(100 * G_BYTE); - }: _(RawOrigin::Signed(caller.clone()), caller.clone(), OrderType::Buy, 1, 1, 1) + }: _(RawOrigin::Signed(caller.clone()), caller.clone(), terr_name.clone(), OrderType::Buy, 1, 1, 1) verify { let event = frame_system::pallet::Pallet::::events().pop().unwrap(); log::info!("event: {:?}", event.event); @@ -63,17 +189,39 @@ benchmarks! { exec_order { let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); T::Currency::make_free_balance_be(&caller, free); increase_idle_space::(100 * G_BYTE); - StorageHandler::::create_order(RawOrigin::Signed(caller.clone()).into(), caller.clone(), OrderType::Buy, 1, 1, 1)?; + StorageHandler::::create_order(RawOrigin::Signed(caller.clone()).into(), caller.clone(), terr_name.clone(), OrderType::Buy, 1, 1, 1)?; let mut order_id: BoundedVec> = Default::default(); for (key, value) in >::iter() { order_id = key } }: _(RawOrigin::Signed(caller.clone()), order_id) verify { - assert!(>::contains_key(&caller)); + assert!(>::contains_key(&caller, &terr_name)); + } + + reactivate_territory { + let caller: AccountOf = account("user1", 100, SEED); + let terr_name: TerrName = "t1".as_bytes().to_vec().try_into().map_err(|_| "boundedvec error")?; + let free: BalanceOf = 365_000_000_000_000_000_000_000u128.try_into().map_err(|_| "tryinto error!").expect("tryinto error!"); + T::Currency::make_free_balance_be(&caller, free); + increase_idle_space::(100 * G_BYTE); + StorageHandler::::mint_territory(RawOrigin::Signed(caller.clone()).into(), 10, terr_name.clone())?; + >::try_mutate(&caller, &terr_name, |territory_info_opt| -> DispatchResult { + let territory_info = territory_info_opt.as_mut().unwrap(); + territory_info.state = TerritoryState::Expired; + >::remove(territory_info.deadline, territory_info.token); + Ok(()) + }).map_err(|_| "reactivate_territory: try mutate erro")?; + }: _(RawOrigin::Signed(caller.clone()), terr_name.clone(), 10) + verify { + let territory_info = >::try_get(&caller, &terr_name).unwrap(); + assert_eq!(territory_info.state, TerritoryState::Active); } + + } diff --git a/pallets/storage-handler/src/impls.rs b/pallets/storage-handler/src/impls.rs new file mode 100644 index 00000000..70342985 --- /dev/null +++ b/pallets/storage-handler/src/impls.rs @@ -0,0 +1,144 @@ +use super::*; + +pub trait StorageHandle { + fn check_territry_owner(acc: &AccountId, name: &TerrName) -> DispatchResult; + fn add_territory_used_space(acc: &AccountId, name: &TerrName, size: u128) -> DispatchResult; + fn sub_territory_used_space(acc: &AccountId, name: &TerrName, size: u128) -> DispatchResult; + fn add_total_idle_space(increment: u128) -> DispatchResult; + fn sub_total_idle_space(decrement: u128) -> DispatchResult; + fn add_total_service_space(increment: u128) -> DispatchResult; + fn sub_total_service_space(decrement: u128) -> DispatchResult; + fn get_total_idle_space() -> u128; + fn get_total_service_space() -> u128; + fn get_avail_space() -> Result; + fn lock_user_space(acc: &AccountId, name: &TerrName, needed_space: u128) -> DispatchResult; + fn unlock_user_space(acc: &AccountId, name: &TerrName, needed_space: u128) -> DispatchResult; + fn unlock_and_used_user_space(acc: &AccountId, name: &TerrName, needed_space: u128) -> DispatchResult; + fn get_user_avail_space(acc: &AccountId, name: &TerrName) -> Result; + fn frozen_task() -> (Weight, Vec<(AccountId, TerrName)>); +} + +impl StorageHandle for Pallet { + fn check_territry_owner(acc: &T::AccountId, name: &TerrName) -> DispatchResult { + ensure!(>::contains_key(acc, name), Error::::NotHaveTerritory); + + Ok(()) + } + // fn update_user_space(acc: &T::AccountId, opeartion: u8, size: u128) -> DispatchResult { + // Pallet::::update_user_space(acc, opeartion, size) + // } + fn add_territory_used_space(acc: &T::AccountId, name: &TerrName, size: u128) -> DispatchResult { + >::try_mutate(acc, name, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + ensure!(t.state == TerritoryState::Active, Error::::NotActive); + ensure!(size <= t.remaining_space, Error::::InsufficientStorage); + t.used_space = + t.used_space.checked_add(size).ok_or(Error::::Overflow)?; + t.remaining_space = + t.remaining_space.checked_sub(size).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn sub_territory_used_space(acc: &T::AccountId, name: &TerrName, size: u128) -> DispatchResult { + >::try_mutate(acc, name, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + t.used_space = t.used_space.checked_sub(size).ok_or(Error::::Overflow)?; + t.remaining_space = + t.remaining_space.checked_add(size).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn add_total_idle_space(increment: u128) -> DispatchResult { + TotalIdleSpace::::try_mutate(|total_power| -> DispatchResult { + *total_power = total_power.checked_add(increment).ok_or(Error::::Overflow)?; + Ok(()) + }) //read 1 write 1 + } + + fn sub_total_idle_space(decrement: u128) -> DispatchResult { + TotalIdleSpace::::try_mutate(|total_power| -> DispatchResult { + *total_power = total_power.checked_sub(decrement).ok_or(Error::::Overflow)?; + Ok(()) + }) //read 1 write 1 + } + + fn add_total_service_space(increment: u128) -> DispatchResult { + TotalServiceSpace::::try_mutate(|total_space| -> DispatchResult { + *total_space = total_space.checked_add(increment).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn sub_total_service_space(decrement: u128) -> DispatchResult { + TotalServiceSpace::::try_mutate(|total_space| -> DispatchResult { + *total_space = total_space.checked_sub(decrement).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn get_avail_space() -> Result { + let purchased_space = >::get(); + let total_space = >::get().checked_add(>::get()).ok_or(Error::::Overflow)?; + //If the total space on the current chain is less than the purchased space, 0 will be + // returned. + if total_space < purchased_space { + return Ok(0); + } + //Calculate available space. + let value = total_space.checked_sub(purchased_space).ok_or(Error::::Overflow)?; + + Ok(value) + } + + // fn get_total_space() -> Result { + // Pallet::::get_total_space() + // } + + fn lock_user_space(acc: &T::AccountId, name: &TerrName, needed_space: u128) -> DispatchResult { + >::try_mutate(acc, name, |storage_space_opt| -> DispatchResult { + let storage_space = storage_space_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + ensure!(storage_space.state == TerritoryState::Active, Error::::NotActive); + ensure!(storage_space.remaining_space >= needed_space, Error::::InsufficientStorage); + storage_space.locked_space = storage_space.locked_space.checked_add(needed_space).ok_or(Error::::Overflow)?; + storage_space.remaining_space = storage_space.remaining_space.checked_sub(needed_space).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn unlock_user_space(acc: &T::AccountId, name: &TerrName, needed_space: u128) -> DispatchResult { + >::try_mutate(acc, name, |storage_space_opt| -> DispatchResult { + let storage_space = storage_space_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + storage_space.locked_space = storage_space.locked_space.checked_sub(needed_space).ok_or(Error::::Overflow)?; + storage_space.remaining_space = storage_space.remaining_space.checked_add(needed_space).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn unlock_and_used_user_space(acc: &T::AccountId, name: &TerrName, needed_space: u128) -> DispatchResult { + >::try_mutate(acc, name, |storage_space_opt| -> DispatchResult { + let storage_space = storage_space_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + storage_space.locked_space = storage_space.locked_space.checked_sub(needed_space).ok_or(Error::::Overflow)?; + storage_space.used_space = storage_space.used_space.checked_add(needed_space).ok_or(Error::::Overflow)?; + Ok(()) + }) + } + + fn get_user_avail_space(acc: &T::AccountId, name: &TerrName) -> Result { + let info = >::try_get(acc, name).map_err(|_e| Error::::NotHaveTerritory)?; + Ok(info.remaining_space) + } + + fn frozen_task() -> (Weight, Vec<(AccountOf, TerrName)>) { + Self::frozen_task() + } + + fn get_total_idle_space() -> u128 { + >::get() + } + + fn get_total_service_space() -> u128 { + >::get() + } +} \ No newline at end of file diff --git a/pallets/storage-handler/src/lib.rs b/pallets/storage-handler/src/lib.rs index bfa8b062..f366233e 100644 --- a/pallets/storage-handler/src/lib.rs +++ b/pallets/storage-handler/src/lib.rs @@ -5,17 +5,20 @@ use frame_system::{ pallet_prelude::*, }; use frame_support::{ + dispatch::{Parameter}, Blake2_128Concat, PalletId, weights::Weight, ensure, transactional, storage::bounded_vec::BoundedVec, traits::{ - StorageVersion, Currency, ReservableCurrency, Randomness, + StorageVersion, Currency, ReservableCurrency, Randomness, ExistenceRequirement::KeepAlive, + schedule::v3::{Named as ScheduleNamed}, + schedule, schedule::DispatchTime, QueryPreimage, StorePreimage, }, pallet_prelude::*, }; use sp_runtime::{ traits::{ CheckedAdd, CheckedMul, CheckedDiv, CheckedSub, - SaturatedConversion, + SaturatedConversion, Dispatchable, }, RuntimeDebug, }; @@ -36,6 +39,9 @@ pub mod benchmarking; mod types; use types::*; +pub mod impls; +pub use impls::*; + pub use pallet::*; pub const SPACE_NORMAL: &str = "normal"; @@ -62,6 +68,17 @@ pub mod pallet { type WeightInfo: WeightInfo; + type FScheduler: ScheduleNamed< + BlockNumberFor, + Self::SProposal, + Self::PalletsOrigin, + Hasher = Self::Hashing, + >; + + type SProposal: Parameter + Dispatchable + From>; + + type PalletsOrigin: From>; + #[pallet::constant] type OneDay: Get>; @@ -74,6 +91,18 @@ pub mod pallet { #[pallet::constant] type StateStringMax: Get + Clone + Eq + PartialEq; + + #[pallet::constant] + type NameLimit: Get; + + #[pallet::constant] + type FrozenLimit: Get; + + #[pallet::constant] + type ConsignmentRemainingBlock: Get>; + + #[pallet::constant] + type LockingBlock: Get>; #[pallet::constant] type FrozenDays: Get> + Clone + Eq + PartialEq; @@ -81,6 +110,9 @@ pub mod pallet { type CessTreasuryHandle: TreasuryHandle, BalanceOf>; type MyRandomness: Randomness, BlockNumberFor>; + + /// The preimage provider with which we look up call hashes to get the call. + type Preimages: QueryPreimage + StorePreimage; } #[pallet::event] @@ -100,6 +132,57 @@ pub mod pallet { CreatePayOrder { order_hash: BoundedVec> }, PaidOrder { order_hash: BoundedVec> }, + + MintTerritory { + token: H256, + name: TerrName, + storage_capacity: u128, + spend: BalanceOf, + }, + + ExpansionTerritory { + name: TerrName, + expansion_space: u128, + spend: BalanceOf, + }, + + RenewalTerritory { + name: TerrName, + days: u32, + spend: BalanceOf, + }, + + ReactivateTerritory { + name: TerrName, + days: u32, + spend: BalanceOf, + }, + + Consignment { + name: TerrName, + token: H256, + price: BalanceOf, + }, + + BuyConsignment { + name: TerrName, + token: H256, + price: BalanceOf, + }, + + CancleConsignment { + token: H256, + }, + + CancelPurchaseAction { + token: H256, + }, + + ExecConsignment { + buyer: AccountOf, + seller: AccountOf, + token: H256, + }, } #[pallet::error] @@ -134,12 +217,90 @@ pub mod pallet { NoOrder, /// Parameter error, please check the parameters. The expiration time cannot exceed one hour ParamError, + /// There is already an identical token on the chain + DuplicateTokens, + /// This user does not have this territory + NotHaveTerritory, + /// The territory is not active + NotActive, + /// The territory is not expired + NotExpire, + /// The territory is not currently on consignment + NotOnConsignment, + /// The territory does not have enough lease time remaining to allow consignment sale + InsufficientLease, + /// The current delegation already exists and cannot be created again + ConsignmentExisted, + /// It is on consignment, so it cannot be renewed + OnConsignment, + /// The current territory's state does not support this operation + StateError, + /// A territory must have nothing stored in it before it can be consigned + ObjectNotZero, + /// The delegation corresponding to the token value does not exist + NonExistentConsignment, + /// The consignment has been purchased by someone else and is locked. It cannot be purchased again. Or cancel the order + ConsignmentLocked, + /// The status of the order is abnormal and the purchase action fails + ConsignmentUnLocked, + /// Logically speaking, errors that should not occur + Unexpected, + /// Not the buyer of this consignment, no right to operate + NotBuyer, + /// This is an invalid order, Because the price can't match + InvalidOrder, } - #[pallet::storage] - #[pallet::getter(fn user_owned_space)] - pub(super) type UserOwnedSpace = - StorageMap<_, Blake2_128Concat, AccountOf, OwnedSpaceDetails>; + #[pallet::storage] + #[pallet::getter(fn territory_key)] + pub(super) type TerritoryKey = + StorageMap<_, Blake2_128Concat, H256, (AccountOf, TerrName)>; + + #[pallet::storage] + #[pallet::getter(fn territory)] + pub(super) type Territory = + StorageDoubleMap< + _, + Blake2_128Concat, + AccountOf, + Blake2_128Concat, + TerrName, + TerritoryInfo, + >; + + #[pallet::storage] + #[pallet::getter(fn consignment)] + pub(super) type Consignment = + StorageMap<_, Blake2_128Concat, H256, ConsignmentInfo>; + + #[pallet::storage] + #[pallet::getter(fn territory_frozen)] + pub(super) type TerritoryFrozen = + StorageDoubleMap< + _, + Blake2_128Concat, + BlockNumberFor, + Blake2_128Concat, + H256, + bool, + >; + + #[pallet::storage] + #[pallet::getter(fn territory_frozen_counter)] + pub(super) type TerritoryFrozenCounter = + StorageMap<_, Blake2_128Concat, BlockNumberFor, u32, ValueQuery>; + + #[pallet::storage] + #[pallet::getter(fn territory_expired)] + pub(super) type TerritoryExpired = + StorageDoubleMap< + _, + Blake2_128Concat, + BlockNumberFor, + Blake2_128Concat, + H256, + bool, + >; #[pallet::storage] #[pallet::getter(fn unit_price)] @@ -190,26 +351,32 @@ pub mod pallet { #[pallet::call] impl Pallet { - /// Buy Space - /// - /// This function allows a user to purchase storage space in the network by specifying the desired capacity in gibibytes (GiB). - /// The user's account is debited with the corresponding payment for the purchased space. - /// - /// Parameters: - /// - `origin`: The origin from which the function is called, representing the user's account. - /// - `gib_count`: The amount of storage space to purchase, specified in gibibytes (GiB). - #[pallet::call_index(0)] + #[pallet::call_index(0)] #[transactional] - #[pallet::weight(::WeightInfo::buy_space())] - pub fn buy_space(origin: OriginFor, gib_count: u32) -> DispatchResult { + #[pallet::weight(::WeightInfo::mint_territory())] + pub fn mint_territory( + origin: OriginFor, + gib_count: u32, + territory_name: TerrName, + ) -> DispatchResult { let sender = ensure_signed(origin)?; - ensure!(!>::contains_key(&sender), Error::::PurchasedSpace); + ensure!(!>::contains_key(&sender, &territory_name), Error::::PurchasedSpace); + + let now = >::block_number(); + let seed = (sender.clone(), now, territory_name.clone()); + let (random_seed, _) = + T::MyRandomness::random(&(T::RewardPalletId::get(), seed).encode()); + let token = match random_seed { + Some(random_seed) => ::decode(&mut random_seed.as_ref()).map_err(|_| Error::::RandomErr)?, + None => Default::default(), + }; + ensure!(!>::contains_key(&token), Error::::DuplicateTokens); let space = G_BYTE.checked_mul(gib_count as u128).ok_or(Error::::Overflow)?; let unit_price = >::try_get() .map_err(|_e| Error::::BugInvalid)?; - Self::add_user_purchased_space(sender.clone(), space, 30)?; + Self::storage_territory(token, sender.clone(), space, 30, territory_name.clone())?; Self::add_purchased_space(space)?; let price: BalanceOf = unit_price .checked_mul(&gib_count.saturated_into()) @@ -222,30 +389,31 @@ pub mod pallet { T::CessTreasuryHandle::send_to_sid(sender.clone(), price)?; - Self::deposit_event(Event::::BuySpace { acc: sender, storage_capacity: space, spend: price }); + Self::deposit_event(Event::::MintTerritory { + token: token, + name: territory_name, + storage_capacity: space, + spend: price, + }); + Ok(()) } - - /// Expansion of Purchased Space - /// - /// This function allows a user who has previously purchased storage space to expand their purchased space by adding more storage capacity. - /// The user specifies the desired capacity in gibibytes (GiB) for expansion. - /// - /// Parameters: - /// - `origin`: The origin from which the function is called, representing the user's account. - /// - `gib_count`: The amount of additional storage space to purchase for expansion, specified in gibibytes (GiB). + #[pallet::call_index(1)] #[transactional] - #[pallet::weight(::WeightInfo::expansion_space())] - pub fn expansion_space(origin: OriginFor, gib_count: u32) -> DispatchResult { + #[pallet::weight(::WeightInfo::expanding_territory())] + pub fn expanding_territory( + origin: OriginFor, + territory_name: TerrName, + gib_count: u32, + ) -> DispatchResult { let sender = ensure_signed(origin)?; - let cur_owned_space = >::try_get(&sender) - .map_err(|_e| Error::::NotPurchasedSpace)?; + let cur_owned_space = >::try_get(&sender, &territory_name) + .map_err(|_e| Error::::NotHaveTerritory)?; let now = >::block_number(); - ensure!(now < cur_owned_space.deadline, Error::::LeaseExpired); ensure!( - cur_owned_space.state.to_vec() != SPACE_FROZEN.as_bytes().to_vec(), - Error::::LeaseFreeze + cur_owned_space.state == TerritoryState::Active, + Error::::NotActive ); // The unit price recorded in UnitPrice is the unit price of one month. // Here, the daily unit price is calculated. @@ -280,40 +448,35 @@ pub mod pallet { Error::::InsufficientBalance ); - Self::add_purchased_space( - space, - )?; - - Self::expension_puchased_package(sender.clone(), space)?; + Self::add_purchased_space(space)?; + Self::update_territory_space(sender.clone(), territory_name.clone(), space)?; T::CessTreasuryHandle::send_to_sid(sender.clone(), price.clone())?; - Self::deposit_event(Event::::ExpansionSpace { - acc: sender, + Self::deposit_event(Event::::ExpansionTerritory { + name: territory_name, expansion_space: space, - fee: price, + spend: price, }); + Ok(()) } - /// Renewal of Purchased Space Lease - /// - /// This function allows a user who has purchased storage space to renew their lease for additional days by paying a renewal fee. The user specifies the number of days they wish to extend the lease. - /// - /// Parameters: - /// - `origin`: The origin from which the function is called, representing the user's account. - /// - `days`: The number of days for which the user wishes to renew the space lease. - #[pallet::call_index(2)] + #[pallet::call_index(2)] #[transactional] - #[pallet::weight(::WeightInfo::renewal_space())] - pub fn renewal_space(origin: OriginFor, days: u32) -> DispatchResult { - let sender = ensure_signed(origin)?; - let cur_owned_space = >::try_get(&sender) - .map_err(|_e| Error::::NotPurchasedSpace)?; + #[pallet::weight(::WeightInfo::renewal_territory())] + pub fn renewal_territory( + origin: OriginFor, + territory_name: TerrName, + days: u32, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + let cur_owned_space = >::try_get(&sender, &territory_name) + .map_err(|_e| Error::::NotHaveTerritory)?; ensure!( - cur_owned_space.state.to_vec() != SPACE_DEAD.as_bytes().to_vec(), - Error::::LeaseExpired, + cur_owned_space.state == TerritoryState::Active || cur_owned_space.state == TerritoryState::Frozen, + Error::::StateError, ); let days_unit_price = >::try_get() @@ -328,7 +491,7 @@ pub mod pallet { .ok_or(Error::::Overflow)? .try_into() .map_err(|_e| Error::::Overflow)?; - + ensure!( ::Currency::can_slash(&sender, price.clone()), Error::::InsufficientBalance @@ -336,14 +499,289 @@ pub mod pallet { T::CessTreasuryHandle::send_to_sid(sender.clone(), price.clone())?; - Self::update_puchased_package(sender.clone(), days)?; - Self::deposit_event(Event::::RenewalSpace { - acc: sender, - renewal_days: days, - fee: price, + Self::update_territory_days(sender.clone(), territory_name.clone(), days)?; + Self::deposit_event(Event::::RenewalTerritory { + name: territory_name, + days: days, + spend: price, }); Ok(()) - } + } + + #[pallet::call_index(101)] + #[transactional] + #[pallet::weight(::WeightInfo::reactivate_territory())] + pub fn reactivate_territory( + origin: OriginFor, + territory_name: TerrName, + days: u32, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + + let territory = >::try_get(&sender, &territory_name) + .map_err(|_| Error::::NotHaveTerritory)?; + + ensure!(territory.state == TerritoryState::Expired, Error::::NotExpire); + + let days_unit_price = >::try_get() + .map_err(|_e| Error::::BugInvalid)? + .checked_div(&30u32.saturated_into()) + .ok_or(Error::::Overflow)?; + + let gib_count = territory.total_space.checked_div(G_BYTE).ok_or(Error::::Overflow)?; + + let price = days_unit_price + .checked_mul(&days.saturated_into()) + .ok_or(Error::::Overflow)? + .checked_mul(&gib_count.saturated_into()) + .ok_or(Error::::Overflow)?; + ensure!( + ::Currency::can_slash(&sender, price.clone()), + Error::::InsufficientBalance + ); + + T::CessTreasuryHandle::send_to_sid(sender.clone(), price.clone())?; + + Self::add_purchased_space(territory.total_space)?; + Self::initial_territory(sender.clone(), territory_name.clone(), days)?; + + Self::deposit_event(Event::::ReactivateTerritory { + name: territory_name, + days: days, + spend: price, + }); + + Ok(()) + } + + #[pallet::call_index(102)] + #[transactional] + #[pallet::weight(::WeightInfo::treeitory_consignment())] + pub fn treeitory_consignment( + origin: OriginFor, + territory_name: TerrName, + price: BalanceOf + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + + let token = >::try_mutate(&sender, &territory_name, |t_opt| -> Result { + let t = t_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + + ensure!(t.state == TerritoryState::Active, Error::::NotActive); + ensure!(t.total_space == t.remaining_space, Error::::ObjectNotZero); + + let now = >::block_number(); + let remain_block = t.deadline.checked_sub(&now).ok_or(Error::::Overflow)?; + let limit_block = T::ConsignmentRemainingBlock::get(); + ensure!(remain_block > limit_block, Error::::InsufficientLease); + + t.state = TerritoryState::OnConsignment; + + Ok(t.token) + })?; + + ensure!(!>::contains_key(&token), Error::::ConsignmentExisted); + let consignment_info = ConsignmentInfo::{ + user: sender, + price: price, + buyers: None, + exec: None, + locked: false, + }; + >::insert(&token, consignment_info); + + Self::deposit_event(Event::::Consignment { + name: territory_name, + token: token, + price: price, + }); + + Ok(()) + } + + #[pallet::call_index(103)] + #[transactional] + #[pallet::weight(::WeightInfo::buy_consignment())] + pub fn buy_consignment( + origin: OriginFor, + token: H256, + rename: TerrName, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + + let consignment = >::try_get(&token).map_err(|_| Error::::NonExistentConsignment)?; + ensure!(!consignment.locked, Error::::ConsignmentLocked); + + >::try_mutate(&token, |c_opt| -> DispatchResult { + let c = c_opt.as_mut().ok_or(Error::::NonExistentConsignment)?; + + let now = >::block_number(); + let lock_block = T::LockingBlock::get(); + let exec_block = now.checked_add(&lock_block).ok_or(Error::::Overflow)?; + + c.buyers = Some(sender); + c.exec = Some(exec_block); + c.locked = true; + let call: ::SProposal = Call::exec_consignment{token: token.clone(), territory_name: rename.clone()}.into(); + T::FScheduler::schedule_named( + *(token.as_fixed_bytes()), + DispatchTime::At(exec_block), + Option::None, + schedule::HARD_DEADLINE, + frame_system::RawOrigin::Root.into(), + T::Preimages::bound(*Box::new( + call + ))?, + ).map_err(|_| Error::::Unexpected)?; + + Self::deposit_event(Event::::BuyConsignment { + name: rename.clone(), + token: token, + price: c.price, + }); + + Ok(()) + }) + } + + #[pallet::call_index(104)] + #[transactional] + #[pallet::weight(::WeightInfo::exec_consignment())] + pub fn exec_consignment(origin: OriginFor, token: H256, territory_name: TerrName) -> DispatchResult { + ensure_root(origin)?; + + let consignment = >::try_get(&token).map_err(|_| Error::::NonExistentConsignment)?; + let buyer = consignment.buyers.ok_or(Error::::Unexpected)?; + ensure!(consignment.locked, Error::::ConsignmentUnLocked); + ensure!( + ::Currency::can_slash(&buyer, consignment.price), + Error::::InsufficientBalance + ); + + let (holder, name) = >::try_get(&token).map_err(|_| Error::::Unexpected)?; + let mut territory = >::try_get(&holder, &name).map_err(|_| Error::::Unexpected)?; + ensure!(territory.state == TerritoryState::OnConsignment, Error::::Unexpected); + + >::remove(&holder, &name); + territory.state = TerritoryState::Active; + >::insert(&buyer, &territory_name, territory); + + >::insert(&token, (buyer.clone(), territory_name)); + >::remove(&token); + + ::Currency::transfer(&buyer, &holder, consignment.price, KeepAlive)?; + + Self::deposit_event(Event::::ExecConsignment { + buyer: buyer, + seller: holder, + token: token, + }); + + Ok(()) + } + + #[pallet::call_index(105)] + #[transactional] + #[pallet::weight(::WeightInfo::cancel_consignment())] + pub fn cancel_consignment(origin: OriginFor, territory_name: TerrName) -> DispatchResult { + let sender = ensure_signed(origin)?; + + let mut territory = >::try_get(&sender, &territory_name).map_err(|_| Error::::NotHaveTerritory)?; + ensure!(territory.state == TerritoryState::OnConsignment, Error::::NotOnConsignment); + let consignment = >::try_get(&territory.token).map_err(|_| Error::::NonExistentConsignment)?; + ensure!(!consignment.locked, Error::::ConsignmentLocked); + + >::remove(&territory.token); + territory.state = TerritoryState::Active; + >::insert(&sender, &territory_name, territory.clone()); + + Self::deposit_event(Event::::CancleConsignment {token: territory.token}); + + Ok(()) + } + + #[pallet::call_index(106)] + #[transactional] + #[pallet::weight(::WeightInfo::cancel_purchase_action())] + pub fn cancel_purchase_action(origin: OriginFor, token: H256) -> DispatchResult { + let sender = ensure_signed(origin)?; + + >::try_mutate(&token, |c_opt| -> DispatchResult { + let c = c_opt.as_mut().ok_or(Error::::NonExistentConsignment)?; + + let buyer = c.buyers.as_ref().ok_or(Error::::NotBuyer)?; + ensure!(&sender == buyer, Error::::NotBuyer); + c.buyers = None; + c.exec = None; + c.locked = false; + T::FScheduler::cancel_named(*(token.as_fixed_bytes()))?; + + Ok(()) + })?; + + Self::deposit_event(Event::::CancelPurchaseAction {token: token}); + + Ok(()) + } + + #[pallet::call_index(107)] + #[transactional] + #[pallet::weight(::WeightInfo::territory_grants())] + pub fn territory_grants( + origin: OriginFor, + territory_name: TerrName, + receiver: AccountOf, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + let territory = >::try_get(&sender, &territory_name).map_err(|_| Error::::NotHaveTerritory)?; + ensure!(territory.state == TerritoryState::Active, Error::::NotActive); + ensure!(territory.total_space == territory.remaining_space, Error::::ObjectNotZero); + let new_name: TerrName = territory.token.0.to_vec().try_into().map_err(|_| Error::::BoundedVecError)?; + >::remove(&sender, &territory_name); + >::insert( + &receiver, + &new_name, + territory.clone() + ); + >::try_mutate(&territory.token, |info_opt| -> DispatchResult { + let info = info_opt.as_mut().ok_or(Error::::Unexpected)?; + + info.0 = receiver; + info.1 = new_name; + + Ok(()) + })?; + + Ok(()) + } + + #[pallet::call_index(108)] + #[transactional] + #[pallet::weight(::WeightInfo::territory_rename())] + pub fn territory_rename( + origin: OriginFor, + old_name: TerrName, + new_name: TerrName, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + let territory = >::try_get(&sender, &old_name).map_err(|_| Error::::NotHaveTerritory)?; + ensure!(territory.state == TerritoryState::Active, Error::::NotActive); + ensure!(territory.total_space == territory.remaining_space, Error::::ObjectNotZero); + >::remove(&sender, &old_name); + >::insert( + &sender, + &new_name, + territory.clone() + ); + >::try_mutate(&territory.token, |info_opt| -> DispatchResult { + let info = info_opt.as_mut().ok_or(Error::::Unexpected)?; + info.1 = new_name; + Ok(()) + })?; + + Ok(()) + } + // FOR TEST #[pallet::call_index(4)] #[transactional] @@ -359,10 +797,10 @@ pub mod pallet { #[pallet::call_index(5)] #[transactional] #[pallet::weight(Weight::zero())] - pub fn update_user_life(origin: OriginFor, user: AccountOf, deadline: BlockNumberFor) -> DispatchResult { + pub fn update_user_territory_life(origin: OriginFor, user: AccountOf, terr_name: TerrName, deadline: BlockNumberFor) -> DispatchResult { let _ = ensure_root(origin)?; - >::try_mutate(&user, |space_opt| -> DispatchResult { + >::try_mutate(&user, &terr_name, |space_opt| -> DispatchResult { let space_info = space_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; space_info.deadline = deadline; @@ -376,7 +814,8 @@ pub mod pallet { #[pallet::weight(::WeightInfo::create_order())] pub fn create_order( origin: OriginFor, - target_acc: AccountOf, + target_acc: AccountOf, + territory_name: TerrName, order_type: OrderType, gib_count: u32, days: u32, @@ -391,18 +830,18 @@ pub mod pallet { let price = match order_type { OrderType::Buy => { - ensure!(!>::contains_key(&target_acc), Error::::PurchasedSpace); + ensure!(!>::contains_key(&target_acc, &territory_name), Error::::PurchasedSpace); let price = Self::calculate_price(gib_count, days)?; price }, OrderType::Expansion => { - let user_owned_space = >::try_get(&target_acc).map_err(|_| Error::::NotPurchasedSpace)?; + let user_owned_space = >::try_get(&target_acc, &territory_name).map_err(|_| Error::::NotHaveTerritory)?; let remain_day = Self::calculate_remain_day(user_owned_space.deadline)?; let price = Self::calculate_price(gib_count, remain_day.saturated_into())?; price }, OrderType::Renewal => { - let user_owned_space = >::try_get(&target_acc).map_err(|_| Error::::NotPurchasedSpace)?; + let user_owned_space = >::try_get(&target_acc, &territory_name).map_err(|_| Error::::NotHaveTerritory)?; let gib_count = user_owned_space.total_space.checked_div(G_BYTE).ok_or(Error::::Overflow)?; let price = Self::calculate_price(gib_count as u32, days)?; price @@ -412,6 +851,7 @@ pub mod pallet { let now = >::block_number(); let expired = now.checked_add(&expired.saturated_into()).ok_or(Error::::Overflow)?; let pay_order = OrderInfo:: { + territory_name, pay: price, gib_count: gib_count, days, @@ -447,20 +887,39 @@ pub mod pallet { ensure!(order.expired > now, Error::::OrderExpired); match order.order_type { OrderType::Buy => { - ensure!(!>::contains_key(&order.target_acc), Error::::PurchasedSpace); + ensure!(!>::contains_key(&order.target_acc, &order.territory_name), Error::::PurchasedSpace); let space = G_BYTE.checked_mul(order.gib_count as u128).ok_or(Error::::Overflow)?; - Self::add_user_purchased_space(order.target_acc, space, order.days)?; + let now = >::block_number(); + let seed = (sender.clone(), now, order.territory_name.clone()); + let (random_seed, _) = + T::MyRandomness::random(&(T::RewardPalletId::get(), seed).encode()); + let token = match random_seed { + Some(random_seed) => ::decode(&mut random_seed.as_ref()).map_err(|_| Error::::RandomErr)?, + None => Default::default(), + }; + ensure!(!>::contains_key(&token), Error::::DuplicateTokens); + Self::storage_territory(token, order.target_acc, space, order.days, order.territory_name)?; Self::add_purchased_space(space)?; }, OrderType::Expansion => { - ensure!(>::contains_key(&order.target_acc), Error::::NotPurchasedSpace); + let user_owned_space = >::try_get(&order.target_acc, &order.territory_name).map_err(|_| Error::::NotHaveTerritory)?; + let remain_day = Self::calculate_remain_day(user_owned_space.deadline)?; + let price = Self::calculate_price(order.gib_count, remain_day.saturated_into())?; + // todo! If the price becomes dynamic in the future, the judgment basis will become invalid. + // Make sure that the territory data does not change before and after the order is created. + ensure!(price == order.pay, Error::::InvalidOrder); let space = G_BYTE.checked_mul(order.gib_count as u128).ok_or(Error::::Overflow)?; Self::add_purchased_space(space)?; - Self::expension_puchased_package(order.target_acc, space)?; + Self::update_territory_space(order.target_acc, order.territory_name, space)?; }, OrderType::Renewal => { - ensure!(>::contains_key(&order.target_acc), Error::::NotPurchasedSpace); - Self::update_puchased_package(order.target_acc, order.days)?; + let user_owned_space = >::try_get(&order.target_acc, &order.territory_name).map_err(|_| Error::::NotHaveTerritory)?; + let gib_count = user_owned_space.total_space.checked_div(G_BYTE).ok_or(Error::::Overflow)?; + let price = Self::calculate_price(gib_count as u32, order.days)?; + // todo! If the price becomes dynamic in the future, the judgment basis will become invalid. + // Make sure that the territory data does not change before and after the order is created. + ensure!(price == order.pay, Error::::InvalidOrder); + Self::update_territory_days(order.target_acc, order.territory_name, order.days)?; }, }; @@ -483,22 +942,6 @@ pub mod pallet { Ok(()) } - - // FOR TESTING - #[pallet::call_index(9)] - #[pallet::weight(Weight::zero())] - pub fn clear_user_used_space(origin: OriginFor, user: AccountOf) -> DispatchResult { - let _ = ensure_root(origin)?; - - >::try_mutate(&user, |space_info_opt| -> DispatchResult { - let space_info = space_info_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - space_info.used_space = 0; - - Ok(()) - })?; - - Ok(()) - } } } @@ -533,73 +976,13 @@ impl Pallet { Ok(remain_day.into()) } - /// helper: update_puchased_package. - /// - /// How to update the corresponding data after renewing the package. - /// Currently, it only supports and defaults to one month. - /// - /// Parameters: - /// - `acc`: Account - /// - `days`: Days of renewal - fn update_puchased_package(acc: AccountOf, days: u32) -> DispatchResult { - >::try_mutate(&acc, |s_opt| -> DispatchResult { - let s = s_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - let one_day = ::OneDay::get(); - let now = >::block_number(); - let sur_block: BlockNumberFor = - one_day.checked_mul(&days.saturated_into()).ok_or(Error::::Overflow)?; - if now > s.deadline { - s.start = now; - s.deadline = now.checked_add(&sur_block).ok_or(Error::::Overflow)?; - } else { - s.deadline = s.deadline.checked_add(&sur_block).ok_or(Error::::Overflow)?; - } - - if s.deadline > now { - s.state = SPACE_NORMAL - .as_bytes() - .to_vec() - .try_into() - .map_err(|_e| Error::::BoundedVecError)?; - } - - Ok(()) - })?; - Ok(()) - } - /// helper: Expand storage space. - /// - /// Relevant data of users after updating the expansion package. - /// - /// Parameters: - /// - `space`: Size after expansion. - /// - `package_type`: New package type. - fn expension_puchased_package( - acc: AccountOf, - space: u128, - ) -> DispatchResult { - >::try_mutate(&acc, |s_opt| -> DispatchResult { - let s = s_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - s.remaining_space = s.remaining_space.checked_add(space).ok_or(Error::::Overflow)?; - s.total_space = s.total_space.checked_add(space).ok_or(Error::::Overflow)?; - Ok(()) - })?; - Ok(()) - } - /// helper: Initial purchase space initialization method. - /// - /// Purchase a package and create data corresponding to the user. - /// UserOwnedSpace Storage. - /// - /// Parameters: - /// - `space`: Buy storage space size. - /// - `month`: Month of purchase of package, It is 1 at present. - /// - `package_type`: Package type. - fn add_user_purchased_space( - acc: AccountOf, - space: u128, + fn storage_territory( + token: H256, + user: AccountOf, + space: u128, days: u32, + tname: TerrName, ) -> DispatchResult { let now = >::block_number(); let one_day = ::OneDay::get(); @@ -607,210 +990,121 @@ impl Pallet { .checked_mul(&days.saturated_into()) .ok_or(Error::::Overflow)?; let deadline = now.checked_add(&sur_block).ok_or(Error::::Overflow)?; - let info = OwnedSpaceDetails:: { + + let info = TerritoryInfo:: { + token: token.clone(), total_space: space, - used_space: 0, + used_space: u128::MIN, locked_space: u128::MIN, remaining_space: space, start: now, deadline, - state: SPACE_NORMAL - .as_bytes() - .to_vec() - .try_into() - .map_err(|_e| Error::::BoundedVecError)?, + state: TerritoryState::Active, }; - >::insert(&acc, info); - Ok(()) - } - - /// helper: update user storage space. - /// - /// Modify the corresponding data after the user uploads the file or deletes the file - /// Modify used_space, remaining_space - /// operation = 1, add used_space - /// operation = 2, sub used_space - /// - /// Parameters: - /// - `operation`: operation type 1 or 2. - /// - `size`: file size. - fn update_user_space(acc: &AccountOf, operation: u8, size: u128) -> DispatchResult { - match operation { - 1 => { - >::try_mutate(acc, |s_opt| -> DispatchResult { - let s = s_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - if s.state.to_vec() == SPACE_FROZEN.as_bytes().to_vec() { - Err(Error::::LeaseFreeze)?; - } - if size > s.remaining_space { - Err(Error::::InsufficientStorage)?; - } - s.used_space = - s.used_space.checked_add(size).ok_or(Error::::Overflow)?; - s.remaining_space = - s.remaining_space.checked_sub(size).ok_or(Error::::Overflow)?; - Ok(()) - })?; - }, - 2 => >::try_mutate(acc, |s_opt| -> DispatchResult { - let s = s_opt.as_mut().unwrap(); - s.used_space = s.used_space.checked_sub(size).ok_or(Error::::Overflow)?; - s.remaining_space = - s.total_space.checked_sub(s.used_space).ok_or(Error::::Overflow)?; - Ok(()) - })?, - _ => Err(Error::::WrongOperation)?, - } - Ok(()) - } - - fn frozen_task() -> (Weight, Vec>) { - let now: BlockNumberFor = >::block_number(); - let number: u128 = now.saturated_into(); - - let mut weight: Weight = Weight::zero(); - let mut clear_acc_list: Vec> = Default::default(); - - log::info!("Start lease expiration check"); - for (acc, info) in >::iter() { - weight = weight.saturating_add(T::DbWeight::get().reads(1 as u64)); - if now > info.deadline { - let frozen_day: BlockNumberFor = ::FrozenDays::get(); - if now > info.deadline + frozen_day { - log::info!("clear user:#{}'s files", number); - let result = >::try_mutate( - &acc, - |s_opt| -> DispatchResult { - let s = s_opt - .as_mut() - .ok_or(Error::::NotPurchasedSpace)?; - s.state = SPACE_DEAD - .as_bytes() - .to_vec() - .try_into() - .map_err(|_e| Error::::BoundedVecError)?; - Ok(()) - }, - ); - match result { - Ok(()) => log::info!("user space dead: #{}", number), - Err(e) => log::error!("space mark dead failed: {:?}", e), - } - weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); - clear_acc_list.push(acc); - } else { - if info.state.to_vec() != SPACE_FROZEN.as_bytes().to_vec() { - let result = >::try_mutate( - &acc, - |s_opt| -> DispatchResult { - let s = s_opt - .as_mut() - .ok_or(Error::::NotPurchasedSpace)?; - s.state = SPACE_FROZEN - .as_bytes() - .to_vec() - .try_into() - .map_err(|_e| Error::::BoundedVecError)?; - Ok(()) - }, - ); - match result { - Ok(()) => log::info!("user space frozen: #{}", number), - Err(e) => log::error!("frozen failed: {:?}", e), - } - weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); - } - } - } - } - log::info!("End lease expiration check"); - (weight, clear_acc_list) - } - - pub fn lock_user_space(acc: &T::AccountId, needed_space: u128) -> DispatchResult { - >::try_mutate(acc, |storage_space_opt| -> DispatchResult { - let storage_space = storage_space_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - if storage_space.state.to_vec() == SPACE_FROZEN.as_bytes().to_vec() { - Err(Error::::LeaseFreeze)?; - } - if storage_space.remaining_space < needed_space { - Err(Error::::InsufficientStorage)?; - } - storage_space.locked_space = storage_space.locked_space.checked_add(needed_space).ok_or(Error::::Overflow)?; - storage_space.remaining_space = storage_space.remaining_space.checked_sub(needed_space).ok_or(Error::::Overflow)?; + >::insert(&user, &tname, info); + >::insert(&token, (user, tname)); + >::insert(&deadline, &token, true); + >::mutate(&deadline, |counter| -> DispatchResult { + *counter = counter.checked_add(1).ok_or(Error::::Overflow)?; + ensure!(*counter < T::FrozenLimit::get(), Error::::Overflow); Ok(()) - }) - } + })?; - pub fn unlock_user_space(acc: &T::AccountId, needed_space: u128) -> DispatchResult { - >::try_mutate(acc, |storage_space_opt| -> DispatchResult { - let storage_space = storage_space_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - storage_space.locked_space = storage_space.locked_space.checked_sub(needed_space).ok_or(Error::::Overflow)?; - storage_space.remaining_space = storage_space.remaining_space.checked_add(needed_space).ok_or(Error::::Overflow)?; - Ok(()) - }) + Ok(()) } - pub fn unlock_and_used_user_space(acc: &T::AccountId, needed_space: u128) -> DispatchResult { - >::try_mutate(acc, |storage_space_opt| -> DispatchResult { - let storage_space = storage_space_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - storage_space.locked_space = storage_space.locked_space.checked_sub(needed_space).ok_or(Error::::Overflow)?; - storage_space.used_space = storage_space.used_space.checked_add(needed_space).ok_or(Error::::Overflow)?; + // Before calling this method, please determine the state of the territory + fn update_territory_space( + user: AccountOf, + tname: TerrName, + space: u128 + ) -> DispatchResult { + >::try_mutate(&user, &tname, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; + t.remaining_space = t.remaining_space.checked_add(space).ok_or(Error::::Overflow)?; + t.total_space = t.total_space.checked_add(space).ok_or(Error::::Overflow)?; Ok(()) - }) - } - - pub fn check_user_space(acc: &T::AccountId, needed_space: u128) -> Result { - let user_storage = >::try_get(acc).map_err(|_e| Error::::NotPurchasedSpace)?; + })?; - Ok(user_storage.remaining_space >= needed_space) + Ok(()) } - //Get the available space on the current chain. - pub fn get_total_space() -> Result { - let purchased_space = >::get(); - let total_space = >::get().checked_add(>::get()).ok_or(Error::::Overflow)?; - //If the total space on the current chain is less than the purchased space, 0 will be - // returned. - if total_space < purchased_space { - return Ok(0); - } - //Calculate available space. - let value = total_space.checked_sub(purchased_space).ok_or(Error::::Overflow)?; + // Before calling this method, please determine the state of the territory + fn update_territory_days( + user: AccountOf, + tname: TerrName, + days: u32, + ) -> DispatchResult { + >::try_mutate(&user, &tname, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::NotHaveTerritory)?; + >::remove(&t.deadline, &t.token); + >::mutate(&t.deadline, |counter| -> DispatchResult { + *counter = counter.checked_sub(1).ok_or(Error::::Overflow)?; + Ok(()) + })?; + let frozen_days = ::FrozenDays::get(); + let expired_block = t.deadline.checked_add(&frozen_days).ok_or(Error::::Overflow)?; + >::remove(&expired_block, &t.token); + let one_day = ::OneDay::get(); + let now = >::block_number(); + let sur_block: BlockNumberFor = + one_day.checked_mul(&days.saturated_into()).ok_or(Error::::Overflow)?; + if now > t.deadline { + t.start = now; + t.deadline = now.checked_add(&sur_block).ok_or(Error::::Overflow)?; + } else { + t.deadline = t.deadline.checked_add(&sur_block).ok_or(Error::::Overflow)?; + } - Ok(value) - } + if t.deadline > now { + t.state = TerritoryState::Active; + } - fn add_total_idle_space(increment: u128) -> DispatchResult { - TotalIdleSpace::::try_mutate(|total_power| -> DispatchResult { - *total_power = total_power.checked_add(increment).ok_or(Error::::Overflow)?; - Ok(()) - }) //read 1 write 1 - } + >::insert(&t.deadline, &t.token, true); + >::mutate(&t.deadline, |counter| -> DispatchResult { + *counter = counter.checked_add(1).ok_or(Error::::Overflow)?; + ensure!(*counter < T::FrozenLimit::get(), Error::::Overflow); + Ok(()) + })?; - fn add_total_service_space(increment: u128) -> DispatchResult { - TotalServiceSpace::::try_mutate(|total_space| -> DispatchResult { - *total_space = total_space.checked_add(increment).ok_or(Error::::Overflow)?; Ok(()) - }) + })?; + Ok(()) } - fn sub_total_idle_space(decrement: u128) -> DispatchResult { - TotalIdleSpace::::try_mutate(|total_power| -> DispatchResult { - *total_power = total_power.checked_sub(decrement).ok_or(Error::::Overflow)?; - Ok(()) - }) //read 1 write 1 - } + // Before calling this method, please determine the state of the territory + fn initial_territory( + user: AccountOf, + tname: TerrName, + days: u32 + ) -> DispatchResult { + >::try_mutate(&user, &tname, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::NotPurchasedSpace)?; - fn sub_total_service_space(decrement: u128) -> DispatchResult { - TotalServiceSpace::::try_mutate(|total_space| -> DispatchResult { - *total_space = total_space.checked_sub(decrement).ok_or(Error::::Overflow)?; + let now = >::block_number(); + + t.state = TerritoryState::Active; + t.remaining_space = 0; + t.locked_space = 0; + t.used_space = 0; + t.start = now; + + let one_day = T::OneDay::get(); + let deadline: BlockNumberFor = one_day.checked_mul(&days.saturated_into()).ok_or(Error::::Overflow)?; + t.deadline = now.checked_add(&deadline).ok_or(Error::::Overflow)?; + >::insert(&t.deadline, &t.token, true); + >::mutate(&t.deadline, |counter| -> DispatchResult { + *counter = counter.checked_add(1).ok_or(Error::::Overflow)?; + ensure!(*counter < T::FrozenLimit::get(), Error::::Overflow); + Ok(()) + })?; + Ok(()) }) } fn add_purchased_space(size: u128) -> DispatchResult { - >::try_mutate(|purchased_space| -> DispatchResult { + >::try_mutate(|purchased_space| -> DispatchResult { let total_space = >::get().checked_add(>::get()).ok_or(Error::::Overflow)?; let new_space = purchased_space.checked_add(size).ok_or(Error::::Overflow)?; if new_space > total_space { @@ -819,109 +1113,68 @@ impl Pallet { *purchased_space = new_space; Ok(()) }) - } + } - fn sub_purchased_space(size: u128) -> DispatchResult { - >::try_mutate(|purchased_space| -> DispatchResult { + fn sub_purchased_space(size: u128) -> DispatchResult { + >::try_mutate(|purchased_space| -> DispatchResult { *purchased_space = purchased_space.checked_sub(size).ok_or(Error::::Overflow)?; Ok(()) }) - } -} - -pub trait StorageHandle { - fn update_user_space(acc: &AccountId, opeartion: u8, size: u128) -> DispatchResult; - fn add_total_idle_space(increment: u128) -> DispatchResult; - fn sub_total_idle_space(decrement: u128) -> DispatchResult; - fn add_total_service_space(increment: u128) -> DispatchResult; - fn sub_total_service_space(decrement: u128) -> DispatchResult; - fn get_total_idle_space() -> u128; - fn get_total_service_space() -> u128; - fn add_purchased_space(size: u128) -> DispatchResult; - fn sub_purchased_space(size: u128) -> DispatchResult; - fn get_total_space() -> Result; - fn lock_user_space(acc: &AccountId, needed_space: u128) -> DispatchResult; - fn unlock_user_space(acc: &AccountId, needed_space: u128) -> DispatchResult; - fn unlock_and_used_user_space(acc: &AccountId, needed_space: u128) -> DispatchResult; - fn get_user_avail_space(acc: &AccountId) -> Result; - fn frozen_task() -> (Weight, Vec); - fn delete_user_space_storage(acc: &AccountId) -> Result; -} - -impl StorageHandle for Pallet { - fn update_user_space(acc: &T::AccountId, opeartion: u8, size: u128) -> DispatchResult { - Pallet::::update_user_space(acc, opeartion, size) - } - - fn add_total_idle_space(increment: u128) -> DispatchResult { - Pallet::::add_total_idle_space(increment) - } - - fn sub_total_idle_space(decrement: u128) -> DispatchResult { - Pallet::::sub_total_idle_space(decrement) - } - - fn add_total_service_space(increment: u128) -> DispatchResult { - Pallet::::add_total_service_space(increment) - } - - fn sub_total_service_space(decrement: u128) -> DispatchResult { - Pallet::::sub_total_service_space(decrement) - } - - fn add_purchased_space(size: u128) -> DispatchResult { - Pallet::::add_purchased_space(size) - } - - fn sub_purchased_space(size: u128) -> DispatchResult { - Pallet::::sub_purchased_space(size) - } - - fn get_total_space() -> Result { - Pallet::::get_total_space() } - fn lock_user_space(acc: &T::AccountId, needed_space: u128) -> DispatchResult { - Pallet::::lock_user_space(acc, needed_space) - } - - fn unlock_user_space(acc: &T::AccountId, needed_space: u128) -> DispatchResult { - Pallet::::unlock_user_space(acc, needed_space) - } - - fn unlock_and_used_user_space(acc: &T::AccountId, needed_space: u128) -> DispatchResult { - Pallet::::unlock_and_used_user_space(acc, needed_space) - } - - fn get_user_avail_space(acc: &T::AccountId) -> Result { - let info = >::try_get(acc).map_err(|_e| Error::::NotPurchasedSpace)?; - Ok(info.remaining_space) - } - - fn frozen_task() -> (Weight, Vec>) { - Self::frozen_task() - } - - fn delete_user_space_storage(acc: &T::AccountId) -> Result { + fn frozen_task() -> (Weight, Vec<(AccountOf, TerrName)>) { + let now: BlockNumberFor = >::block_number(); let mut weight: Weight = Weight::zero(); - let space_info = >::try_get(acc).map_err(|_| Error::::NotPurchasedSpace)?; - weight = weight.saturating_add(T::DbWeight::get().reads(1 as u64)); - - Self::sub_purchased_space(space_info.total_space)?; - weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); + log::info!("Start lease expiration check"); + for (token, _) in >::iter_prefix(&now) { + weight = weight.saturating_add(T::DbWeight::get().reads(1 as u64)); + let result = >::try_get(&token).map_err(|_| Error::::Unexpected); + weight = weight.saturating_add(T::DbWeight::get().reads(1 as u64)); + match result { + Ok((acc, territory_name)) => { + let _ = >::try_mutate(&acc, &territory_name, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::Unexpected)?; + if t.state == TerritoryState::OnConsignment { + >::remove(&token); + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + } - >::remove(acc); - weight = weight.saturating_add(T::DbWeight::get().writes(1 as u64)); + t.state = TerritoryState::Frozen; + let frozen_days = ::FrozenDays::get(); + let expired_block = t.deadline.checked_add(&frozen_days).ok_or(Error::::Overflow)?; + >::insert(&expired_block, &t.token, true); + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + Ok(()) + }); + weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); + }, + Err(e) => log::error!("[StorageHanle] -> [frozen_task]: TerritoryKey read failed {:?}", e), + } + } - Ok(weight) - } + let mut list: Vec<(AccountOf, TerrName)> = Default::default(); - fn get_total_idle_space() -> u128 { - >::get() - } + for (token, _) in >::iter_prefix(&now) { + weight = weight.saturating_add(T::DbWeight::get().reads(1 as u64)); + let result = >::try_get(&token).map_err(|_| Error::::Unexpected); + weight = weight.saturating_add(T::DbWeight::get().reads(1 as u64)); + match result { + Ok((acc, territory_name)) => { + let _ = >::try_mutate(&acc, &territory_name, |t_opt| -> DispatchResult { + let t = t_opt.as_mut().ok_or(Error::::Unexpected)?; + Self::sub_purchased_space(t.total_space)?; + t.state = TerritoryState::Expired; + Ok(()) + }); + weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1)); + list.push((acc, territory_name)); + }, + Err(e) => log::error!("[StorageHanle] -> [frozen_task]: TerritoryKey read failed {:?}", e), + } + } - fn get_total_service_space() -> u128 { - >::get() + log::info!("End lease expiration check"); + (weight, list) } } \ No newline at end of file diff --git a/pallets/storage-handler/src/types.rs b/pallets/storage-handler/src/types.rs index 192d9e56..3836b092 100644 --- a/pallets/storage-handler/src/types.rs +++ b/pallets/storage-handler/src/types.rs @@ -1,22 +1,10 @@ use super::*; -#[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] -#[scale_info(skip_type_params(T))] -#[codec(mel_bound())] -pub struct OwnedSpaceDetails { - pub(super) total_space: u128, - pub(super) used_space: u128, - pub(super) locked_space: u128, - pub(super) remaining_space: u128, - pub(super) start: BlockNumberFor, - pub(super) deadline: BlockNumberFor, - pub(super) state: BoundedVec, -} - #[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] #[scale_info(skip_type_params(T))] #[codec(mel_bound())] pub struct OrderInfo { + pub(super) territory_name: TerrName, pub(super) pay: BalanceOf, pub(super) gib_count: u32, pub(super) days: u32, @@ -30,4 +18,37 @@ pub enum OrderType { Buy, Expansion, Renewal, +} + +#[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] +#[scale_info(skip_type_params(T))] +#[codec(mel_bound())] +pub struct TerritoryInfo { + pub(super) token: H256, + pub(super) total_space: u128, + pub(super) used_space: u128, + pub(super) locked_space: u128, + pub(super) remaining_space: u128, + pub(super) start: BlockNumberFor, + pub(super) deadline: BlockNumberFor, + pub(super) state: TerritoryState, +} + +#[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] +#[scale_info(skip_type_params(T))] +#[codec(mel_bound())] +pub struct ConsignmentInfo { + pub(super) user: AccountOf, + pub(super) price: BalanceOf, + pub(super) buyers: Option>, + pub(super) exec: Option>, + pub(super) locked: bool, +} + +#[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] +pub enum TerritoryState { + Active, + Frozen, + Expired, + OnConsignment, } \ No newline at end of file diff --git a/pallets/storage-handler/src/weights.rs b/pallets/storage-handler/src/weights.rs index 79026442..4e8837c9 100644 --- a/pallets/storage-handler/src/weights.rs +++ b/pallets/storage-handler/src/weights.rs @@ -1,8 +1,8 @@ //! Autogenerated weights for `pallet_storage_handler` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-04-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `ytqaljn-virtual-machine`, CPU: `12th Gen Intel(R) Core(TM) i5-12400` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("cess-initial-devnet")`, DB CACHE: `1024` @@ -36,20 +36,34 @@ use core::marker::PhantomData; /// Weight functions needed for `pallet_storage_handler`. pub trait WeightInfo { - fn buy_space() -> Weight; - fn expansion_space() -> Weight; - fn renewal_space() -> Weight; + fn mint_territory() -> Weight; + fn expanding_territory() -> Weight; + fn renewal_territory() -> Weight; + fn treeitory_consignment() -> Weight; + fn buy_consignment() -> Weight; + fn exec_consignment() -> Weight; + fn cancel_consignment() -> Weight; + fn cancel_purchase_action() -> Weight; + fn territory_grants() -> Weight; + fn territory_rename() -> Weight; fn create_order() -> Weight; fn exec_order() -> Weight; + fn reactivate_territory() -> Weight; } /// Weights for `pallet_storage_handler` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::PurchasedSpace` (r:1 w:1) /// Proof: `StorageHandler::PurchasedSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:0) @@ -58,17 +72,19 @@ impl WeightInfo for SubstrateWeight { /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn buy_space() -> Weight { + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn mint_territory() -> Weight { // Proof Size summary in bytes: - // Measured: `330` + // Measured: `603` // Estimated: `6196` - // Minimum execution time: 65_702_000 picoseconds. - Weight::from_parts(67_198_000, 6196) - .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Minimum execution time: 65_031_000 picoseconds. + Weight::from_parts(68_175_000, 6196) + .saturating_add(T::DbWeight::get().reads(10_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) } - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) @@ -79,51 +95,162 @@ impl WeightInfo for SubstrateWeight { /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:0) /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn expansion_space() -> Weight { + fn expanding_territory() -> Weight { // Proof Size summary in bytes: - // Measured: `620` + // Measured: `802` // Estimated: `6196` - // Minimum execution time: 64_474_000 picoseconds. - Weight::from_parts(66_723_000, 6196) + // Minimum execution time: 54_590_000 picoseconds. + Weight::from_parts(57_599_000, 6196) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn renewal_space() -> Weight { + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:2 w:2) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:2) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryExpired` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryExpired` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn renewal_territory() -> Weight { + // Proof Size summary in bytes: + // Measured: `808` + // Estimated: `6196` + // Minimum execution time: 100_984_000 picoseconds. + Weight::from_parts(103_492_000, 6196) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(8_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + fn treeitory_consignment() -> Weight { + // Proof Size summary in bytes: + // Measured: `590` + // Estimated: `3698` + // Minimum execution time: 27_278_000 picoseconds. + Weight::from_parts(28_334_000, 3698) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + fn buy_consignment() -> Weight { + // Proof Size summary in bytes: + // Measured: `427` + // Estimated: `110487` + // Minimum execution time: 26_461_000 picoseconds. + Weight::from_parts(34_684_000, 110487) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:2) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + fn exec_consignment() -> Weight { // Proof Size summary in bytes: - // Measured: `615` + // Measured: `1011` // Estimated: `6196` - // Minimum execution time: 57_114_000 picoseconds. - Weight::from_parts(58_743_000, 6196) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Minimum execution time: 63_599_000 picoseconds. + Weight::from_parts(66_427_000, 6196) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + fn cancel_consignment() -> Weight { + // Proof Size summary in bytes: + // Measured: `659` + // Estimated: `3698` + // Minimum execution time: 20_154_000 picoseconds. + Weight::from_parts(31_057_000, 3698) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + fn cancel_purchase_action() -> Weight { + // Proof Size summary in bytes: + // Measured: `651` + // Estimated: `110487` + // Minimum execution time: 27_678_000 picoseconds. + Weight::from_parts(40_002_000, 110487) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:0) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:2) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + fn territory_grants() -> Weight { + // Proof Size summary in bytes: + // Measured: `604` + // Estimated: `3698` + // Minimum execution time: 17_520_000 picoseconds. + Weight::from_parts(18_657_000, 3698) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:2) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + fn territory_rename() -> Weight { + // Proof Size summary in bytes: + // Measured: `604` + // Estimated: `3698` + // Minimum execution time: 26_201_000 picoseconds. + Weight::from_parts(27_089_000, 3698) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:0) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::PayOrder` (r:0 w:1) - /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(110), added: 2585, mode: `MaxEncodedLen`) + /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(174), added: 2649, mode: `MaxEncodedLen`) fn create_order() -> Weight { // Proof Size summary in bytes: // Measured: `497` - // Estimated: `3606` - // Minimum execution time: 21_731_000 picoseconds. - Weight::from_parts(22_921_000, 3606) + // Estimated: `3698` + // Minimum execution time: 18_134_000 picoseconds. + Weight::from_parts(18_997_000, 3698) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `StorageHandler::PayOrder` (r:1 w:0) - /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(110), added: 2585, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(174), added: 2649, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::PurchasedSpace` (r:1 w:1) /// Proof: `StorageHandler::PurchasedSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:0) @@ -132,23 +259,56 @@ impl WeightInfo for SubstrateWeight { /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn exec_order() -> Weight { // Proof Size summary in bytes: - // Measured: `462` + // Measured: `739` // Estimated: `6196` - // Minimum execution time: 67_037_000 picoseconds. - Weight::from_parts(91_637_000, 6196) - .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Minimum execution time: 64_761_000 picoseconds. + Weight::from_parts(71_674_000, 6196) + .saturating_add(T::DbWeight::get().reads(10_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) + /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::PurchasedSpace` (r:1 w:1) + /// Proof: `StorageHandler::PurchasedSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:0) + /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:0) + /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn reactivate_territory() -> Weight { + // Proof Size summary in bytes: + // Measured: `779` + // Estimated: `6196` + // Minimum execution time: 64_591_000 picoseconds. + Weight::from_parts(66_512_000, 6196) + .saturating_add(T::DbWeight::get().reads(8_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) } } // For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::PurchasedSpace` (r:1 w:1) /// Proof: `StorageHandler::PurchasedSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:0) @@ -157,17 +317,19 @@ impl WeightInfo for () { /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn buy_space() -> Weight { + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn mint_territory() -> Weight { // Proof Size summary in bytes: - // Measured: `330` + // Measured: `603` // Estimated: `6196` - // Minimum execution time: 65_702_000 picoseconds. - Weight::from_parts(67_198_000, 6196) - .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Minimum execution time: 65_031_000 picoseconds. + Weight::from_parts(68_175_000, 6196) + .saturating_add(RocksDbWeight::get().reads(10_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) @@ -178,51 +340,162 @@ impl WeightInfo for () { /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:0) /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn expansion_space() -> Weight { + fn expanding_territory() -> Weight { // Proof Size summary in bytes: - // Measured: `620` + // Measured: `802` // Estimated: `6196` - // Minimum execution time: 64_474_000 picoseconds. - Weight::from_parts(66_723_000, 6196) + // Minimum execution time: 54_590_000 picoseconds. + Weight::from_parts(57_599_000, 6196) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn renewal_space() -> Weight { + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:2 w:2) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:2) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryExpired` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryExpired` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn renewal_territory() -> Weight { + // Proof Size summary in bytes: + // Measured: `808` + // Estimated: `6196` + // Minimum execution time: 100_984_000 picoseconds. + Weight::from_parts(103_492_000, 6196) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(8_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + fn treeitory_consignment() -> Weight { + // Proof Size summary in bytes: + // Measured: `590` + // Estimated: `3698` + // Minimum execution time: 27_278_000 picoseconds. + Weight::from_parts(28_334_000, 3698) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + fn buy_consignment() -> Weight { + // Proof Size summary in bytes: + // Measured: `427` + // Estimated: `110487` + // Minimum execution time: 26_461_000 picoseconds. + Weight::from_parts(34_684_000, 110487) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:2) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + fn exec_consignment() -> Weight { // Proof Size summary in bytes: - // Measured: `615` + // Measured: `1011` // Estimated: `6196` - // Minimum execution time: 57_114_000 picoseconds. - Weight::from_parts(58_743_000, 6196) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Minimum execution time: 63_599_000 picoseconds. + Weight::from_parts(66_427_000, 6196) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + fn cancel_consignment() -> Weight { + // Proof Size summary in bytes: + // Measured: `659` + // Estimated: `3698` + // Minimum execution time: 20_154_000 picoseconds. + Weight::from_parts(31_057_000, 3698) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `StorageHandler::Consignment` (r:1 w:1) + /// Proof: `StorageHandler::Consignment` (`max_values`: None, `max_size`: Some(135), added: 2610, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + fn cancel_purchase_action() -> Weight { + // Proof Size summary in bytes: + // Measured: `651` + // Estimated: `110487` + // Minimum execution time: 27_678_000 picoseconds. + Weight::from_parts(40_002_000, 110487) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:0) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:2) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + fn territory_grants() -> Weight { + // Proof Size summary in bytes: + // Measured: `604` + // Estimated: `3698` + // Minimum execution time: 17_520_000 picoseconds. + Weight::from_parts(18_657_000, 3698) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:2) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + fn territory_rename() -> Weight { + // Proof Size summary in bytes: + // Measured: `604` + // Estimated: `3698` + // Minimum execution time: 26_201_000 picoseconds. + Weight::from_parts(27_089_000, 3698) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:0) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::PayOrder` (r:0 w:1) - /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(110), added: 2585, mode: `MaxEncodedLen`) + /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(174), added: 2649, mode: `MaxEncodedLen`) fn create_order() -> Weight { // Proof Size summary in bytes: // Measured: `497` - // Estimated: `3606` - // Minimum execution time: 21_731_000 picoseconds. - Weight::from_parts(22_921_000, 3606) + // Estimated: `3698` + // Minimum execution time: 18_134_000 picoseconds. + Weight::from_parts(18_997_000, 3698) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `StorageHandler::PayOrder` (r:1 w:0) - /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(110), added: 2585, mode: `MaxEncodedLen`) - /// Storage: `StorageHandler::UserOwnedSpace` (r:1 w:1) - /// Proof: `StorageHandler::UserOwnedSpace` (`max_values`: None, `max_size`: Some(141), added: 2616, mode: `MaxEncodedLen`) + /// Proof: `StorageHandler::PayOrder` (`max_values`: None, `max_size`: Some(174), added: 2649, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryKey` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryKey` (`max_values`: None, `max_size`: Some(144), added: 2619, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::PurchasedSpace` (r:1 w:1) /// Proof: `StorageHandler::PurchasedSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:0) @@ -231,13 +504,40 @@ impl WeightInfo for () { /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn exec_order() -> Weight { // Proof Size summary in bytes: - // Measured: `462` + // Measured: `739` // Estimated: `6196` - // Minimum execution time: 67_037_000 picoseconds. - Weight::from_parts(91_637_000, 6196) - .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Minimum execution time: 64_761_000 picoseconds. + Weight::from_parts(71_674_000, 6196) + .saturating_add(RocksDbWeight::get().reads(10_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) + } + /// Storage: `StorageHandler::Territory` (r:1 w:1) + /// Proof: `StorageHandler::Territory` (`max_values`: None, `max_size`: Some(233), added: 2708, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::UnitPrice` (r:1 w:0) + /// Proof: `StorageHandler::UnitPrice` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::PurchasedSpace` (r:1 w:1) + /// Proof: `StorageHandler::PurchasedSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TotalIdleSpace` (r:1 w:0) + /// Proof: `StorageHandler::TotalIdleSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TotalServiceSpace` (r:1 w:0) + /// Proof: `StorageHandler::TotalServiceSpace` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozenCounter` (r:1 w:1) + /// Proof: `StorageHandler::TerritoryFrozenCounter` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) + /// Storage: `StorageHandler::TerritoryFrozen` (r:0 w:1) + /// Proof: `StorageHandler::TerritoryFrozen` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn reactivate_territory() -> Weight { + // Proof Size summary in bytes: + // Measured: `779` + // Estimated: `6196` + // Minimum execution time: 64_591_000 picoseconds. + Weight::from_parts(66_512_000, 6196) + .saturating_add(RocksDbWeight::get().reads(8_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) } } diff --git a/standalone/chain/runtime/src/lib.rs b/standalone/chain/runtime/src/lib.rs index 9337eb46..e43fdcfe 100644 --- a/standalone/chain/runtime/src/lib.rs +++ b/standalone/chain/runtime/src/lib.rs @@ -546,7 +546,7 @@ impl pallet_cess_staking::Config for Runtime { pallet_collective::EnsureProportionAtLeast, >; type SessionInterface = Self; - type EraPayout = (); // pallet_staking::ConvertCurve; + type EraPayout = (); // pallet_cess_staking::ConvertCurve; type NextNewSession = Session; type MaxExposurePageSize = ConstU32<256>; type OffendingValidatorsThreshold = OffendingValidatorsThreshold; @@ -1561,10 +1561,6 @@ impl pallet_file_bank::Config for Runtime { type RuntimeCall = RuntimeCall; type FilbakPalletId = FilbakPalletId; type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type FScheduler = Scheduler; - type AScheduler = Scheduler; - type SPalletsOrigin = OriginCaller; - type SProposal = RuntimeCall; type WeightInfo = pallet_file_bank::weights::SubstrateWeight; type MinerControl = Sminer; type StorageHandle = StorageHandler; @@ -1662,9 +1658,20 @@ parameter_types! { pub const FrozenDays: BlockNumber = 7 * DAYS; #[derive(Clone, Eq, PartialEq)] pub const StateStringMax: u32 = 20; + #[derive(Clone, Eq, PartialEq)] + pub const LockingBlock: BlockNumber = MINUTES * 5; + #[derive(Clone, Eq, PartialEq)] + pub const FrozenLimit: u32 = 2000; } impl pallet_storage_handler::Config for Runtime { + type FScheduler = Scheduler; + type PalletsOrigin = OriginCaller; + type SProposal = RuntimeCall; + type ConsignmentRemainingBlock = OneDay; + type LockingBlock = LockingBlock; + type Preimages = Preimage; + type NameLimit = NameStrLimit; type RuntimeEvent = RuntimeEvent; type Currency = Balances; type WeightInfo = pallet_storage_handler::weights::SubstrateWeight; @@ -1675,6 +1682,7 @@ impl pallet_storage_handler::Config for Runtime { type StateStringMax = StateStringMax; type FrozenDays = FrozenDays; type CessTreasuryHandle = CessTreasury; + type FrozenLimit = FrozenLimit; } parameter_types! {