diff --git a/runtime/gdev/tests/common/golden_testing/iterative.rs b/runtime/gdev/tests/common/golden_testing/iterative.rs index 6d88b883cd1fda7b24f13b2704725133ad5309a3..93b650c489f7bf5ebc9ef478f13aec0c8c02f81d 100644 --- a/runtime/gdev/tests/common/golden_testing/iterative.rs +++ b/runtime/gdev/tests/common/golden_testing/iterative.rs @@ -320,6 +320,20 @@ impl StorageIterativeChecker { Key::_ManualKey("Multisig".to_string(), "Multisigs".to_string(), "[ ]".to_string()), Key::_ManualKey("AtomicSwap".to_string(), "PendingSwaps".to_string(), "[ +]".to_string()), + Key::_ManualKey("Grandpa".to_string(), "SetIdSession".to_string(), "[ + 0 = 0 +]".to_string()), + Key::_ManualKey("Cert".to_string(), "StorageIdtyCertMeta".to_string(), "[ + 1 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 2 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 3 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 4 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } +]".to_string()), + Key::_ManualKey("SmithCert".to_string(), "StorageIdtyCertMeta".to_string(), "[ + 1 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 2 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 3 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } ]".to_string()), ] }, diff --git a/runtime/gdev/tests/common/golden_testing/key.rs b/runtime/gdev/tests/common/golden_testing/key.rs index 94606ed94e34c29a14ea9bc7bf3fedb7c58d5dca..f165f13499a82bec04b250a40e4deaeccba0a897 100644 --- a/runtime/gdev/tests/common/golden_testing/key.rs +++ b/runtime/gdev/tests/common/golden_testing/key.rs @@ -6,11 +6,11 @@ use common_runtime::entities::IdtyData; use common_runtime::{AccountId, BlockNumber, IdtyIndex}; use frame_support::instances::{Instance1, Instance2}; use frame_support::metadata::RuntimeMetadata; -use frame_support::storage::{storage_prefix, PrefixIterator}; +use frame_support::storage::{storage_prefix, KeyPrefixIterator, PrefixIterator}; use frame_support::traits::schedule::v3::TaskName; use frame_support::traits::{Currency, WrapperOpaque}; use frame_support::{ - Blake2_128Concat, Hashable, ReversibleStorageHasher, StorageHasher, Twox64Concat, + Blake2_128Concat, Hashable, Identity, ReversibleStorageHasher, StorageHasher, Twox64Concat, }; use frame_system::AccountInfo; use gdev_runtime::opaque::SessionKeys; @@ -18,9 +18,11 @@ use gdev_runtime::Runtime; use maplit::btreemap; use pallet_authority_members::MemberData; use pallet_balances::{AccountData, ReserveData}; +use pallet_certification::IdtyCertMeta; use pallet_collective::Votes; use pallet_identity::{IdtyName, IdtyValue}; -use pallet_im_online::{AuthIndex, BoundedOpaqueNetworkState, ValidatorId}; +use pallet_im_online::{AuthIndex, ValidatorId}; +use pallet_offences::Config; use pallet_preimage::RequestStatus; use pallet_scheduler::{ScheduledOf, TaskAddress}; use pretty_assertions::assert_eq; @@ -29,13 +31,13 @@ use sp_consensus_babe::{AuthorityId, BabeAuthorityWeight}; use sp_consensus_vrf::schnorrkel; use sp_core::bounded::{BoundedVec, WeakBoundedVec}; use sp_core::crypto::{AccountId32, KeyTypeId}; -use sp_core::ConstU32; +use sp_core::{ConstU32, Get, TypedGet}; use sp_finality_grandpa::SetId; use sp_io::TestExternalities; use sp_runtime::RuntimeString; use sp_std::map; use std::collections::{BTreeMap, HashMap}; -use std::fmt::{format, Debug}; +use std::fmt::{format, Debug, Formatter}; use std::iter::Map; use std::ops::Add; use std::ptr::read; @@ -52,6 +54,52 @@ type BalanceOf<T> = <<T as pallet_preimage::Config>::Currency as Currency< >>::Balance; /// Maximum size of preimage we can store is 4mb. const MAX_SIZE: u32 = 4 * 1024 * 1024; +// #[derive(Debug)] +// type Custom<P, M, A> = BoundedOpaqueNetworkState<P, M, A>; + +// impl Debug for BoundedOpaqueNetworkState<P, M, A> { +// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { +// todo!() +// } +// } + +#[doc = "Const getter for a basic type."] +#[derive(frame_support::RuntimeDebug, PartialEq, Clone)] +pub struct MyConstU32<const T: u32>; +impl<const T: u32> Get<u32> for MyConstU32<T> { + fn get() -> u32 { + T + } +} +impl<const T: u32> Get<Option<u32>> for MyConstU32<T> { + fn get() -> Option<u32> { + Some(T) + } +} +impl<const T: u32> TypedGet for MyConstU32<T> { + type Type = u32; + fn get() -> u32 { + T + } +} +type Get32 = MyConstU32<100>; + +#[derive(Debug, codec::Encode, codec::Decode, PartialEq, Clone)] +pub struct CustomBoundedOpaqueNetworkState< + PeerIdEncodingLimit, + MultiAddrEncodingLimit, + AddressesLimit, +> where + PeerIdEncodingLimit: Get<u32>, + MultiAddrEncodingLimit: Get<u32>, + AddressesLimit: Get<u32>, +{ + /// PeerId of the local node in SCALE encoded. + pub peer_id: WeakBoundedVec<u8, PeerIdEncodingLimit>, + /// List of addresses the node knows it can be reached as. + pub external_addresses: + WeakBoundedVec<WeakBoundedVec<u8, MultiAddrEncodingLimit>, AddressesLimit>, +} /// Structured Key name. /// Composed of two fields which are the same used by Substrate #[pallet::storage] macro as described @@ -143,13 +191,25 @@ pub enum Key { _ManualKey(String, String, String), SystemAccount, SystemBlockHash, - SystemExtrinsicData, - SystemEventTopics, + SystemExtrinsicData(BTreeMap<u32, Vec<u8>>), + SystemEventTopics( + BTreeMap< + <Runtime as frame_system::Config>::Hash, + Vec<(<Runtime as frame_system::Config>::BlockNumber, u32)>, + >, + ), AccountPendingRandomIdAssignments, AccountPendingNewAccounts, SchedulerAgenda, - SchedulerLookup, - BabeUnderConstruction, + SchedulerLookup( + BTreeMap<TaskName, TaskAddress<<Runtime as frame_system::Config>::BlockNumber>>, + ), + BabeUnderConstruction( + BTreeMap< + u32, + BoundedVec<schnorrkel::Randomness, ConstU32<UNDER_CONSTRUCTION_SEGMENT_LENGTH>>, + >, + ), BalancesAccount, BalancesLocks, BalancesReserves, @@ -162,11 +222,23 @@ pub enum Key { OffencesConcurrentReportsIndex, SessionNextKeys, SessionKeyOwner, - GrandpaSetIdSession, - ImOnlineReceivedHeartbeats, - ImOnlineAuthoredBlocks, - PreimageStatusFor, - PreimagePreimageFor, + GrandpaSetIdSession(BTreeMap<SetId, SessionIndex>), + ImOnlineReceivedHeartbeats( + BTreeMap<(SessionIndex, AuthIndex), CustomBoundedOpaqueNetworkState<Get32, Get32, Get32>>, + ), + ImOnlineAuthoredBlocks(BTreeMap<(SessionIndex, ValidatorId<Runtime>), u32>), + PreimageStatusFor( + BTreeMap< + <Runtime as frame_system::Config>::Hash, + RequestStatus<<Runtime as frame_system::Config>::AccountId, BalanceOf<Runtime>>, + >, + ), + PreimagePreimageFor( + BTreeMap< + (<Runtime as frame_system::Config>::Hash, u32), + BoundedVec<u8, ConstU32<MAX_SIZE>>, + >, + ), TechnicalCommitteeProposalOf, TechnicalCommitteeVoting, IdentityIdentityIndexOf, @@ -175,14 +247,24 @@ pub enum Key { MembershipMembershipsExpireOn, MembershipPendingMembership, MembershipPendingMembershipsExpireOn, - CertStorageIdtyCertMeta, + CertStorageIdtyCertMeta( + BTreeMap< + <Runtime as pallet_certification::Config<Instance1>>::IdtyIndex, + IdtyCertMeta<<Runtime as frame_system::Config>::BlockNumber>, + >, + ), CertCertsByReceiver, CertStorageCertsRemovableOn, SmithMembershipMembership, SmithMembershipMembershipsExpireOn, SmithMembershipPendingMembership, SmithMembershipPendingMembershipsExpireOn, - SmithCertStorageIdtyCertMeta, + SmithCertStorageIdtyCertMeta( + BTreeMap< + <Runtime as pallet_certification::Config<Instance2>>::IdtyIndex, + IdtyCertMeta<<Runtime as frame_system::Config>::BlockNumber>, + >, + ), SmithCertCertsByReceiver, SmithCertStorageCertsRemovableOn, AtomicSwapPendingSwaps, @@ -266,13 +348,13 @@ impl Key { } Key::SystemAccount => eq(k, (), v_str, kv, ekv), Key::SystemBlockHash => eq(k, (), v_str, kv, ekv), - Key::SystemExtrinsicData => eq(k, (), v_str, kv, ekv), - Key::SystemEventTopics => eq(k, (), v_str, kv, ekv), + Key::SystemExtrinsicData(v) => eq(k, v, v_str, kv, ekv), + Key::SystemEventTopics(v) => eq(k, v, v_str, kv, ekv), Key::AccountPendingRandomIdAssignments => eq(k, (), v_str, kv, ekv), Key::AccountPendingNewAccounts => eq(k, (), v_str, kv, ekv), Key::SchedulerAgenda => eq(k, (), v_str, kv, ekv), - Key::SchedulerLookup => eq(k, (), v_str, kv, ekv), - Key::BabeUnderConstruction => eq(k, (), v_str, kv, ekv), + Key::SchedulerLookup(v) => eq(k, v, v_str, kv, ekv), + Key::BabeUnderConstruction(v) => eq(k, (), v_str, kv, ekv), Key::BalancesAccount => eq(k, (), v_str, kv, ekv), Key::BalancesLocks => eq(k, (), v_str, kv, ekv), Key::BalancesReserves => eq(k, (), v_str, kv, ekv), @@ -285,11 +367,11 @@ impl Key { Key::OffencesConcurrentReportsIndex => eq(k, (), v_str, kv, ekv), Key::SessionNextKeys => eq(k, (), v_str, kv, ekv), Key::SessionKeyOwner => eq(k, (), v_str, kv, ekv), - Key::GrandpaSetIdSession => eq(k, (), v_str, kv, ekv), - Key::ImOnlineReceivedHeartbeats => eq(k, (), v_str, kv, ekv), - Key::ImOnlineAuthoredBlocks => eq(k, (), v_str, kv, ekv), - Key::PreimageStatusFor => eq(k, (), v_str, kv, ekv), - Key::PreimagePreimageFor => eq(k, (), v_str, kv, ekv), + Key::GrandpaSetIdSession(v) => eq(k, v, v_str, kv, ekv), + Key::ImOnlineReceivedHeartbeats(v) => eq(k, v, v_str, kv, ekv), + Key::ImOnlineAuthoredBlocks(v) => eq(k, v, v_str, kv, ekv), + Key::PreimageStatusFor(v) => eq(k, v, v_str, kv, ekv), + Key::PreimagePreimageFor(v) => eq(k, v, v_str, kv, ekv), Key::TechnicalCommitteeProposalOf => eq(k, (), v_str, kv, ekv), Key::TechnicalCommitteeVoting => eq(k, (), v_str, kv, ekv), Key::IdentityIdentityIndexOf => eq(k, (), v_str, kv, ekv), @@ -298,14 +380,14 @@ impl Key { Key::MembershipMembershipsExpireOn => eq(k, (), v_str, kv, ekv), Key::MembershipPendingMembership => eq(k, (), v_str, kv, ekv), Key::MembershipPendingMembershipsExpireOn => eq(k, (), v_str, kv, ekv), - Key::CertStorageIdtyCertMeta => eq(k, (), v_str, kv, ekv), + Key::CertStorageIdtyCertMeta(v) => eq(k, v, v_str, kv, ekv), Key::CertCertsByReceiver => eq(k, (), v_str, kv, ekv), Key::CertStorageCertsRemovableOn => eq(k, (), v_str, kv, ekv), Key::SmithMembershipMembership => eq(k, (), v_str, kv, ekv), Key::SmithMembershipMembershipsExpireOn => eq(k, (), v_str, kv, ekv), Key::SmithMembershipPendingMembership => eq(k, (), v_str, kv, ekv), Key::SmithMembershipPendingMembershipsExpireOn => eq(k, (), v_str, kv, ekv), - Key::SmithCertStorageIdtyCertMeta => eq(k, (), v_str, kv, ekv), + Key::SmithCertStorageIdtyCertMeta(v) => eq(k, v, v_str, kv, ekv), Key::SmithCertCertsByReceiver => eq(k, (), v_str, kv, ekv), Key::SmithCertStorageCertsRemovableOn => eq(k, (), v_str, kv, ekv), Key::AtomicSwapPendingSwaps => eq(k, (), v_str, kv, ekv), @@ -371,15 +453,15 @@ impl Key { Key::ImOnlineKeys(_) => KeyName::new("ImOnline", "Keys"), Key::SystemAccount => KeyName::new("System", "Account"), Key::SystemBlockHash => KeyName::new("System", "BlockHash"), - Key::SystemExtrinsicData => KeyName::new("System", "ExtrinsicData"), - Key::SystemEventTopics => KeyName::new("System", "EventTopics"), + Key::SystemExtrinsicData(_) => KeyName::new("System", "ExtrinsicData"), + Key::SystemEventTopics(_) => KeyName::new("System", "EventTopics"), Key::AccountPendingRandomIdAssignments => { KeyName::new("Account", "PendingRandomIdAssignments") } Key::AccountPendingNewAccounts => KeyName::new("Account", "PendingNewAccounts"), Key::SchedulerAgenda => KeyName::new("Scheduler", "Agenda"), - Key::SchedulerLookup => KeyName::new("Scheduler", "Lookup"), - Key::BabeUnderConstruction => KeyName::new("Babe", "UnderConstruction"), + Key::SchedulerLookup(_) => KeyName::new("Scheduler", "Lookup"), + Key::BabeUnderConstruction(_) => KeyName::new("Babe", "UnderConstruction"), Key::BalancesAccount => KeyName::new("Balances", "Account"), Key::BalancesLocks => KeyName::new("Balances", "Locks"), Key::BalancesReserves => KeyName::new("Balances", "Reserves"), @@ -398,11 +480,11 @@ impl Key { } Key::SessionNextKeys => KeyName::new("Session", "NextKeys"), Key::SessionKeyOwner => KeyName::new("Session", "KeyOwner"), - Key::GrandpaSetIdSession => KeyName::new("Grandpa", "SetIdSession"), - Key::ImOnlineReceivedHeartbeats => KeyName::new("ImOnline", "ReceivedHeartbeats"), - Key::ImOnlineAuthoredBlocks => KeyName::new("ImOnline", "AuthoredBlocks"), - Key::PreimageStatusFor => KeyName::new("Preimage", "StatusFor"), - Key::PreimagePreimageFor => KeyName::new("Preimage", "PreimageFor"), + Key::GrandpaSetIdSession(_) => KeyName::new("Grandpa", "SetIdSession"), + Key::ImOnlineReceivedHeartbeats(_) => KeyName::new("ImOnline", "ReceivedHeartbeats"), + Key::ImOnlineAuthoredBlocks(_) => KeyName::new("ImOnline", "AuthoredBlocks"), + Key::PreimageStatusFor(_) => KeyName::new("Preimage", "StatusFor"), + Key::PreimagePreimageFor(_) => KeyName::new("Preimage", "PreimageFor"), Key::TechnicalCommitteeProposalOf => KeyName::new("TechnicalCommittee", "ProposalOf"), Key::TechnicalCommitteeVoting => KeyName::new("TechnicalCommittee", "Voting"), Key::IdentityIdentityIndexOf => KeyName::new("Identity", "IdentityIndexOf"), @@ -413,7 +495,7 @@ impl Key { Key::MembershipPendingMembershipsExpireOn => { KeyName::new("Membership", "PendingMembershipsExpireOn") } - Key::CertStorageIdtyCertMeta => KeyName::new("Cert", "StorageIdtyCertMeta"), + Key::CertStorageIdtyCertMeta(_) => KeyName::new("Cert", "StorageIdtyCertMeta"), Key::CertCertsByReceiver => KeyName::new("Cert", "CertsByReceiver"), Key::CertStorageCertsRemovableOn => KeyName::new("Cert", "StorageCertsRemovableOn"), Key::SmithMembershipMembership => KeyName::new("SmithMembership", "Membership"), @@ -426,7 +508,9 @@ impl Key { Key::SmithMembershipPendingMembershipsExpireOn => { KeyName::new("SmithMembership", "PendingMembershipsExpireOn") } - Key::SmithCertStorageIdtyCertMeta => KeyName::new("SmithCert", "StorageIdtyCertMeta"), + Key::SmithCertStorageIdtyCertMeta(_) => { + KeyName::new("SmithCert", "StorageIdtyCertMeta") + } Key::SmithCertCertsByReceiver => KeyName::new("SmithCertCert", "sByReceiver"), Key::SmithCertStorageCertsRemovableOn => { KeyName::new("SmithCert", "StorageCertsRemovableOn") @@ -477,8 +561,12 @@ impl Key { Key::ImOnlineKeys(v) => format!("{:?}", v), Key::SystemAccount => String::from("TODO: implement in to_map_key_value_closure"), Key::SystemBlockHash => String::from("TODO: implement in to_map_key_value_closure"), - Key::SystemExtrinsicData => String::from("TODO: implement in to_map_key_value_closure"), - Key::SystemEventTopics => String::from("TODO: implement in to_map_key_value_closure"), + Key::SystemExtrinsicData(_) => { + String::from("TODO: implement in to_map_key_value_closure") + } + Key::SystemEventTopics(_) => { + String::from("TODO: implement in to_map_key_value_closure") + } Key::AccountPendingRandomIdAssignments => { String::from("TODO: implement in to_map_key_value_closure") } @@ -486,8 +574,8 @@ impl Key { String::from("TODO: implement in to_map_key_value_closure") } Key::SchedulerAgenda => String::from("TODO: implement in to_map_key_value_closure"), - Key::SchedulerLookup => String::from("TODO: implement in to_map_key_value_closure"), - Key::BabeUnderConstruction => { + Key::SchedulerLookup(_) => String::from("TODO: implement in to_map_key_value_closure"), + Key::BabeUnderConstruction(_) => { String::from("TODO: implement in to_map_key_value_closure") } Key::BalancesAccount => String::from("TODO: implement in to_map_key_value_closure"), @@ -514,15 +602,21 @@ impl Key { } Key::SessionNextKeys => String::from("TODO: implement in to_map_key_value_closure"), Key::SessionKeyOwner => String::from("TODO: implement in to_map_key_value_closure"), - Key::GrandpaSetIdSession => String::from("TODO: implement in to_map_key_value_closure"), - Key::ImOnlineReceivedHeartbeats => { + Key::GrandpaSetIdSession(_) => { + String::from("TODO: implement in to_map_key_value_closure") + } + Key::ImOnlineReceivedHeartbeats(_) => { + String::from("TODO: implement in to_map_key_value_closure") + } + Key::ImOnlineAuthoredBlocks(_) => { String::from("TODO: implement in to_map_key_value_closure") } - Key::ImOnlineAuthoredBlocks => { + Key::PreimageStatusFor(_) => { + String::from("TODO: implement in to_map_key_value_closure") + } + Key::PreimagePreimageFor(_) => { String::from("TODO: implement in to_map_key_value_closure") } - Key::PreimageStatusFor => String::from("TODO: implement in to_map_key_value_closure"), - Key::PreimagePreimageFor => String::from("TODO: implement in to_map_key_value_closure"), Key::TechnicalCommitteeProposalOf => { String::from("TODO: implement in to_map_key_value_closure") } @@ -547,7 +641,7 @@ impl Key { Key::MembershipPendingMembershipsExpireOn => { String::from("TODO: implement in to_map_key_value_closure") } - Key::CertStorageIdtyCertMeta => { + Key::CertStorageIdtyCertMeta(_) => { String::from("TODO: implement in to_map_key_value_closure") } Key::CertCertsByReceiver => String::from("TODO: implement in to_map_key_value_closure"), @@ -566,7 +660,7 @@ impl Key { Key::SmithMembershipPendingMembershipsExpireOn => { String::from("TODO: implement in to_map_key_value_closure") } - Key::SmithCertStorageIdtyCertMeta => { + Key::SmithCertStorageIdtyCertMeta(_) => { String::from("TODO: implement in to_map_key_value_closure") } Key::SmithCertCertsByReceiver => { @@ -639,28 +733,42 @@ impl Key { Key::SystemBlockHash => { Some(|| to_kv(frame_system::BlockHash::<Runtime>::iter().collect())) } - // TODO: private field - // Key::SystemExtrinsicData => Some(|| to_kv(frame_system::ExtrinsicData::<Runtime>::iter().collect())), - // Key::SystemEventTopics => Some(|| to_kv(frame_system::EventTopics::<Runtime>::iter().collect())), - Key::SystemExtrinsicData => None, - Key::SystemEventTopics => None, + Key::SystemExtrinsicData(_) => Some(move || { + read_map::<u32, Vec<u8>, Twox64Concat>(KeyName::new("System", "ExtrinsicData")) + }), + Key::SystemEventTopics(_) => Some(move || { + read_map::< + <Runtime as frame_system::Config>::Hash, + Vec<(<Runtime as frame_system::Config>::BlockNumber, u32)>, + Blake2_128Concat, + >(KeyName::new("System", "EventTopics")) + }), Key::AccountPendingRandomIdAssignments => Some(|| { to_kv( pallet_duniter_account::PendingRandomIdAssignments::<Runtime>::iter().collect(), ) }), - // TODO: no failing test? Key::AccountPendingNewAccounts => Some(|| { to_kv(pallet_duniter_account::PendingNewAccounts::<Runtime>::iter().collect()) }), Key::SchedulerAgenda => { Some(|| to_kv(pallet_scheduler::Agenda::<Runtime>::iter().collect())) } - // TODO: private field - // Key::SchedulerLookup => Some(|| to_kv(pallet_scheduler::Lookup::<Runtime>::iter().collect())), + Key::SchedulerLookup(_) => Some(|| { + read_map::< + TaskName, + TaskAddress<<Runtime as frame_system::Config>::BlockNumber>, + Twox64Concat, + >(KeyName::new("Scheduler", "Lookup")) + }), // Key::BabeUnderConstruction => Some(|| to_kv(pallet_babe::UnderConstruction::<Runtime>::iter().collect())), - Key::SchedulerLookup => None, - Key::BabeUnderConstruction => None, + Key::BabeUnderConstruction(_) => Some(|| { + read_map::< + u32, + BoundedVec<schnorrkel::Randomness, ConstU32<UNDER_CONSTRUCTION_SEGMENT_LENGTH>>, + Twox64Concat, + >(KeyName::new("Babe", "UnderConstruction")) + }), Key::BalancesAccount => { Some(|| to_kv(pallet_balances::Account::<Runtime>::iter().collect())) } @@ -688,26 +796,53 @@ impl Key { Key::OffencesReports => { Some(|| to_kv(pallet_offences::Reports::<Runtime>::iter().collect())) } - Key::OffencesConcurrentReportsIndex => Some(|| to_kv(pallet_offences::ConcurrentReportsIndex::<Runtime>::iter() - .map(to_simple_map) - .collect())), + Key::OffencesConcurrentReportsIndex => Some(|| { + to_kv( + pallet_offences::ConcurrentReportsIndex::<Runtime>::iter() + .map(to_simple_map) + .collect(), + ) + }), Key::SessionNextKeys => { Some(|| to_kv(pallet_session::NextKeys::<Runtime>::iter().collect())) } Key::SessionKeyOwner => { Some(|| to_kv(pallet_session::KeyOwner::<Runtime>::iter().collect())) } - // TODO: private field - Key::GrandpaSetIdSession => None, - Key::ImOnlineReceivedHeartbeats => None, - Key::ImOnlineAuthoredBlocks => None, - Key::PreimageStatusFor => None, - Key::PreimagePreimageFor => None, - // Key::GrandpaSetIdSession => Some(|| to_kv(pallet_grandpa::SetIdSession::<Runtime>::iter().collect())), - // Key::ImOnlineReceivedHeartbeats => Some(|| to_kv(pallet_im_online::ReceivedHeartbeats::<Runtime>::iter().collect())), - // Key::ImOnlineAuthoredBlocks => Some(|| to_kv(pallet_im_online::AuthoredBlocks::<Runtime>::iter().collect())), - // Key::PreimageStatusFor => Some(|| to_kv(pallet_preimage::StatusFor::<Runtime>::iter().collect())), - // Key::PreimagePreimageFor => Some(|| to_kv(pallet_preimage::PreimageFor::<Runtime>::iter().collect())), + Key::GrandpaSetIdSession(_) => Some(|| { + read_map::<SetId, SessionIndex, Twox64Concat>(KeyName::new( + "Grandpa", + "SetIdSession", + )) + }), + Key::ImOnlineReceivedHeartbeats(_) => Some(|| { + read_double_map::< + SessionIndex, + AuthIndex, + CustomBoundedOpaqueNetworkState<Get32, Get32, Get32>, + Twox64Concat, + Twox64Concat, + >(KeyName::new("ImOnline", "ReceivedHeartbeats")) + }), + Key::ImOnlineAuthoredBlocks(_) => Some(|| { + read_double_map::<SessionIndex, ValidatorId<Runtime>, u32, Twox64Concat, Twox64Concat>( + KeyName::new("ImOnline", "AuthoredBlocks"), + ) + }), + Key::PreimageStatusFor(_) => Some(|| { + read_map::< + <Runtime as frame_system::Config>::Hash, + RequestStatus<<Runtime as frame_system::Config>::AccountId, BalanceOf<Runtime>>, + Identity, + >(KeyName::new("Preimage", "StatusFor")) + }), + Key::PreimagePreimageFor(_) => Some(|| { + read_map::< + (<Runtime as frame_system::Config>::Hash, u32), + BoundedVec<u8, ConstU32<MAX_SIZE>>, + Identity, + >(KeyName::new("Preimage", "PreimageFor")) + }), Key::TechnicalCommitteeProposalOf => Some(|| { to_kv(pallet_collective::ProposalOf::<Runtime, Instance2>::iter().collect()) }), @@ -737,9 +872,13 @@ impl Key { .collect(), ) }), - // TODO: private field - // Key::CertStorageIdtyCertMeta => Some(|| to_kv(pallet_certification::IdtyCertMeta::<Runtime, Instance1>::iter().collect())), - Key::CertStorageIdtyCertMeta => None, + Key::CertStorageIdtyCertMeta(_) => Some(|| { + read_map::< + <Runtime as pallet_certification::Config<Instance1>>::IdtyIndex, + IdtyCertMeta<<Runtime as frame_system::Config>::BlockNumber>, + Twox64Concat, + >(KeyName::new("Cert", "StorageIdtyCertMeta")) + }), Key::CertCertsByReceiver => Some(|| { to_kv(pallet_certification::CertsByReceiver::<Runtime, Instance1>::iter().collect()) }), @@ -766,9 +905,13 @@ impl Key { .collect(), ) }), - // TODO: compile - // Key::SmithCertStorageIdtyCertMeta => Some(|| to_kv(pallet_certification::IdtyCertMeta<<Runtime as frame_system:Config>::BlockNumber>::iter().collect())), - Key::SmithCertStorageIdtyCertMeta => None, + Key::SmithCertStorageIdtyCertMeta(_) => Some(|| { + read_map::< + <Runtime as pallet_certification::Config<Instance2>>::IdtyIndex, + IdtyCertMeta<<Runtime as frame_system::Config>::BlockNumber>, + Twox64Concat, + >(KeyName::new("SmithCert", "StorageIdtyCertMeta")) + }), Key::SmithCertCertsByReceiver => Some(|| { to_kv(pallet_certification::CertsByReceiver::<Runtime, Instance2>::iter().collect()) }), @@ -778,10 +921,20 @@ impl Key { .collect(), ) }), - Key::AtomicSwapPendingSwaps => Some(|| to_kv(pallet_atomic_swap::PendingSwaps::<Runtime>::iter() - .map(to_simple_map).collect())), - Key::MultisigMultisigs => Some(|| to_kv(pallet_multisig::Multisigs::<Runtime>::iter() - .map(to_simple_map).collect())), + Key::AtomicSwapPendingSwaps => Some(|| { + to_kv( + pallet_atomic_swap::PendingSwaps::<Runtime>::iter() + .map(to_simple_map) + .collect(), + ) + }), + Key::MultisigMultisigs => Some(|| { + to_kv( + pallet_multisig::Multisigs::<Runtime>::iter() + .map(to_simple_map) + .collect(), + ) + }), Key::MultisigMultisigs => None, Key::ProvideRandomnessRequestsReadyAtEpoch => Some(|| { to_kv(pallet_provide_randomness::RequestsReadyAtEpoch::<Runtime>::iter().collect()) @@ -796,70 +949,6 @@ impl Key { Key::TreasuryProposals => { Some(|| to_kv(pallet_treasury::Proposals::<Runtime>::iter().collect())) } - // Key::SystemAccount(_) => read_map::< - // AccountId, - // AccountInfo< - // <Runtime as frame_system::Config>::Index, - // <Runtime as frame_system::Config>::AccountData, - // >, - // Blake2_128Concat, - // >(self.name().clone()), - // Key::SystemBlockHash(_) => read_map::< - // <Runtime as frame_system::Config>::BlockNumber, - // <Runtime as frame_system::Config>::Hash, - // Twox64Concat, - // >(self.name().clone()), - // Key::SystemExtrinsicData(_) => { - // read_map::<u32, Vec<u8>, Twox64Concat>(self.name().clone()) - // } - // Key::SystemEventTopics(_) => None, - // Key::AccountPendingRandomIdAssignments(_) => None, - // Key::AccountPendingNewAccounts(_) => None, - // Key::SchedulerAgenda(_) => None, - // Key::SchedulerLookup(_) => None, - // Key::BabeUnderConstruction(_) => None, - // Key::BalancesAccount(_) => None, - // Key::BalancesLocks(_) => None, - // Key::BalancesReserves(_) => None, - // Key::OneshotAccountOneshotAccounts(_) => None, - // Key::AuthorityMembersAccountIdOf(_) => None, - // Key::AuthorityMembersMembers(_) => None, - // Key::AuthorityMembersMembersExpireOn(_) => None, - // Key::AuthorityMembersMustRotateKeysBefore(_) => None, - // Key::OffencesReports(_) => None, - // Key::OffencesConcurrentReportsIndex(_) => None, - // Key::SessionNextKeys(_) => None, - // Key::SessionKeyOwner(_) => None, - // Key::GrandpaSetIdSession(_) => None, - // Key::ImOnlineReceivedHeartbeats(_) => None, - // Key::ImOnlineAuthoredBlocks(_) => None, - // Key::PreimageStatusFor(_) => None, - // Key::PreimagePreimageFor(_) => None, - // Key::TechnicalCommitteeProposalOf(_) => None, - // Key::TechnicalCommitteeVoting(_) => None, - // Key::IdentityIdentityIndexOf(_) => None, - // Key::IdentityIdentitiesRemovableOn(_) => None, - // Key::MembershipMembership(_) => None, - // Key::MembershipMembershipsExpireOn(_) => None, - // Key::MembershipPendingMembership(_) => None, - // Key::MembershipPendingMembershipsExpireOn(_) => None, - // Key::CertStorageIdtyCertMeta(_) => None, - // Key::CertCertsByReceiver(_) => None, - // Key::CertStorageCertsRemovableOn(_) => None, - // Key::SmithMembershipMembership(_) => None, - // Key::SmithMembershipMembershipsExpireOn(_) => None, - // Key::SmithMembershipPendingMembership(_) => None, - // Key::SmithMembershipPendingMembershipsExpireOn(_) => None, - // Key::SmithCertStorageIdtyCertMeta(_) => None, - // Key::SmithCertCertsByReceiver(_) => None, - // Key::SmithCertStorageCertsRemovableOn(_) => None, - // Key::AtomicSwapPendingSwaps(_) => None, - // Key::MultisigMultisigs(_) => None, - // Key::ProvideRandomnessRequestsReadyAtEpoch(_) => None, - // Key::ProvideRandomnessRequestsIds(_) => None, - // Key::ProxyProxies(_) => None, - // Key::ProxyAnnouncements(_) => None, - // Key::TreasuryProposals(_) => None, }; if let Some(c) = closure { return Some(Box::new(c)); @@ -902,13 +991,13 @@ impl Key { Key::_ManualKey(_, _, _) => None, Key::SystemAccount => None, Key::SystemBlockHash => None, - Key::SystemExtrinsicData => None, - Key::SystemEventTopics => None, + Key::SystemExtrinsicData(v) => to_checkable_map(v.clone()), + Key::SystemEventTopics(v) => to_checkable_map(v.clone()), Key::AccountPendingRandomIdAssignments => None, Key::AccountPendingNewAccounts => None, Key::SchedulerAgenda => None, - Key::SchedulerLookup => None, - Key::BabeUnderConstruction => None, + Key::SchedulerLookup(v) => to_checkable_map(v.clone()), + Key::BabeUnderConstruction(v) => to_checkable_map(v.clone()), Key::BalancesAccount => None, Key::BalancesLocks => None, Key::BalancesReserves => None, @@ -921,11 +1010,11 @@ impl Key { Key::OffencesConcurrentReportsIndex => None, Key::SessionNextKeys => None, Key::SessionKeyOwner => None, - Key::GrandpaSetIdSession => None, - Key::ImOnlineReceivedHeartbeats => None, - Key::ImOnlineAuthoredBlocks => None, - Key::PreimageStatusFor => None, - Key::PreimagePreimageFor => None, + Key::GrandpaSetIdSession(v) => to_checkable_map(v.clone()), + Key::ImOnlineReceivedHeartbeats(v) => to_checkable_map(v.clone()), + Key::ImOnlineAuthoredBlocks(v) => to_checkable_map(v.clone()), + Key::PreimageStatusFor(v) => to_checkable_map(v.clone()), + Key::PreimagePreimageFor(v) => to_checkable_map(v.clone()), Key::TechnicalCommitteeProposalOf => None, Key::TechnicalCommitteeVoting => None, Key::IdentityIdentityIndexOf => None, @@ -934,14 +1023,14 @@ impl Key { Key::MembershipMembershipsExpireOn => None, Key::MembershipPendingMembership => None, Key::MembershipPendingMembershipsExpireOn => None, - Key::CertStorageIdtyCertMeta => None, + Key::CertStorageIdtyCertMeta(v) => to_checkable_map(v.clone()), Key::CertCertsByReceiver => None, Key::CertStorageCertsRemovableOn => None, Key::SmithMembershipMembership => None, Key::SmithMembershipMembershipsExpireOn => None, Key::SmithMembershipPendingMembership => None, Key::SmithMembershipPendingMembershipsExpireOn => None, - Key::SmithCertStorageIdtyCertMeta => None, + Key::SmithCertStorageIdtyCertMeta(v) => to_checkable_map(v.clone()), Key::SmithCertCertsByReceiver => None, Key::SmithCertStorageCertsRemovableOn => None, Key::AtomicSwapPendingSwaps => None, @@ -1006,13 +1095,13 @@ impl TryFrom<String> for Key { "Identity.Identities" => Ok(Key::IdentityIdentities(map!())), "System.Account" => Ok(Key::SystemAccount), "System.BlockHash" => Ok(Key::SystemBlockHash), - "System.ExtrinsicData" => Ok(Key::SystemExtrinsicData), - "System.EventTopics" => Ok(Key::SystemEventTopics), + "System.ExtrinsicData" => Ok(Key::SystemExtrinsicData(map!())), + "System.EventTopics" => Ok(Key::SystemEventTopics(map!())), "AccountPending.RandomIdAssignments" => Ok(Key::AccountPendingRandomIdAssignments), "AccountPending.NewAccounts" => Ok(Key::AccountPendingNewAccounts), "Scheduler.Agenda" => Ok(Key::SchedulerAgenda), - "Scheduler.Lookup" => Ok(Key::SchedulerLookup), - "Babe.UnderConstruction" => Ok(Key::BabeUnderConstruction), + "Scheduler.Lookup" => Ok(Key::SchedulerLookup(map!())), + "Babe.UnderConstruction" => Ok(Key::BabeUnderConstruction(map!())), "Balances.Account" => Ok(Key::BalancesAccount), "Balances.Locks" => Ok(Key::BalancesLocks), "Balances.Reserves" => Ok(Key::BalancesReserves), @@ -1027,11 +1116,11 @@ impl TryFrom<String> for Key { "Offences.ConcurrentReportsIndex" => Ok(Key::OffencesConcurrentReportsIndex), "Session.NextKeys" => Ok(Key::SessionNextKeys), "Session.KeyOwner" => Ok(Key::SessionKeyOwner), - "Grandpa.SetIdSession" => Ok(Key::GrandpaSetIdSession), - "ImOnline.ReceivedHeartbeats" => Ok(Key::ImOnlineReceivedHeartbeats), - "ImOnline.AuthoredBlocks" => Ok(Key::ImOnlineAuthoredBlocks), - "Preimage.StatusFor" => Ok(Key::PreimageStatusFor), - "Preimage.PreimageFor" => Ok(Key::PreimagePreimageFor), + "Grandpa.SetIdSession" => Ok(Key::GrandpaSetIdSession(map!())), + "ImOnline.ReceivedHeartbeats" => Ok(Key::ImOnlineReceivedHeartbeats(map!())), + "ImOnline.AuthoredBlocks" => Ok(Key::ImOnlineAuthoredBlocks(map!())), + "Preimage.StatusFor" => Ok(Key::PreimageStatusFor(map!())), + "Preimage.PreimageFor" => Ok(Key::PreimagePreimageFor(map!())), "TechnicalCommittee.ProposalOf" => Ok(Key::TechnicalCommitteeProposalOf), "TechnicalCommittee.Voting" => Ok(Key::TechnicalCommitteeVoting), "Identity.IdentityIndexOf" => Ok(Key::IdentityIdentityIndexOf), @@ -1042,7 +1131,7 @@ impl TryFrom<String> for Key { "Membership.PendingMembershipsExpireOn" => { Ok(Key::MembershipPendingMembershipsExpireOn) } - "Cert.StorageIdtyCertMeta" => Ok(Key::CertStorageIdtyCertMeta), + "Cert.StorageIdtyCertMeta" => Ok(Key::CertStorageIdtyCertMeta(map!())), "Cert.CertsByReceiver" => Ok(Key::CertCertsByReceiver), "Cert.StorageCertsRemovableOn" => Ok(Key::CertStorageCertsRemovableOn), "SmithMembership.Membership" => Ok(Key::SmithMembershipMembership), @@ -1051,7 +1140,7 @@ impl TryFrom<String> for Key { "SmithMembership.PendingMembershipsExpireOn" => { Ok(Key::SmithMembershipPendingMembershipsExpireOn) } - "SmithCert.StorageIdtyCertMeta" => Ok(Key::SmithCertStorageIdtyCertMeta), + "SmithCert.StorageIdtyCertMeta" => Ok(Key::SmithCertStorageIdtyCertMeta(map!())), "SmithCertCert.sByReceiver" => Ok(Key::SmithCertCertsByReceiver), "SmithCert.StorageCertsRemovableOn" => Ok(Key::SmithCertStorageCertsRemovableOn), "AtomicSwap.PendingSwaps" => Ok(Key::AtomicSwapPendingSwaps), @@ -1073,8 +1162,8 @@ fn eq<T>( key_name: KeyName, value: T, value_str: &str, - expected_key_values: Option<Box<dyn Fn() -> BTreeMap<Box<String>, Box<dyn Debug>>>>, map_key_values: Option<Box<dyn Fn() -> BTreeMap<Box<String>, Box<dyn Debug>>>>, + expected_key_values: Option<Box<dyn Fn() -> BTreeMap<Box<String>, Box<dyn Debug>>>>, ) -> Box<Checker<T>> { Checker::equals( key_name.pallet.as_str(), @@ -1086,37 +1175,92 @@ fn eq<T>( ) } -fn read_map<K, V, H>( - key_name: KeyName, -) -> Option<Box<dyn Fn() -> BTreeMap<Box<String>, Box<dyn Debug>>>> +fn read_map<K, V, H>(key_name: KeyName) -> BTreeMap<Box<String>, Box<dyn Debug>> where K: FullCodec + Debug + 'static, V: FullCodec + Debug + 'static, H: StorageHasher + ReversibleStorageHasher, { - Some(Box::new(move || { - let prefix: Vec<u8> = frame_support::storage::storage_prefix( - key_name.pallet.as_bytes(), - key_name.storage.as_bytes(), - ) - .into(); - let iterator: PrefixIterator<(Result<K, codec::Error>, Result<V, codec::Error>), ()> = - PrefixIterator::new( - prefix.clone(), - prefix, - |raw_key_without_prefix, mut raw_value| { - let mut key_material = H::reverse(raw_key_without_prefix); - let k: Result<K, codec::Error> = codec::Decode::decode(&mut key_material); - let v: Result<V, codec::Error> = codec::Decode::decode(&mut raw_value); - Ok((k, v)) - }, - ); - let mut kvs: BTreeMap<Box<String>, Box<dyn Debug>> = btreemap![]; - for (k, v) in iterator { - kvs.insert(Box::new(format!("{:?}", k.unwrap())), Box::new(v.unwrap())); - } - kvs - })) + let prefix: Vec<u8> = frame_support::storage::storage_prefix( + key_name.pallet.as_bytes(), + key_name.storage.as_bytes(), + ) + .into(); + let iterator: PrefixIterator<(Result<K, codec::Error>, Result<V, codec::Error>), ()> = + PrefixIterator::new( + prefix.clone(), + prefix, + |raw_key_without_prefix, mut raw_value| { + let mut key_material = H::reverse(raw_key_without_prefix); + let k: Result<K, codec::Error> = codec::Decode::decode(&mut key_material); + let v: Result<V, codec::Error> = codec::Decode::decode(&mut raw_value); + Ok((k, v)) + }, + ); + let mut kvs: BTreeMap<Box<String>, Box<dyn Debug>> = btreemap![]; + for (k, v) in iterator { + kvs.insert(Box::new(format!("{:?}", k.unwrap())), Box::new(v.unwrap())); + } + kvs +} + +fn read_double_map<K1, K2, V, H1, H2>(key_name: KeyName) -> BTreeMap<Box<String>, Box<dyn Debug>> +where + K1: FullCodec + Debug + 'static, + K2: FullCodec + Debug + 'static, + V: FullCodec + Debug + 'static, + H1: StorageHasher + ReversibleStorageHasher, + H2: StorageHasher + ReversibleStorageHasher, +{ + let prefix: Vec<u8> = frame_support::storage::storage_prefix( + key_name.pallet.as_bytes(), + key_name.storage.as_bytes(), + ) + .into(); + let iterator: PrefixIterator<(K1, K2, V)> = PrefixIterator::new( + prefix.clone(), + prefix, + |raw_key_without_prefix, mut raw_value| { + let mut k1_k2_material = H1::reverse(raw_key_without_prefix); + let k1 = K1::decode(&mut k1_k2_material).unwrap(); + let mut k2_material = H2::reverse(k1_k2_material); + let k2 = K2::decode(&mut k2_material).unwrap(); + let v = V::decode(&mut raw_value).unwrap(); + Ok((k1, k2, v)) + }, + ); + // let iteratorK: KeyPrefixIterator<(K1, K2)> = + // KeyPrefixIterator::new( + // prefix.clone(), + // prefix, + // |raw_key_without_prefix| { + // let mut k1_k2_material = H1::reverse(raw_key_without_prefix); + // let k1 = K1::decode(&mut k1_k2_material)?; + // let mut k2_material = H2::reverse(k1_k2_material); + // let k2 = K2::decode(&mut k2_material)?; + // Ok((k1, k2)) + // }, + // ); + let mut kvs: BTreeMap<Box<String>, Box<dyn Debug>> = btreemap![]; + for (k1, k2, v) in iterator { + kvs.insert(Box::new(format!("{:?} => {:?}", k1, k2)), Box::new(v)); + } + // for (k1, k2, v) in iteratorK { + // let iterator: PrefixIterator<(K1, K2)> = + // KeyPrefixIterator::new( + // prefix.clone(), + // prefix, + // |raw_key_without_prefix| { + // let mut k1_k2_material = H1::reverse(raw_key_without_prefix); + // let k1 = K1::decode(&mut k1_k2_material)?; + // let mut k2_material = H2::reverse(k1_k2_material); + // let k2 = K2::decode(&mut k2_material)?; + // Ok((k1, k2)) + // }, + // ); + // kvs.insert(Box::new(format!("{:?} => {:?}", k1.unwrap(), k2.unwrap())), Box::new(v.unwrap())); + // } + kvs } fn get_prefix(t: &Box<dyn StorageCheck>) -> [u8; 32] { diff --git a/runtime/gdev/tests/integration_tests.rs b/runtime/gdev/tests/integration_tests.rs index 122a20296c2ae6b2a49667add82591e8d7a97f1b..5be251ce9b44a29512092dbb438618e1810378b1 100644 --- a/runtime/gdev/tests/integration_tests.rs +++ b/runtime/gdev/tests/integration_tests.rs @@ -16,37 +16,16 @@ extern crate core; -use codec::Compact; use frame_support::traits::{Get, PalletInfo, StorageInfo, StorageInfoTrait}; -use frame_support::{assert_noop, assert_ok, storage}; +use frame_support::{assert_noop, assert_ok}; use frame_support::{StorageHasher, Twox128}; -use maplit::btreemap; -use sp_api::{AsTrieBackend, StateBackend}; -use sp_consensus_babe::{AuthorityId, BabeAuthorityWeight}; -use sp_core::bounded::WeakBoundedVec; -use sp_core::crypto::Ss58Codec; -use sp_core::sr25519; -use sp_core::Pair; use sp_keyring::AccountKeyring; -use sp_runtime::traits::BlockNumberProvider; -use sp_runtime::MultiSigner::Sr25519; -use sp_runtime::{MultiAddress, RuntimeString}; -use sp_storage::well_known_keys; -use std::str::FromStr; -use storage::storage_prefix; -use well_known_keys::{CODE, EXTRINSIC_INDEX}; +use sp_runtime::MultiAddress; use common::*; -use gdev_runtime::opaque::SessionKeys; use gdev_runtime::*; -use pallet_duniter_test_parameters::ParametersStorage; -use pallet_identity::{IdtyStatus, IdtyValue}; -use pallet_universal_dividend::FirstEligibleUd; -use crate::common::golden_testing::assert::compare_with_storage; -use crate::common::golden_testing::checker::{Checker, StorageCheck}; use crate::common::golden_testing::iterative::StorageIterativeChecker; -use crate::common::golden_testing::key::Key; mod common;