From e48056f7b68efaa9e95dcba7e6553d83a0e287df Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Sun, 23 Jan 2022 20:06:25 +0100 Subject: [PATCH] ref(runtime): rework wot --- Cargo.lock | 1 + node/src/chain_spec/gdev.rs | 26 ++- node/src/chain_spec/gtest.rs | 2 - pallets/authority-members/src/lib.rs | 131 ++++++------ pallets/authority-members/src/mock.rs | 5 +- pallets/authority-members/src/tests.rs | 11 - pallets/authority-members/src/types.rs | 8 +- pallets/duniter-wot/src/lib.rs | 63 ++---- pallets/duniter-wot/src/mock.rs | 26 +-- pallets/duniter-wot/src/tests.rs | 56 ++---- pallets/duniter-wot/src/types.rs | 22 +- pallets/identity/Cargo.toml | 3 + pallets/identity/src/lib.rs | 235 +++++++++++----------- pallets/identity/src/mock.rs | 2 - pallets/identity/src/tests.rs | 87 ++------ pallets/identity/src/traits.rs | 25 +-- pallets/identity/src/types.rs | 9 +- pallets/membership/src/lib.rs | 120 ++++++----- pallets/membership/src/mock.rs | 20 +- pallets/membership/src/tests.rs | 19 +- pallets/ud-accounts-storage/src/lib.rs | 66 +++--- primitives/membership/src/lib.rs | 7 - primitives/membership/src/traits.rs | 30 +-- runtime/common/src/entities.rs | 9 + runtime/common/src/handlers.rs | 82 ++++---- runtime/common/src/lib.rs | 13 -- runtime/common/src/pallets_config.rs | 267 ++++++++++++------------- runtime/g1/src/lib.rs | 2 +- runtime/gdev/src/lib.rs | 86 ++++---- runtime/gtest/src/lib.rs | 2 +- 30 files changed, 670 insertions(+), 765 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c2ab5ccc8..3a730637b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4339,6 +4339,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "maplit", "parity-scale-codec", "scale-info", "serde", diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs index f15ff6889..a94868dc4 100644 --- a/node/src/chain_spec/gdev.rs +++ b/node/src/chain_spec/gdev.rs @@ -256,13 +256,18 @@ fn gen_genesis_conf( identity: IdentityConfig { identities: initial_identities .iter() - .map(|(name, account)| IdtyValue { - data: Default::default(), - owner_key: account.clone(), - name: name.clone(), - next_creatable_identity_on: Default::default(), - removable_on: 0, - status: gdev_runtime::IdtyStatus::Validated, + .map(|(name, owner_key)| { + ( + owner_key.clone(), + ( + name.clone(), + IdtyValue { + next_creatable_identity_on: Default::default(), + removable_on: 0, + status: gdev_runtime::IdtyStatus::Validated, + }, + ), + ) }) .collect(), }, @@ -301,7 +306,12 @@ fn gen_genesis_conf( certs_by_issuer: clique_wot(initial_smiths_len, smith_cert_validity_period), }, ud_accounts_storage: UdAccountsStorageConfig { - ud_accounts: initial_identities.values().cloned().collect(), + ud_accounts: initial_identities + .values() + .cloned() + .enumerate() + .map(|(i, account)| (account, (i + 1) as u32)) + .collect(), }, universal_dividend: UniversalDividendConfig { first_ud: 1_000, diff --git a/node/src/chain_spec/gtest.rs b/node/src/chain_spec/gtest.rs index c3e03c358..895ae68b6 100644 --- a/node/src/chain_spec/gtest.rs +++ b/node/src/chain_spec/gtest.rs @@ -205,10 +205,8 @@ fn gen_genesis_conf( identities: initial_identities .iter() .map(|(name, account)| IdtyValue { - data: Default::default(), name: name.clone(), next_creatable_identity_on: Default::default(), - owner_key: account.clone(), removable_on: 0, status: gtest_runtime::IdtyStatus::Validated, }) diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs index 018f817bb..d3f9c51b0 100644 --- a/pallets/authority-members/src/lib.rs +++ b/pallets/authority-members/src/lib.rs @@ -33,6 +33,7 @@ pub use pallet::*; pub use types::*; use frame_support::traits::Get; +use sp_runtime::traits::Convert; use sp_staking::SessionIndex; use sp_std::prelude::*; @@ -65,13 +66,12 @@ pub mod pallet { type KeysWrapper: Parameter + Into<Self::Keys>; type IsMember: IsMember<Self::MemberId>; type OnRemovedMember: OnRemovedMember<Self::MemberId>; - type OwnerKeyOf: Convert<Self::MemberId, Option<Self::AccountId>>; #[pallet::constant] type MaxKeysLife: Get<SessionIndex>; #[pallet::constant] type MaxOfflineSessions: Get<SessionIndex>; - type MemberId: Copy + MaybeSerializeDeserialize + Parameter + Ord; - type RefreshValidatorIdOrigin: EnsureOrigin<Self::Origin>; + type MemberId: Copy + Ord + MaybeSerializeDeserialize + Parameter; + type MemberIdOf: Convert<Self::AccountId, Option<Self::MemberId>>; type RemoveMemberOrigin: EnsureOrigin<Self::Origin>; } @@ -79,7 +79,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig<T: Config> { - pub initial_authorities: BTreeMap<T::MemberId, (T::ValidatorId, bool)>, + pub initial_authorities: BTreeMap<T::MemberId, (T::AccountId, bool)>, } #[cfg(feature = "std")] @@ -94,17 +94,15 @@ pub mod pallet { #[pallet::genesis_build] impl<T: Config> GenesisBuild<T> for GenesisConfig<T> { fn build(&self) { - for (member_id, (validator_id, _is_online)) in &self.initial_authorities { - Members::<T>::insert( - member_id, - MemberData::new_genesis(T::MaxKeysLife::get(), validator_id.clone()), - ); + for (member_id, (account_id, _is_online)) in &self.initial_authorities { + AccountIdOf::<T>::insert(member_id, account_id); + Members::<T>::insert(member_id, MemberData::new_genesis(T::MaxKeysLife::get())); } let mut members_ids = self .initial_authorities .iter() .filter_map( - |(member_id, (_validator_id, is_online))| { + |(member_id, (_account_id, is_online))| { if *is_online { Some(*member_id) } else { @@ -122,6 +120,11 @@ pub mod pallet { // STORAGE // + #[pallet::storage] + #[pallet::getter(fn account_id_of)] + pub type AccountIdOf<T: Config> = + StorageMap<_, Twox64Concat, T::MemberId, T::AccountId, OptionQuery>; + #[pallet::storage] #[pallet::getter(fn incoming)] pub type IncomingAuthorities<T: Config> = StorageValue<_, Vec<T::MemberId>, ValueQuery>; @@ -136,8 +139,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn member)] - pub type Members<T: Config> = - StorageMap<_, Twox64Concat, T::MemberId, MemberData<T::ValidatorId>, OptionQuery>; + pub type Members<T: Config> = StorageMap<_, Twox64Concat, T::MemberId, MemberData, OptionQuery>; #[pallet::storage] #[pallet::getter(fn members_expire_on)] @@ -185,7 +187,7 @@ pub mod pallet { /// Already outgoing AlreadyOutgoing, /// Not found owner key - OwnerKeyNotFound, + MemberIdNotFound, /// Member not found MemberNotFound, /// Neither online nor scheduled @@ -211,9 +213,8 @@ pub mod pallet { let who = ensure_signed(origin)?; Self::verify_ownership_and_membership(&who, member_id)?; - let member_data = Members::<T>::get(member_id).ok_or(Error::<T>::MemberNotFound)?; - if !pallet_session::Pallet::<T>::is_registered(&member_data.validator_id) { - return Err(Error::<T>::SessionKeysNotProvided.into()); + if !Members::<T>::contains_key(member_id) { + return Err(Error::<T>::MemberNotFound.into()); } if Self::is_outgoing(member_id) { return Err(Error::<T>::AlreadyOutgoing.into()); @@ -241,8 +242,12 @@ pub mod pallet { let who = ensure_signed(origin)?; Self::verify_ownership_and_membership(&who, member_id)?; - let member_data = Members::<T>::get(member_id).ok_or(Error::<T>::MemberNotFound)?; - if !pallet_session::Pallet::<T>::is_registered(&member_data.validator_id) { + if !Members::<T>::contains_key(member_id) { + return Err(Error::<T>::MemberNotFound.into()); + } + let validator_id = T::ValidatorIdOf::convert(who.clone()) + .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?; + if !pallet_session::Pallet::<T>::is_registered(&validator_id) { return Err(Error::<T>::SessionKeysNotProvided.into()); } @@ -258,7 +263,7 @@ pub mod pallet { if is_outgoing { Self::remove_out(member_id); } else { - Self::insert_in(member_id); + Self::insert_in(member_id, who); } Ok(().into()) @@ -273,9 +278,6 @@ pub mod pallet { let who = ensure_signed(origin.clone())?; Self::verify_ownership_and_membership(&who, member_id)?; - let validator_id = T::ValidatorIdOf::convert(who) - .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?; - let _post_info = pallet_session::Call::<T>::set_keys { keys: keys.into(), proof: vec![], @@ -292,38 +294,47 @@ pub mod pallet { let mut member_data = member_data_opt.get_or_insert(MemberData { expire_on_session, must_rotate_keys_before, - validator_id: validator_id.clone(), }); member_data.must_rotate_keys_before = must_rotate_keys_before; - member_data.validator_id = validator_id; }); MustRotateKeysBefore::<T>::append(must_rotate_keys_before, member_id); Ok(().into()) } #[pallet::weight(0)] - pub fn refresh_validator_id( + pub fn prune_account_id_of( origin: OriginFor<T>, - member_id: T::MemberId, + members_ids: Vec<T::MemberId>, ) -> DispatchResultWithPostInfo { - T::RefreshValidatorIdOrigin::ensure_origin(origin)?; - - let owner = T::OwnerKeyOf::convert(member_id).ok_or(Error::<T>::OwnerKeyNotFound)?; - let validator_id = T::ValidatorIdOf::convert(owner) - .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?; + ensure_root(origin)?; - if !T::IsMember::is_member(&member_id) { - return Err(Error::<T>::NotMember.into()); + for member_id in members_ids { + if !Self::is_online(member_id) && !Self::is_incoming(member_id) { + AccountIdOf::<T>::remove(member_id); + } } - Members::<T>::mutate(member_id, |member_data_opt| { - if let Some(member_data) = member_data_opt { - member_data.validator_id = validator_id; - Ok(().into()) - } else { - Err(Error::<T>::MemberNotFound.into()) + Ok(().into()) + } + #[pallet::weight(0)] + pub fn purge_old_session_keys( + origin: OriginFor<T>, + member_id: T::MemberId, + accounts_ids: Vec<T::AccountId>, + ) -> DispatchResultWithPostInfo { + let who = ensure_signed(origin)?; + Self::verify_ownership_and_membership(&who, member_id)?; + + for account_id in accounts_ids { + if !T::IsMember::is_member(&member_id) { + let _post_info = pallet_session::Call::<T>::purge_keys {} + .dispatch_bypass_filter( + frame_system::Origin::<T>::Signed(account_id).into(), + )?; } - }) + } + + Ok(().into()) } #[pallet::weight(0)] pub fn remove_member( @@ -336,11 +347,6 @@ pub mod pallet { return Err(Error::<T>::NotMember.into()); } - if let Some(owner) = T::OwnerKeyOf::convert(member_id) { - let _post_info = pallet_session::Call::<T>::purge_keys {} - .dispatch_bypass_filter(frame_system::Origin::<T>::Signed(owner).into())?; - } - Self::do_remove_member(member_id); Ok(().into()) @@ -382,7 +388,7 @@ pub mod pallet { } } } - fn insert_in(member_id: T::MemberId) -> bool { + fn insert_in(member_id: T::MemberId, account_id: T::AccountId) -> bool { let not_already_inserted = IncomingAuthorities::<T>::mutate(|members_ids| { if let Err(index) = members_ids.binary_search(&member_id) { members_ids.insert(index, member_id); @@ -392,6 +398,7 @@ pub mod pallet { } }); if not_already_inserted { + AccountIdOf::<T>::insert(member_id, account_id); Self::deposit_event(Event::MemberGoOnline(member_id)); } not_already_inserted @@ -450,12 +457,12 @@ pub mod pallet { who: &T::AccountId, member_id: T::MemberId, ) -> Result<(), DispatchError> { - if let Some(owner) = T::OwnerKeyOf::convert(member_id) { - if who != &owner { + if let Some(expected_member_id) = T::MemberIdOf::convert(who.clone()) { + if expected_member_id != member_id { return Err(Error::<T>::NotOwner.into()); } } else { - return Err(Error::<T>::OwnerKeyNotFound.into()); + return Err(Error::<T>::MemberIdNotFound.into()); } if !T::IsMember::is_member(&member_id) { @@ -489,8 +496,8 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> { if members_ids_to_del.is_empty() { return None; } else { - // Apply MaxOfflineSessions rule for member_id in &members_ids_to_del { + // Apply MaxOfflineSessions rule let expire_on_session = session_index.saturating_add(T::MaxOfflineSessions::get()); Members::<T>::mutate_exists(member_id, |member_data_opt| { @@ -499,6 +506,8 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> { } }); MembersExpireOn::<T>::append(expire_on_session, member_id); + // Prune AccountIdOf + AccountIdOf::<T>::remove(member_id); } Self::deposit_event(Event::OutgoingAuthorities(members_ids_to_del.clone())); } @@ -520,9 +529,14 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> { } members_ids.clone() }) - .iter() - .filter_map(Members::<T>::get) - .map(|member_data| member_data.validator_id) + .into_iter() + .filter_map(|member_id| { + if let Some(account_id) = AccountIdOf::<T>::get(member_id) { + T::ValidatorIdOf::convert(account_id) + } else { + None + } + }) .collect(), ) } @@ -530,9 +544,14 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> { fn new_session_genesis(_new_index: SessionIndex) -> Option<Vec<T::ValidatorId>> { Some( OnlineAuthorities::<T>::get() - .iter() - .filter_map(Members::<T>::get) - .map(|member_data| member_data.validator_id) + .into_iter() + .filter_map(|member_id| { + if let Some(account_id) = AccountIdOf::<T>::get(member_id) { + T::ValidatorIdOf::convert(account_id) + } else { + None + } + }) .collect(), ) } diff --git a/pallets/authority-members/src/mock.rs b/pallets/authority-members/src/mock.rs index 326b26066..6362d638a 100644 --- a/pallets/authority-members/src/mock.rs +++ b/pallets/authority-members/src/mock.rs @@ -120,7 +120,7 @@ impl ShouldEndSession<u64> for TestShouldEndSession { impl pallet_session::Config for Test { type Event = Event; type ValidatorId = u64; - type ValidatorIdOf = sp_runtime::traits::ConvertInto; + type ValidatorIdOf = ConvertInto; type ShouldEndSession = TestShouldEndSession; type NextSessionRotation = (); type SessionManager = AuthorityMembers; @@ -154,9 +154,8 @@ impl pallet_authority_members::Config for Test { type MaxKeysLife = ConstU32<5>; type MaxOfflineSessions = ConstU32<2>; type MemberId = u64; + type MemberIdOf = ConvertInto; type OnRemovedMember = (); - type OwnerKeyOf = ConvertInto; - type RefreshValidatorIdOrigin = system::EnsureRoot<u64>; type RemoveMemberOrigin = system::EnsureRoot<u64>; } diff --git a/pallets/authority-members/src/tests.rs b/pallets/authority-members/src/tests.rs index 32d94f544..9ed210742 100644 --- a/pallets/authority-members/src/tests.rs +++ b/pallets/authority-members/src/tests.rs @@ -35,7 +35,6 @@ fn test_genesis_build() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, - validator_id: 3, }) ); assert_eq!( @@ -43,7 +42,6 @@ fn test_genesis_build() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, - validator_id: 6, }) ); assert_eq!( @@ -51,7 +49,6 @@ fn test_genesis_build() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, - validator_id: 9, }) ); @@ -97,7 +94,6 @@ fn test_max_keys_life_rule() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 7, - validator_id: 3, }) ); assert_eq!( @@ -105,7 +101,6 @@ fn test_max_keys_life_rule() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 7, - validator_id: 6, }) ); @@ -145,7 +140,6 @@ fn test_go_offline() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, - validator_id: 9, }) ); @@ -156,7 +150,6 @@ fn test_go_offline() { Some(MemberData { expire_on_session: 4, must_rotate_keys_before: 5, - validator_id: 9, }) ); assert_eq!(AuthorityMembers::members_expire_on(4), vec![9],); @@ -196,7 +189,6 @@ fn test_go_online() { Some(MemberData { expire_on_session: 2, must_rotate_keys_before: 5, - validator_id: 12, }) ); @@ -212,7 +204,6 @@ fn test_go_online() { Some(MemberData { expire_on_session: 2, must_rotate_keys_before: 5, - validator_id: 12, }) ); @@ -261,7 +252,6 @@ fn test_go_online_then_go_offline_in_same_session() { Some(MemberData { expire_on_session: 2, must_rotate_keys_before: 5, - validator_id: 12, }) ); }); @@ -289,7 +279,6 @@ fn test_go_offline_then_go_online_in_same_session() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, - validator_id: 9, }) ); }); diff --git a/pallets/authority-members/src/types.rs b/pallets/authority-members/src/types.rs index 5e5fd7007..fb3c0746e 100644 --- a/pallets/authority-members/src/types.rs +++ b/pallets/authority-members/src/types.rs @@ -24,18 +24,16 @@ use sp_staking::SessionIndex; #[cfg_attr(feature = "std", derive(Debug, Deserialize, Serialize))] #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] -pub struct MemberData<ValidatorId: Decode + Encode + TypeInfo> { +pub struct MemberData { pub expire_on_session: SessionIndex, pub must_rotate_keys_before: SessionIndex, - pub validator_id: ValidatorId, } -impl<ValidatorId: Decode + Encode + TypeInfo> MemberData<ValidatorId> { - pub fn new_genesis(must_rotate_keys_before: SessionIndex, validator_id: ValidatorId) -> Self { +impl MemberData { + pub fn new_genesis(must_rotate_keys_before: SessionIndex) -> Self { MemberData { expire_on_session: 0, must_rotate_keys_before, - validator_id, } } } diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs index 66750e685..f74ff0d0b 100644 --- a/pallets/duniter-wot/src/lib.rs +++ b/pallets/duniter-wot/src/lib.rs @@ -124,9 +124,11 @@ pub mod pallet { } } -impl<T: Config<I>, I: 'static> pallet_identity::traits::EnsureIdtyCallAllowed<T> for Pallet<T, I> +impl<AccountId, T: Config<I>, I: 'static> pallet_identity::traits::EnsureIdtyCallAllowed<T> + for Pallet<T, I> where - T: pallet_membership::Config<I, MetaData = ()>, + T: frame_system::Config<AccountId = AccountId> + + pallet_membership::Config<I, MetaData = MembershipMetaData<AccountId>>, { fn can_create_identity(creator: IdtyIndex) -> bool { if let Some(cert_meta) = pallet_certification::Pallet::<T, I>::idty_cert_meta(creator) { @@ -137,33 +139,20 @@ where false } } - fn can_confirm_identity(idty_index: IdtyIndex) -> bool { + fn can_confirm_identity(idty_index: IdtyIndex, owner_key: AccountId) -> bool { pallet_membership::Pallet::<T, I>::request_membership( RawOrigin::Root.into(), idty_index, - (), + MembershipMetaData(owner_key), ) .is_ok() } fn can_validate_identity(idty_index: IdtyIndex) -> bool { - pallet_membership::Pallet::<T, I>::claim_membership(RawOrigin::Root.into(), idty_index) - .is_ok() - } -} - -impl<T: Config<I>, I: 'static> sp_membership::traits::IsIdtyAllowedToClaimMembership<IdtyIndex> - for Pallet<T, I> -{ - fn is_idty_allowed_to_claim_membership(idty_index: &IdtyIndex) -> bool { - if T::IsSubWot::get() { - if let Some(idty_value) = pallet_identity::Pallet::<T>::identity(idty_index) { - idty_value.status == IdtyStatus::Validated - } else { - false - } - } else { - false - } + pallet_membership::Pallet::<T, I>::claim_membership( + RawOrigin::Root.into(), + Some(idty_index), + ) + .is_ok() } } @@ -195,31 +184,6 @@ impl<T: Config<I>, I: 'static> sp_membership::traits::IsIdtyAllowedToRequestMemb } } -impl<T: Config<I>, I: 'static> sp_membership::traits::IsOriginAllowedToUseIdty<T::Origin, IdtyIndex> - for Pallet<T, I> -{ - fn is_origin_allowed_to_use_idty( - origin: &T::Origin, - idty_index: &IdtyIndex, - ) -> sp_membership::OriginPermission { - match origin.clone().into() { - Ok(RawOrigin::Root) => sp_membership::OriginPermission::Root, - Ok(RawOrigin::Signed(account_id)) => { - if let Some(idty_val) = pallet_identity::Pallet::<T>::identity(idty_index) { - if account_id == idty_val.owner_key { - sp_membership::OriginPermission::Allowed - } else { - sp_membership::OriginPermission::Forbidden - } - } else { - sp_membership::OriginPermission::Forbidden - } - } - _ => sp_membership::OriginPermission::Forbidden, - } - } -} - impl<T: Config<I>, I: 'static, MetaData> sp_membership::traits::OnEvent<IdtyIndex, MetaData> for Pallet<T, I> where @@ -263,6 +227,7 @@ where sp_membership::Event::<IdtyIndex, MetaData>::PendingMembershipExpired(idty_index) => { Self::dispath_idty_call(pallet_identity::Call::remove_identity { idty_index: *idty_index, + idty_name: None, }); } } @@ -312,7 +277,7 @@ impl<T: Config<I>, I: 'static> pallet_certification::traits::OnNewcert<IdtyIndex if T::IsSubWot::get() { if let Err(e) = pallet_membership::Pallet::<T, I>::claim_membership( RawOrigin::Root.into(), - receiver, + Some(receiver), ) { sp_std::if_std! { println!("{:?}", e) @@ -352,7 +317,7 @@ impl<T: Config<I>, I: 'static> pallet_certification::traits::OnRemovedCert<IdtyI // Revoke receiver membership and disable his identity if let Err(e) = pallet_membership::Pallet::<T, I>::revoke_membership( RawOrigin::Root.into(), - receiver, + Some(receiver), ) { sp_std::if_std! { println!("{:?}", e) diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs index ed754dd40..c1080613d 100644 --- a/pallets/duniter-wot/src/mock.rs +++ b/pallets/duniter-wot/src/mock.rs @@ -112,8 +112,6 @@ impl pallet_identity::Config for Test { type Event = Event; type EnsureIdtyCallAllowed = DuniterWot; type IdtyCreationPeriod = IdtyCreationPeriod; - type IdtyData = (); - type IdtyDataProvider = (); type IdtyNameValidator = IdtyNameValidatorTestImpl; type IdtyIndex = IdtyIndex; type IdtyValidationOrigin = system::EnsureRoot<AccountId>; @@ -132,16 +130,15 @@ parameter_types! { } impl pallet_membership::Config<Instance1> for Test { - type IsIdtyAllowedToClaimMembership = DuniterWot; type IsIdtyAllowedToRenewMembership = DuniterWot; type IsIdtyAllowedToRequestMembership = DuniterWot; - type IsOriginAllowedToUseIdty = DuniterWot; type Event = Event; type ExternalizeMembershipStorage = ExternalizeMembershipStorage; type IdtyId = IdtyIndex; + type IdtyIdOf = Identity; type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = MembershipPeriod; - type MetaData = (); + type MetaData = crate::MembershipMetaData<u64>; type OnEvent = DuniterWot; type PendingMembershipPeriod = PendingMembershipPeriod; type RenewablePeriod = RenewablePeriod; @@ -179,13 +176,18 @@ pub fn new_test_ext(initial_identities_len: usize) -> sp_io::TestExternalities { system: SystemConfig::default(), identity: IdentityConfig { identities: (1..=initial_identities_len) - .map(|i| pallet_identity::IdtyValue { - data: (), - owner_key: i as u64, - name: pallet_identity::IdtyName::from(NAMES[i - 1]), - next_creatable_identity_on: 0, - removable_on: 0, - status: pallet_identity::IdtyStatus::Validated, + .map(|i| { + ( + i as u64, + ( + pallet_identity::IdtyName::from(NAMES[i - 1]), + pallet_identity::IdtyValue { + next_creatable_identity_on: 0, + removable_on: 0, + status: pallet_identity::IdtyStatus::Validated, + }, + ), + ) }) .collect(), }, diff --git a/pallets/duniter-wot/src/tests.rs b/pallets/duniter-wot/src/tests.rs index 7c001e96a..8176a1e17 100644 --- a/pallets/duniter-wot/src/tests.rs +++ b/pallets/duniter-wot/src/tests.rs @@ -48,7 +48,7 @@ fn test_creator_not_allowed_to_create_idty() { // Alice should not be able te create an identity before block #2 // because Alice.next_issuable_on = 2 assert_err!( - Identity::create_identity(Origin::signed(1), 1, IdtyName::from("Dave"), 4), + Identity::create_identity(Origin::signed(1), 4), pallet_identity::Error::<Test>::CreatorNotAllowedToCreateIdty ); }); @@ -60,12 +60,7 @@ fn test_create_idty_ok() { run_to_block(2); // Alice should be able te create an identity at block #2 - assert_ok!(Identity::create_identity( - Origin::signed(1), - 1, - IdtyName::from("Ferdie"), - 6 - )); + assert_ok!(Identity::create_identity(Origin::signed(1), 6)); // 2 events should have occurred: IdtyCreated and NewCert let events = System::events(); assert_eq!(events.len(), 2); @@ -73,10 +68,7 @@ fn test_create_idty_ok() { events[0], EventRecord { phase: Phase::Initialization, - event: Event::Identity(pallet_identity::Event::IdtyCreated( - IdtyName::from("Ferdie"), - 6 - )), + event: Event::Identity(pallet_identity::Event::IdtyCreated(6, 6)), topics: vec![], } ); @@ -104,19 +96,13 @@ fn test_new_idty_validation() { new_test_ext(5).execute_with(|| { // Alice create Ferdie identity run_to_block(2); - assert_ok!(Identity::create_identity( - Origin::signed(1), - 1, - IdtyName::from("Ferdie"), - 6 - )); + assert_ok!(Identity::create_identity(Origin::signed(1), 6)); // Ferdie confirm it's identity run_to_block(3); assert_ok!(Identity::confirm_identity( Origin::signed(6), IdtyName::from("Ferdie"), - 6 )); // Ferdie is not yet validated, so there should be no wot diff @@ -154,9 +140,7 @@ fn test_new_idty_validation() { events[2], EventRecord { phase: Phase::Initialization, - event: Event::Identity(pallet_identity::Event::IdtyValidated(IdtyName::from( - "Ferdie" - ),)), + event: Event::Identity(pallet_identity::Event::IdtyValidated(6,)), topics: vec![], } ); @@ -180,12 +164,7 @@ fn test_confirm_idty_ok() { run_to_block(2); // Alice create Ferdie identity - assert_ok!(Identity::create_identity( - Origin::signed(1), - 1, - IdtyName::from("Ferdie"), - 6 - )); + assert_ok!(Identity::create_identity(Origin::signed(1), 6)); run_to_block(3); @@ -193,7 +172,6 @@ fn test_confirm_idty_ok() { assert_ok!(Identity::confirm_identity( Origin::signed(6), IdtyName::from("Ferdie"), - 6 )); let events = System::events(); // 2 events should have occurred: MembershipRequested and IdtyConfirmed @@ -211,9 +189,11 @@ fn test_confirm_idty_ok() { events[1], EventRecord { phase: Phase::Initialization, - event: Event::Identity(pallet_identity::Event::IdtyConfirmed(IdtyName::from( - "Ferdie" - ),)), + event: Event::Identity(pallet_identity::Event::IdtyConfirmed( + 6, + 6, + IdtyName::from("Ferdie"), + )), topics: vec![], } ); @@ -226,9 +206,9 @@ fn test_idty_membership_expire_them_requested() { run_to_block(4); // Alice renew her membership - assert_ok!(Membership::renew_membership(Origin::signed(1), 1)); + assert_ok!(Membership::renew_membership(Origin::signed(1), None)); // Bob renew his membership - assert_ok!(Membership::renew_membership(Origin::signed(2), 2)); + assert_ok!(Membership::renew_membership(Origin::signed(2), None)); // Charlie's membership should expire at block #5 run_to_block(5); @@ -253,7 +233,11 @@ fn test_idty_membership_expire_them_requested() { // Charlie should be able to request membership run_to_block(6); - assert_ok!(Membership::request_membership(Origin::signed(3), 3, ())); + assert_ok!(Membership::request_membership( + Origin::signed(3), + 3, + crate::MembershipMetaData(3) + )); // Charlie should re-enter in the wot immediatly let events = System::events(); @@ -278,9 +262,7 @@ fn test_idty_membership_expire_them_requested() { events[2], EventRecord { phase: Phase::Initialization, - event: Event::Identity(pallet_identity::Event::IdtyValidated(IdtyName::from( - "Charlie" - ))), + event: Event::Identity(pallet_identity::Event::IdtyValidated(3)), topics: vec![], } ); diff --git a/pallets/duniter-wot/src/types.rs b/pallets/duniter-wot/src/types.rs index fc72ef21a..639eda216 100644 --- a/pallets/duniter-wot/src/types.rs +++ b/pallets/duniter-wot/src/types.rs @@ -32,8 +32,8 @@ impl<T: Config<I>, I: 'static> EnsureOrigin<(T::Origin, IdtyIndex, IdtyIndex)> match o.0.clone().into() { Ok(frame_system::RawOrigin::Root) => Ok(()), Ok(frame_system::RawOrigin::Signed(who)) => { - if let Some(issuer) = pallet_identity::Pallet::<T>::identity(o.1) { - if who == issuer.owner_key { + if let Some(idty_index) = pallet_identity::Pallet::<T>::identity_index_of(who) { + if o.1 == idty_index { if let Some(receiver) = pallet_identity::Pallet::<T>::identity(o.2) { match receiver.status { IdtyStatus::ConfirmedByOwner => Ok(()), @@ -92,6 +92,24 @@ impl<T: Config<I>, I: 'static> EnsureOrigin<(T::Origin, IdtyIndex, IdtyIndex)> } } +#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, TypeInfo)] +pub struct MembershipMetaData<AccountId>(pub AccountId); +impl<AccountId: Eq> sp_membership::traits::Validate<AccountId> for MembershipMetaData<AccountId> { + fn validate(&self, account_id: &AccountId) -> bool { + &self.0 == account_id + } +} +/*impl From<AccountId> for MembershipMetaData { + fn from(account_id: AccountId) -> Self { + Self(account_id) + } +}*/ +/*impl Into<AccountId> for MembershipMetaData { + fn into(self) -> AccountId { + self.0 + } +}*/ + #[cfg_attr(feature = "std", derive(Debug))] #[derive(codec::Decode, codec::Encode, Eq, PartialEq, TypeInfo)] pub enum WotDiff { diff --git a/pallets/identity/Cargo.toml b/pallets/identity/Cargo.toml index 8537bccbc..8a206f695 100644 --- a/pallets/identity/Cargo.toml +++ b/pallets/identity/Cargo.toml @@ -80,6 +80,9 @@ version = '1.0.119' ### DEV ### +[dev-dependencies.maplit] +version = '1.0.2' + [dev-dependencies.sp-io] git = 'https://github.com/librelois/substrate.git' branch = 'duniter-monthly-2022-01' diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs index 7e8564c29..7f38b9bb1 100644 --- a/pallets/identity/src/lib.rs +++ b/pallets/identity/src/lib.rs @@ -67,10 +67,6 @@ pub mod pallet { type EnsureIdtyCallAllowed: EnsureIdtyCallAllowed<Self>; /// Minimum duration between the creation of 2 identities by the same creator type IdtyCreationPeriod: Get<Self::BlockNumber>; - /// Identity custom data - type IdtyData: Parameter + Member + MaybeSerializeDeserialize + Debug + Default; - /// Identity custom data provider - type IdtyDataProvider: ProvideIdtyData<Self>; /// A short identity index. type IdtyIndex: Parameter + Member @@ -99,7 +95,10 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig<T: Config> { - pub identities: Vec<IdtyValue<T::AccountId, T::BlockNumber, T::IdtyData>>, + pub identities: sp_std::collections::btree_map::BTreeMap< + T::AccountId, + (IdtyName, IdtyValue<T::BlockNumber>), + >, } #[cfg(feature = "std")] @@ -115,22 +114,18 @@ pub mod pallet { impl<T: Config> GenesisBuild<T> for GenesisConfig<T> { fn build(&self) { let mut names = sp_std::collections::btree_set::BTreeSet::new(); - for idty_value in &self.identities { + for (idty_name, idty_value) in self.identities.values() { assert!( - !names.contains(&idty_value.name), + !names.contains(&idty_name), "Idty name {:?} is present twice", - &idty_value.name + &idty_name ); assert!(idty_value.removable_on == T::BlockNumber::zero()); - names.insert(idty_value.name.clone()); + names.insert(idty_name); } - // We need to sort identities to ensure determinisctic result - let mut identities = self.identities.clone(); - identities.sort_by(|idty_val_1, idty_val_2| idty_val_1.name.cmp(&idty_val_2.name)); - <IdentitiesCount<T>>::put(self.identities.len() as u64); - for idty_value in &identities { + for (owner_key, (idty_name, idty_value)) in &self.identities { let idty_index = Pallet::<T>::get_next_idty_index(); if idty_value.removable_on > T::BlockNumber::zero() { <IdentitiesRemovableOn<T>>::append( @@ -139,27 +134,27 @@ pub mod pallet { ) } <Identities<T>>::insert(idty_index, idty_value); + IdentitiesNames::<T>::insert(idty_name, ()); + IdentityIndexOf::<T>::insert(owner_key, idty_index); } } } // STORAGE // - /// Identities #[pallet::storage] #[pallet::getter(fn identity)] - pub type Identities<T: Config> = StorageMap< - _, - Twox64Concat, - T::IdtyIndex, - IdtyValue<T::AccountId, T::BlockNumber, T::IdtyData>, - OptionQuery, - >; + pub type Identities<T: Config> = + StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyValue<T::BlockNumber>, OptionQuery>; + + #[pallet::storage] + #[pallet::getter(fn identity_index_of)] + pub type IdentityIndexOf<T: Config> = + StorageMap<_, Blake2_128, T::AccountId, T::IdtyIndex, OptionQuery>; #[pallet::storage] #[pallet::getter(fn identity_by_did)] - pub type IdentitiesNames<T: Config> = - StorageMap<_, Blake2_128, IdtyName, T::IdtyIndex, ValueQuery>; + pub type IdentitiesNames<T: Config> = StorageMap<_, Blake2_128, IdtyName, (), OptionQuery>; #[pallet::storage] pub(super) type NextIdtyIndex<T: Config> = StorageValue<_, T::IdtyIndex, ValueQuery>; @@ -195,14 +190,14 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event<T: Config> { /// A new identity has been created - /// [idty, owner_key] - IdtyCreated(IdtyName, T::AccountId), + /// [idty_index, owner_key] + IdtyCreated(T::IdtyIndex, T::AccountId), /// An identity has been confirmed by it's owner - /// [idty] - IdtyConfirmed(IdtyName), + /// [idty_index, owner_key, name] + IdtyConfirmed(T::IdtyIndex, T::AccountId, IdtyName), /// An identity has been validated - /// [idty] - IdtyValidated(IdtyName), + /// [idty_index] + IdtyValidated(T::IdtyIndex), } // CALLS // @@ -215,19 +210,15 @@ pub mod pallet { #[pallet::weight(0)] pub fn create_identity( origin: OriginFor<T>, - creator: T::IdtyIndex, - idty_name: IdtyName, owner_key: T::AccountId, ) -> DispatchResultWithPostInfo { // Verification phase // let who = ensure_signed(origin)?; + let creator = + IdentityIndexOf::<T>::try_get(&who).map_err(|_| Error::<T>::IdtyIndexNotFound)?; let creator_idty_val = - Identities::<T>::try_get(&creator).map_err(|_| Error::<T>::CreatorNotExist)?; - - if who != creator_idty_val.owner_key { - return Err(Error::<T>::RequireToBeOwner.into()); - } + Identities::<T>::try_get(&creator).map_err(|_| Error::<T>::IdtyNotFound)?; if !T::EnsureIdtyCallAllowed::can_create_identity(creator) { return Err(Error::<T>::CreatorNotAllowedToCreateIdty.into()); @@ -239,13 +230,6 @@ pub mod pallet { return Err(Error::<T>::NotRespectIdtyCreationPeriod.into()); } - if !T::IdtyNameValidator::validate(&idty_name) { - return Err(Error::<T>::IdtyNameInvalid.into()); - } - if <IdentitiesNames<T>>::contains_key(&idty_name) { - return Err(Error::<T>::IdtyNameAlreadyExist.into()); - } - // Apply phase // <Identities<T>>::mutate_exists(creator, |idty_val_opt| { @@ -255,27 +239,21 @@ pub mod pallet { } }); - let idty_data = - T::IdtyDataProvider::provide_identity_data(creator, &idty_name, &owner_key); - let removable_on = block_number + T::ConfirmPeriod::get(); let idty_index = Self::get_next_idty_index(); <Identities<T>>::insert( idty_index, IdtyValue { - name: idty_name.clone(), next_creatable_identity_on: T::BlockNumber::zero(), - owner_key: owner_key.clone(), removable_on, status: IdtyStatus::Created, - data: idty_data, }, ); - <IdentitiesNames<T>>::insert(idty_name.clone(), idty_index); IdentitiesRemovableOn::<T>::append(removable_on, (idty_index, IdtyStatus::Created)); + IdentityIndexOf::<T>::insert(owner_key.clone(), idty_index); Self::inc_identities_counter(); - Self::deposit_event(Event::IdtyCreated(idty_name, owner_key)); + Self::deposit_event(Event::IdtyCreated(idty_index, owner_key)); T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Created { creator }); Ok(().into()) } @@ -283,64 +261,68 @@ pub mod pallet { pub fn confirm_identity( origin: OriginFor<T>, idty_name: IdtyName, - idty_index: T::IdtyIndex, ) -> DispatchResultWithPostInfo { + // Verification phase // let who = ensure_signed(origin)?; - if let Ok(mut idty_value) = <Identities<T>>::try_get(idty_index) { - if who == idty_value.owner_key { - if idty_value.status != IdtyStatus::Created { - return Err(Error::<T>::IdtyAlreadyConfirmed.into()); - } - if idty_value.name != idty_name { - return Err(Error::<T>::NotSameIdtyName.into()); - } - if !T::EnsureIdtyCallAllowed::can_confirm_identity(idty_index) { - return Err(Error::<T>::NotAllowedToConfirmIdty.into()); - } + let idty_index = + IdentityIndexOf::<T>::try_get(&who).map_err(|_| Error::<T>::IdtyIndexNotFound)?; - idty_value.status = IdtyStatus::ConfirmedByOwner; + let mut idty_value = + Identities::<T>::try_get(idty_index).map_err(|_| Error::<T>::IdtyNotFound)?; - <Identities<T>>::insert(idty_index, idty_value); - Self::deposit_event(Event::IdtyConfirmed(idty_name)); - T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Confirmed); - Ok(().into()) - } else { - Err(Error::<T>::RequireToBeOwner.into()) - } - } else { - Err(Error::<T>::IdtyNotFound.into()) + if idty_value.status != IdtyStatus::Created { + return Err(Error::<T>::IdtyAlreadyConfirmed.into()); + } + if !T::IdtyNameValidator::validate(&idty_name) { + return Err(Error::<T>::IdtyNameInvalid.into()); + } + if <IdentitiesNames<T>>::contains_key(&idty_name) { + return Err(Error::<T>::IdtyNameAlreadyExist.into()); + } + if !T::EnsureIdtyCallAllowed::can_confirm_identity(idty_index, who.clone()) { + return Err(Error::<T>::NotAllowedToConfirmIdty.into()); } + + // Apply phase // + idty_value.status = IdtyStatus::ConfirmedByOwner; + + <Identities<T>>::insert(idty_index, idty_value); + <IdentitiesNames<T>>::insert(idty_name.clone(), ()); + Self::deposit_event(Event::IdtyConfirmed(idty_index, who, idty_name)); + T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Confirmed); + Ok(().into()) } #[pallet::weight(0)] pub fn validate_identity( origin: OriginFor<T>, idty_index: T::IdtyIndex, ) -> DispatchResultWithPostInfo { + // Verification phase // T::IdtyValidationOrigin::ensure_origin(origin)?; - if let Ok(mut idty_value) = <Identities<T>>::try_get(idty_index) { - match idty_value.status { - IdtyStatus::Created => Err(Error::<T>::IdtyNotConfirmedByOwner.into()), - IdtyStatus::ConfirmedByOwner | IdtyStatus::Disabled => { - if !T::EnsureIdtyCallAllowed::can_validate_identity(idty_index) { - return Err(Error::<T>::NotAllowedToValidateIdty.into()); - } - - idty_value.removable_on = T::BlockNumber::zero(); - idty_value.status = IdtyStatus::Validated; - let name = idty_value.name.clone(); - - <Identities<T>>::insert(idty_index, idty_value); - Self::deposit_event(Event::IdtyValidated(name)); - T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Validated); - Ok(().into()) + let mut idty_value = + Identities::<T>::try_get(idty_index).map_err(|_| Error::<T>::IdtyNotFound)?; + + match idty_value.status { + IdtyStatus::Created => return Err(Error::<T>::IdtyNotConfirmedByOwner.into()), + IdtyStatus::ConfirmedByOwner | IdtyStatus::Disabled => { + if !T::EnsureIdtyCallAllowed::can_validate_identity(idty_index) { + return Err(Error::<T>::NotAllowedToValidateIdty.into()); } - IdtyStatus::Validated => Err(Error::<T>::IdtyAlreadyValidated.into()), } - } else { - Err(Error::<T>::IdtyNotFound.into()) + IdtyStatus::Validated => return Err(Error::<T>::IdtyAlreadyValidated.into()), } + + // Apply phase // + idty_value.removable_on = T::BlockNumber::zero(); + idty_value.status = IdtyStatus::Validated; + + <Identities<T>>::insert(idty_index, idty_value); + Self::deposit_event(Event::IdtyValidated(idty_index)); + T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Validated); + + Ok(().into()) } #[pallet::weight(0)] pub fn disable_identity( @@ -371,10 +353,49 @@ pub mod pallet { pub fn remove_identity( origin: OriginFor<T>, idty_index: T::IdtyIndex, + idty_name: Option<IdtyName>, ) -> DispatchResultWithPostInfo { ensure_root(origin)?; Self::do_remove_identity(idty_index); + if let Some(idty_name) = idty_name { + <IdentitiesNames<T>>::remove(idty_name); + } + + Ok(().into()) + } + + #[pallet::weight(0)] + pub fn prune_item_identities_names( + origin: OriginFor<T>, + names: Vec<IdtyName>, + ) -> DispatchResultWithPostInfo { + ensure_root(origin)?; + + for name in names { + <IdentitiesNames<T>>::remove(name); + } + + Ok(().into()) + } + + #[pallet::weight(0)] + pub fn prune_item_identity_index_of( + origin: OriginFor<T>, + accounts_ids: Vec<T::AccountId>, + ) -> DispatchResultWithPostInfo { + ensure_root(origin)?; + + accounts_ids + .into_iter() + .filter(|account_id| { + if let Ok(idty_index) = IdentityIndexOf::<T>::try_get(&account_id) { + !Identities::<T>::contains_key(&idty_index) + } else { + false + } + }) + .for_each(IdentityIndexOf::<T>::remove); Ok(().into()) } @@ -384,8 +405,6 @@ pub mod pallet { #[pallet::error] pub enum Error<T> { - /// Creator not exist - CreatorNotExist, /// Creator not allowed to create identities CreatorNotAllowedToCreateIdty, /// Identity already confirmed @@ -394,6 +413,8 @@ pub mod pallet { IdtyAlreadyValidated, /// You are not allowed to create a new identity now IdtyCreationNotAllowed, + /// Identity index not found + IdtyIndexNotFound, /// Identity name already exist IdtyNameAlreadyExist, /// Idty name invalid @@ -414,8 +435,6 @@ pub mod pallet { NotAllowedToValidateIdty, /// Not same identity name NotSameIdtyName, - /// This operation requires to be the owner of the identity - RequireToBeOwner, /// Right already added RightAlreadyAdded, /// Right not exist @@ -424,18 +443,6 @@ pub mod pallet { NotRespectIdtyCreationPeriod, } - // PUBLIC FUNCTIONS // - - impl<T: Config> Pallet<T> { - pub fn set_idty_data(idty_index: T::IdtyIndex, idty_data: T::IdtyData) { - Identities::<T>::mutate_exists(idty_index, |idty_val_opt| { - if let Some(ref mut idty_val) = idty_val_opt { - idty_val.data = idty_data; - } - }); - } - } - // INTERNAL FUNCTIONS // impl<T: Config> Pallet<T> { @@ -447,9 +454,7 @@ pub mod pallet { } } pub(super) fn do_remove_identity(idty_index: T::IdtyIndex) -> Weight { - if let Some(idty_val) = <Identities<T>>::take(idty_index) { - <IdentitiesNames<T>>::remove(idty_val.name); - } + <Identities<T>>::remove(idty_index); Self::dec_identities_counter(); T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed); @@ -486,3 +491,9 @@ pub mod pallet { } } } + +impl<T: Config> sp_runtime::traits::Convert<T::AccountId, Option<T::IdtyIndex>> for Pallet<T> { + fn convert(account_id: T::AccountId) -> Option<T::IdtyIndex> { + Self::identity_index_of(account_id) + } +} diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs index 57b7bbc2d..1cea91aa9 100644 --- a/pallets/identity/src/mock.rs +++ b/pallets/identity/src/mock.rs @@ -104,8 +104,6 @@ impl pallet_identity::Config for Test { type Event = Event; type EnsureIdtyCallAllowed = (); type IdtyCreationPeriod = IdtyCreationPeriod; - type IdtyData = (); - type IdtyDataProvider = (); type IdtyNameValidator = IdtyNameValidatorTestImpl; type IdtyIndex = u64; type IdtyValidationOrigin = system::EnsureRoot<AccountId>; diff --git a/pallets/identity/src/tests.rs b/pallets/identity/src/tests.rs index 2d59bcdd4..f29ed1844 100644 --- a/pallets/identity/src/tests.rs +++ b/pallets/identity/src/tests.rs @@ -19,83 +19,50 @@ use crate::{Error, IdtyName, IdtyValue}; //use frame_support::assert_err; use frame_support::assert_ok; use frame_system::{EventRecord, Phase}; +use maplit::btreemap; +use std::collections::BTreeMap; -type IdtyVal = IdtyValue<u64, u64, ()>; +type IdtyVal = IdtyValue<u64>; -fn alice() -> IdtyVal { - IdtyVal { - data: (), - owner_key: 1, - name: IdtyName::from("Alice"), - next_creatable_identity_on: 0, - removable_on: 0, - status: crate::IdtyStatus::Validated, - } +fn alice() -> (IdtyName, IdtyVal) { + ( + IdtyName::from("Alice"), + IdtyVal { + next_creatable_identity_on: 0, + removable_on: 0, + status: crate::IdtyStatus::Validated, + }, + ) } #[test] fn test_no_identity() { new_test_ext(IdentityConfig { - identities: Vec::with_capacity(0), + identities: BTreeMap::new(), }) .execute_with(|| { assert_eq!(Identity::identities_count(), 0); }); } -#[test] -fn test_creator_not_exist() { - new_test_ext(IdentityConfig { - identities: Vec::with_capacity(0), - }) - .execute_with(|| { - assert_eq!( - Identity::create_identity(Origin::signed(1), 1, IdtyName::from("bob"), 2), - Err(Error::<Test>::CreatorNotExist.into()) - ); - }); -} - -#[test] -fn test_creator_not_owner() { - new_test_ext(IdentityConfig { - identities: vec![alice()], - }) - .execute_with(|| { - // We need to initialize at least one block before any call - run_to_block(1); - - // Someone try to create an identity pretending to be Alice - assert_eq!( - Identity::create_identity(Origin::signed(2), 1, IdtyName::from("Charlie"), 3), - Err(Error::<Test>::RequireToBeOwner.into()) - ); - }) -} - #[test] fn test_create_identity_ok() { new_test_ext(IdentityConfig { - identities: vec![alice()], + identities: btreemap![1 => alice()], }) .execute_with(|| { // We need to initialize at least one block before any call run_to_block(1); // Alice should be able te create an identity - assert_ok!(Identity::create_identity( - Origin::signed(1), - 1, - IdtyName::from("bob"), - 2 - )); + assert_ok!(Identity::create_identity(Origin::signed(1), 2)); let events = System::events(); assert_eq!(events.len(), 1); assert_eq!( events[0], EventRecord { phase: Phase::Initialization, - event: Event::Identity(crate::Event::IdtyCreated(IdtyName::from("bob"), 2)), + event: Event::Identity(crate::Event::IdtyCreated(2, 2)), topics: vec![], } ); @@ -105,26 +72,21 @@ fn test_create_identity_ok() { #[test] fn test_idty_creation_period() { new_test_ext(IdentityConfig { - identities: vec![alice()], + identities: btreemap![1 => alice()], }) .execute_with(|| { // We need to initialize at least one block before any call run_to_block(1); // Alice should be able te create an identity - assert_ok!(Identity::create_identity( - Origin::signed(1), - 1, - IdtyName::from("bob"), - 2 - )); + assert_ok!(Identity::create_identity(Origin::signed(1), 2)); let events = System::events(); assert_eq!(events.len(), 1); assert_eq!( events[0], EventRecord { phase: Phase::Initialization, - event: Event::Identity(crate::Event::IdtyCreated(IdtyName::from("bob"), 2)), + event: Event::Identity(crate::Event::IdtyCreated(2, 2)), topics: vec![], } ); @@ -133,25 +95,20 @@ fn test_idty_creation_period() { // Alice cannot create a new identity before block #4 run_to_block(2); assert_eq!( - Identity::create_identity(Origin::signed(1), 1, IdtyName::from("Charlie"), 3), + Identity::create_identity(Origin::signed(1), 3), Err(Error::<Test>::NotRespectIdtyCreationPeriod.into()) ); // Alice should be able te create a second identity after block #4 run_to_block(4); - assert_ok!(Identity::create_identity( - Origin::signed(1), - 1, - IdtyName::from("Charlie"), - 3 - )); + assert_ok!(Identity::create_identity(Origin::signed(1), 3)); let events = System::events(); assert_eq!(events.len(), 1); assert_eq!( events[0], EventRecord { phase: Phase::Initialization, - event: Event::Identity(crate::Event::IdtyCreated(IdtyName::from("Charlie"), 3)), + event: Event::Identity(crate::Event::IdtyCreated(3, 3)), topics: vec![], } ); diff --git a/pallets/identity/src/traits.rs b/pallets/identity/src/traits.rs index 5ddbf29c8..9163e2f17 100644 --- a/pallets/identity/src/traits.rs +++ b/pallets/identity/src/traits.rs @@ -19,7 +19,7 @@ use frame_support::pallet_prelude::*; pub trait EnsureIdtyCallAllowed<T: Config> { fn can_create_identity(creator: T::IdtyIndex) -> bool; - fn can_confirm_identity(idty_index: T::IdtyIndex) -> bool; + fn can_confirm_identity(idty_index: T::IdtyIndex, owner_key: T::AccountId) -> bool; fn can_validate_identity(idty_index: T::IdtyIndex) -> bool; } @@ -27,7 +27,7 @@ impl<T: Config> EnsureIdtyCallAllowed<T> for () { fn can_create_identity(_: T::IdtyIndex) -> bool { true } - fn can_confirm_identity(_: T::IdtyIndex) -> bool { + fn can_confirm_identity(_: T::IdtyIndex, _: T::AccountId) -> bool { true } fn can_validate_identity(_: T::IdtyIndex) -> bool { @@ -35,27 +35,6 @@ impl<T: Config> EnsureIdtyCallAllowed<T> for () { } } -pub trait ProvideIdtyData<T: Config> { - fn provide_identity_data( - creator: T::IdtyIndex, - idty_name: &IdtyName, - idty_owner_key: &T::AccountId, - ) -> T::IdtyData; -} - -impl<T: Config> ProvideIdtyData<T> for () -where - T::IdtyData: Default, -{ - fn provide_identity_data( - _creator: T::IdtyIndex, - _idty_name: &IdtyName, - _idty_owner_key: &T::AccountId, - ) -> T::IdtyData { - Default::default() - } -} - pub trait IdtyNameValidator { fn validate(idty_name: &IdtyName) -> bool; } diff --git a/pallets/identity/src/types.rs b/pallets/identity/src/types.rs index 9418974fe..e3070a1e1 100644 --- a/pallets/identity/src/types.rs +++ b/pallets/identity/src/types.rs @@ -80,14 +80,7 @@ impl Default for IdtyStatus { #[cfg_attr(feature = "std", derive(Deserialize, Serialize))] #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] -pub struct IdtyValue< - AccountId: Decode + Encode + TypeInfo, - BlockNumber: Decode + Encode + TypeInfo, - IdtyData: Decode + Encode + TypeInfo, -> { - pub data: IdtyData, - pub owner_key: AccountId, - pub name: IdtyName, +pub struct IdtyValue<BlockNumber: Decode + Encode + TypeInfo> { pub next_creatable_identity_on: BlockNumber, pub removable_on: BlockNumber, pub status: IdtyStatus, diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs index 14183b79b..69b98c6f3 100644 --- a/pallets/membership/src/lib.rs +++ b/pallets/membership/src/lib.rs @@ -29,9 +29,11 @@ mod benchmarking;*/ pub use pallet::*; use frame_support::dispatch::Weight; -use frame_support::pallet_prelude::DispatchResultWithPostInfo; +use frame_support::error::BadOrigin; +use frame_support::pallet_prelude::*; +use frame_system::RawOrigin; use sp_membership::traits::*; -use sp_membership::{MembershipData, OriginPermission}; +use sp_membership::MembershipData; use sp_runtime::traits::Zero; use sp_std::prelude::*; #[cfg(feature = "std")] @@ -40,10 +42,9 @@ use std::collections::BTreeMap; #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::pallet_prelude::*; use frame_support::traits::StorageVersion; use frame_system::pallet_prelude::*; - use sp_runtime::traits::IsMember; + use sp_runtime::traits::{Convert, IsMember}; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -57,10 +58,8 @@ pub mod pallet { #[pallet::config] pub trait Config<I: 'static = ()>: frame_system::Config { - type IsIdtyAllowedToClaimMembership: IsIdtyAllowedToClaimMembership<Self::IdtyId>; type IsIdtyAllowedToRenewMembership: IsIdtyAllowedToRenewMembership<Self::IdtyId>; type IsIdtyAllowedToRequestMembership: IsIdtyAllowedToRequestMembership<Self::IdtyId>; - type IsOriginAllowedToUseIdty: IsOriginAllowedToUseIdty<Self::Origin, Self::IdtyId>; /// Because this pallet emits events, it depends on the runtime's definition of an event. type Event: From<Event<Self, I>> + IsType<<Self as frame_system::Config>::Event>; /// Specify true if you want to externalize the storage of memberships, but in this case @@ -68,8 +67,9 @@ pub mod pallet { type ExternalizeMembershipStorage: Get<bool>; /// Something that identifies an identity type IdtyId: Copy + MaybeSerializeDeserialize + Parameter + Ord; + type IdtyIdOf: Convert<Self::AccountId, Option<Self::IdtyId>>; /// Optional metadata - type MetaData: Parameter; + type MetaData: Parameter + Validate<Self::AccountId>; /// Provide your implementation of membership storage here, if you want the pallet to /// handle the storage for you, specify `()` and set `ExternalizeMembershipStorage` to /// `false`. @@ -181,12 +181,14 @@ pub mod pallet { #[pallet::error] pub enum Error<T, I = ()> { - /// Identity not allowed to claim membership - IdtyNotAllowedToClaimMembership, /// Identity not allowed to request membership IdtyNotAllowedToRequestMembership, /// Identity not allowed to renew membership IdtyNotAllowedToRenewMembership, + /// Invalid meta data + InvalidMetaData, + /// Identity id not found + IdtyIdNotFound, /// Membership already acquired MembershipAlreadyAcquired, /// Membership already requested @@ -228,22 +230,22 @@ pub mod pallet { idty_id: T::IdtyId, metadata: T::MetaData, ) -> DispatchResultWithPostInfo { - let allowed = - match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id) - { - OriginPermission::Forbidden => { - return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into()) + let is_root = match origin.into() { + Ok(RawOrigin::Root) => true, + Ok(RawOrigin::Signed(account_id)) => { + if let Some(expected_idty_id) = T::IdtyIdOf::convert(account_id.clone()) { + if idty_id != expected_idty_id { + return Err(BadOrigin.into()); + } else if !metadata.validate(&account_id) { + return Err(Error::<T, I>::InvalidMetaData.into()); + } + } else { + return Err(Error::<T, I>::IdtyIdNotFound.into()); } - OriginPermission::Allowed => { - T::IsIdtyAllowedToRequestMembership::is_idty_allowed_to_request_membership( - &idty_id, - ) - } - OriginPermission::Root => true, - }; - if !allowed { - return Err(Error::<T, I>::IdtyNotAllowedToRequestMembership.into()); - } + false + } + _ => return Err(BadOrigin.into()), + }; if PendingMembership::<T, I>::contains_key(&idty_id) { return Err(Error::<T, I>::MembershipAlreadyRequested.into()); } @@ -253,6 +255,13 @@ pub mod pallet { if RevokedMembership::<T, I>::contains_key(&idty_id) { return Err(Error::<T, I>::MembershipRevokedRecently.into()); } + if !is_root + && !T::IsIdtyAllowedToRequestMembership::is_idty_allowed_to_request_membership( + &idty_id, + ) + { + return Err(Error::<T, I>::IdtyNotAllowedToRequestMembership.into()); + } let block_number = frame_system::pallet::Pallet::<T>::block_number(); let expire_on = block_number + T::PendingMembershipPeriod::get(); @@ -268,28 +277,14 @@ pub mod pallet { #[pallet::weight(0)] pub fn claim_membership( origin: OriginFor<T>, - idty_id: T::IdtyId, + maybe_idty_id: Option<T::IdtyId>, ) -> DispatchResultWithPostInfo { // Verify phase + let idty_id = Self::ensure_origin_and_get_idty_id(origin, maybe_idty_id)?; + if Membership::<T, I>::contains_key(&idty_id) { return Err(Error::<T, I>::MembershipAlreadyAcquired.into()); } - let allowed = - match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id) - { - OriginPermission::Forbidden => { - return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into()) - } - OriginPermission::Allowed => { - T::IsIdtyAllowedToClaimMembership::is_idty_allowed_to_claim_membership( - &idty_id, - ) - } - OriginPermission::Root => true, - }; - if !allowed { - return Err(Error::<T, I>::IdtyNotAllowedToClaimMembership.into()); - } let metadata = PendingMembership::<T, I>::take(&idty_id) .ok_or(Error::<T, I>::MembershipRequestNotFound)?; @@ -305,22 +300,12 @@ pub mod pallet { #[pallet::weight(0)] pub fn renew_membership( origin: OriginFor<T>, - idty_id: T::IdtyId, + maybe_idty_id: Option<T::IdtyId>, ) -> DispatchResultWithPostInfo { - let allowed = - match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id) - { - OriginPermission::Forbidden => { - return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into()) - } - OriginPermission::Allowed => { - T::IsIdtyAllowedToRenewMembership::is_idty_allowed_to_renew_membership( - &idty_id, - ) - } - OriginPermission::Root => true, - }; - if !allowed { + // Verify phase + let idty_id = Self::ensure_origin_and_get_idty_id(origin, maybe_idty_id)?; + + if !T::IsIdtyAllowedToRenewMembership::is_idty_allowed_to_renew_membership(&idty_id) { return Err(Error::<T, I>::IdtyNotAllowedToRenewMembership.into()); } @@ -341,14 +326,12 @@ pub mod pallet { #[pallet::weight(0)] pub fn revoke_membership( origin: OriginFor<T>, - idty_id: T::IdtyId, + maybe_idty_id: Option<T::IdtyId>, ) -> DispatchResultWithPostInfo { - if T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id) - == OriginPermission::Forbidden - { - return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into()); - } + // Verify phase + let idty_id = Self::ensure_origin_and_get_idty_id(origin, maybe_idty_id)?; + // Apply phase let _ = Self::do_revoke_membership(idty_id); Ok(().into()) @@ -393,6 +376,19 @@ pub mod pallet { 0 } + fn ensure_origin_and_get_idty_id( + origin: OriginFor<T>, + maybe_idty_id: Option<T::IdtyId>, + ) -> Result<T::IdtyId, DispatchError> { + match origin.into() { + Ok(RawOrigin::Root) => { + maybe_idty_id.ok_or_else(|| Error::<T, I>::IdtyIdNotFound.into()) + } + Ok(RawOrigin::Signed(account_id)) => T::IdtyIdOf::convert(account_id) + .ok_or_else(|| Error::<T, I>::IdtyIdNotFound.into()), + _ => Err(BadOrigin.into()), + } + } fn expire_memberships(block_number: T::BlockNumber) -> Weight { let mut total_weight: Weight = 0; diff --git a/pallets/membership/src/mock.rs b/pallets/membership/src/mock.rs index 27abbf1c3..507443161 100644 --- a/pallets/membership/src/mock.rs +++ b/pallets/membership/src/mock.rs @@ -21,11 +21,9 @@ use frame_support::{ }; use frame_system as system; use sp_core::H256; -use sp_membership::traits::IsOriginAllowedToUseIdty; -use sp_membership::OriginPermission; use sp_runtime::{ testing::Header, - traits::{BlakeTwo256, IdentityLookup}, + traits::{BlakeTwo256, ConvertInto, IdentityLookup}, BuildStorage, }; @@ -79,19 +77,6 @@ impl system::Config for Test { type MaxConsumers = frame_support::traits::ConstU32<16>; } -pub struct IsOriginAllowedToUseIdtyImpl; -impl IsOriginAllowedToUseIdty<Origin, IdtyId> for IsOriginAllowedToUseIdtyImpl { - fn is_origin_allowed_to_use_idty(o: &Origin, idty_id: &IdtyId) -> OriginPermission { - match o.clone().into() { - Ok(system::RawOrigin::Root) => OriginPermission::Root, - Ok(system::RawOrigin::Signed(account_id)) if account_id == *idty_id => { - OriginPermission::Allowed - } - _ => OriginPermission::Forbidden, - } - } -} - parameter_types! { pub const ExternalizeMembershipStorage: bool = false; pub const MembershipPeriod: BlockNumber = 5; @@ -101,13 +86,12 @@ parameter_types! { } impl pallet_membership::Config for Test { - type IsIdtyAllowedToClaimMembership = (); type IsIdtyAllowedToRenewMembership = (); type IsIdtyAllowedToRequestMembership = (); - type IsOriginAllowedToUseIdty = IsOriginAllowedToUseIdtyImpl; type Event = Event; type ExternalizeMembershipStorage = ExternalizeMembershipStorage; type IdtyId = IdtyId; + type IdtyIdOf = ConvertInto; type MembershipExternalStorage = crate::NoExternalStorage; type MembershipPeriod = MembershipPeriod; type MetaData = (); diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs index 183a0d1f8..7ff7ab9eb 100644 --- a/pallets/membership/src/tests.rs +++ b/pallets/membership/src/tests.rs @@ -55,7 +55,7 @@ fn test_membership_not_yet_renewable() { run_to_block(1); // Merbership 0 cannot be renewed before #2 assert_eq!( - DefaultMembership::renew_membership(Origin::signed(0), 0), + DefaultMembership::renew_membership(Origin::signed(0), None), Err(Error::<Test, _>::MembershipNotYetRenewable.into()) ); }); @@ -67,7 +67,7 @@ fn test_membership_already_acquired() { run_to_block(1); // Merbership 0 cannot be reclaimed assert_eq!( - DefaultMembership::claim_membership(Origin::signed(0), 0), + DefaultMembership::claim_membership(Origin::signed(0), None), Err(Error::<Test, _>::MembershipAlreadyAcquired.into()) ); }); @@ -79,7 +79,7 @@ fn test_membership_request_not_found() { run_to_block(1); // Merbership 0 cannot be reclaimed assert_eq!( - DefaultMembership::claim_membership(Origin::signed(1), 1), + DefaultMembership::claim_membership(Origin::signed(1), None), Err(Error::<Test, _>::MembershipRequestNotFound.into()) ); }); @@ -90,7 +90,7 @@ fn test_membership_renewal() { new_test_ext(default_gen_conf()).execute_with(|| { run_to_block(2); // Merbership 0 can be renewable on block #2 - assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), 0),); + assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), None),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipRenewed(0)) @@ -119,7 +119,10 @@ fn test_membership_revocation() { new_test_ext(default_gen_conf()).execute_with(|| { run_to_block(1); // Merbership 0 can be revocable on block #1 - assert_ok!(DefaultMembership::revoke_membership(Origin::signed(0), 0),); + assert_ok!(DefaultMembership::revoke_membership( + Origin::signed(0), + None + ),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipRevoked(0)) @@ -192,7 +195,7 @@ fn test_membership_workflow() { // Then, idty 0 claim membership run_to_block(2); - assert_ok!(DefaultMembership::claim_membership(Origin::signed(0), 0,),); + assert_ok!(DefaultMembership::claim_membership(Origin::signed(0), None),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipAcquired(0)) @@ -201,13 +204,13 @@ fn test_membership_workflow() { // Then, idty 0 claim renewal, should fail run_to_block(3); assert_eq!( - DefaultMembership::renew_membership(Origin::signed(0), 0), + DefaultMembership::renew_membership(Origin::signed(0), None), Err(Error::<Test, _>::MembershipNotYetRenewable.into()) ); // Then, idty 0 claim renewal after renewable period, should success run_to_block(2 + RenewablePeriod::get()); - assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), 0),); + assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), None),); // Then, idty 0 shoul still member until membership period ended run_to_block(2 + RenewablePeriod::get() + MembershipPeriod::get() - 1); diff --git a/pallets/ud-accounts-storage/src/lib.rs b/pallets/ud-accounts-storage/src/lib.rs index f318148bb..cd479353e 100644 --- a/pallets/ud-accounts-storage/src/lib.rs +++ b/pallets/ud-accounts-storage/src/lib.rs @@ -66,17 +66,20 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn ud_accounts)] - pub type UdAccounts<T: Config> = StorageMap<_, Blake2_128Concat, T::AccountId, (), ValueQuery>; + pub type UdAccounts<T: Config> = StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>; #[pallet::storage] #[pallet::getter(fn ud_accounts_count)] pub(super) type UdAccountsCounter<T: Config> = StorageValue<_, u64, ValueQuery>; + #[pallet::storage] + pub(super) type ToBeRemoved<T: Config> = StorageValue<_, Vec<u32>, ValueQuery>; + // GENESIS // #[pallet::genesis_config] pub struct GenesisConfig<T: Config> { - pub ud_accounts: sp_std::collections::btree_set::BTreeSet<T::AccountId>, + pub ud_accounts: sp_std::collections::btree_map::BTreeMap<T::AccountId, u32>, } #[cfg(feature = "std")] @@ -93,8 +96,8 @@ pub mod pallet { fn build(&self) { <StorageVersion<T>>::put(Releases::V1_0_0); <UdAccountsCounter<T>>::put(self.ud_accounts.len() as u64); - for account in &self.ud_accounts { - <UdAccounts<T>>::insert(account, ()); + for (account, index) in &self.ud_accounts { + <UdAccounts<T>>::insert(account, index); } } } @@ -103,29 +106,55 @@ pub mod pallet { impl<T: Config> Pallet<T> { pub fn account_list() -> Vec<T::AccountId> { - <UdAccounts<T>>::iter().map(|(k, _v)| k).collect() + let mut to_be_removed = ToBeRemoved::<T>::take(); + to_be_removed.sort_unstable(); + + let mut accounts_to_pass = Vec::new(); + let mut accounts_to_remove = Vec::new(); + <UdAccounts<T>>::iter().for_each(|(k, v)| { + if to_be_removed.binary_search(&v).is_ok() { + accounts_to_remove.push(k); + } else { + accounts_to_pass.push(k); + } + }); + for account in accounts_to_remove { + UdAccounts::<T>::remove(account); + } + + accounts_to_pass } pub fn replace_account( old_account_opt: Option<T::AccountId>, new_account_opt: Option<T::AccountId>, + index: u32, ) -> Weight { if let Some(old_account) = old_account_opt { if let Some(new_account) = new_account_opt { - Self::replace_account_inner(old_account, new_account) + Self::replace_account_inner(old_account, new_account, index) } else { Self::del_account(old_account) } } else if let Some(new_account) = new_account_opt { - Self::add_account(new_account) + Self::add_account(new_account, index) } else { 0 } } - fn replace_account_inner(old_account: T::AccountId, new_account: T::AccountId) -> Weight { + pub fn remove_account(account_index: u32) -> Weight { + ToBeRemoved::<T>::append(account_index); + UdAccountsCounter::<T>::mutate(|counter| counter.saturating_sub(1)); + 0 + } + fn replace_account_inner( + old_account: T::AccountId, + new_account: T::AccountId, + index: u32, + ) -> Weight { if <UdAccounts<T>>::contains_key(&old_account) { if !<UdAccounts<T>>::contains_key(&new_account) { <UdAccounts<T>>::remove(&old_account); - <UdAccounts<T>>::insert(&new_account, ()); + <UdAccounts<T>>::insert(&new_account, index); } else { frame_support::runtime_print!( "ERROR: replace_account(): new_account {:?} already added", @@ -140,14 +169,10 @@ pub mod pallet { } 0 } - fn add_account(account: T::AccountId) -> Weight { + fn add_account(account: T::AccountId, index: u32) -> Weight { if !<UdAccounts<T>>::contains_key(&account) { - <UdAccounts<T>>::insert(&account, ()); - if let Ok(counter) = <UdAccountsCounter<T>>::try_get() { - <UdAccountsCounter<T>>::put(counter.saturating_add(1)); - } else { - <UdAccountsCounter<T>>::put(1); - } + <UdAccounts<T>>::insert(&account, index); + UdAccountsCounter::<T>::mutate(|counter| counter.saturating_add(1)); } else { frame_support::runtime_print!( "ERROR: add_account(): account {:?} already added", @@ -159,13 +184,8 @@ pub mod pallet { fn del_account(account: T::AccountId) -> Weight { if <UdAccounts<T>>::contains_key(&account) { <UdAccounts<T>>::remove(&account); - if let Ok(counter) = <UdAccountsCounter<T>>::try_get() { - <UdAccountsCounter<T>>::put(counter.saturating_sub(1)); - } else { - frame_support::runtime_print!( - "FATAL ERROR: del_account(): UdAccountsCounter is None!" - ); - } + + UdAccountsCounter::<T>::mutate(|counter| counter.saturating_sub(1)); } else { frame_support::runtime_print!( "ERROR: del_account(): account {:?} already deleted", diff --git a/primitives/membership/src/lib.rs b/primitives/membership/src/lib.rs index 150d436f2..600ae3661 100644 --- a/primitives/membership/src/lib.rs +++ b/primitives/membership/src/lib.rs @@ -42,13 +42,6 @@ pub enum Event<IdtyId, MetaData = ()> { PendingMembershipExpired(IdtyId), } -#[derive(PartialEq)] -pub enum OriginPermission { - Allowed, - Forbidden, - Root, -} - #[cfg_attr(feature = "std", derive(Deserialize, Serialize))] #[derive(Encode, Decode, Default, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub struct MembershipData<BlockNumber: Decode + Encode + TypeInfo> { diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs index 9406861d4..bf596fd07 100644 --- a/primitives/membership/src/traits.rs +++ b/primitives/membership/src/traits.rs @@ -17,16 +17,6 @@ use crate::*; use frame_support::pallet_prelude::{TypeInfo, Weight}; -pub trait IsIdtyAllowedToClaimMembership<IdtyId> { - fn is_idty_allowed_to_claim_membership(idty_id: &IdtyId) -> bool; -} - -impl<IdtyId> IsIdtyAllowedToClaimMembership<IdtyId> for () { - fn is_idty_allowed_to_claim_membership(_: &IdtyId) -> bool { - true - } -} - pub trait IsIdtyAllowedToRenewMembership<IdtyId> { fn is_idty_allowed_to_renew_membership(idty_id: &IdtyId) -> bool; } @@ -47,16 +37,6 @@ impl<IdtyId> IsIdtyAllowedToRequestMembership<IdtyId> for () { } } -pub trait IsOriginAllowedToUseIdty<Origin, IdtyId> { - fn is_origin_allowed_to_use_idty(origin: &Origin, idty_id: &IdtyId) -> OriginPermission; -} - -impl<Origin, IdtyId> IsOriginAllowedToUseIdty<Origin, IdtyId> for () { - fn is_origin_allowed_to_use_idty(_: &Origin, _: &IdtyId) -> OriginPermission { - OriginPermission::Allowed - } -} - pub trait IsInPendingMemberships<IdtyId> { fn is_in_pending_memberships(idty_id: IdtyId) -> bool; } @@ -100,3 +80,13 @@ impl<BlockNumber: Decode + Encode + TypeInfo, IdtyId> MembershipExternalStorage< panic!("{}", INVALID_CONF_MSG) } } + +pub trait Validate<AccountId> { + fn validate(&self, account_id: &AccountId) -> bool; +} + +impl<AccountId> Validate<AccountId> for () { + fn validate(&self, _account_id: &AccountId) -> bool { + true + } +} diff --git a/runtime/common/src/entities.rs b/runtime/common/src/entities.rs index a6224aa17..73b279d3b 100644 --- a/runtime/common/src/entities.rs +++ b/runtime/common/src/entities.rs @@ -16,6 +16,7 @@ pub use pallet_identity::IdtyName; +use super::AccountId; use frame_support::pallet_prelude::*; use scale_info::TypeInfo; #[cfg(feature = "std")] @@ -59,9 +60,17 @@ macro_rules! declare_session_keys { #[cfg_attr(feature = "std", derive(Deserialize, Serialize))] #[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, TypeInfo)] pub struct SmithsMembershipMetaData<SessionKeysWrapper> { + pub owner_key: AccountId, pub p2p_endpoint: sp_runtime::RuntimeString, pub session_keys: SessionKeysWrapper, } +impl<SessionKeysWrapper> sp_membership::traits::Validate<AccountId> + for SmithsMembershipMetaData<SessionKeysWrapper> +{ + fn validate(&self, who: &AccountId) -> bool { + &self.owner_key == who + } +} #[cfg_attr(feature = "std", derive(Deserialize, Serialize))] #[derive( diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs index e7729ed69..59ec8b28e 100644 --- a/runtime/common/src/handlers.rs +++ b/runtime/common/src/handlers.rs @@ -14,42 +14,37 @@ // You should have received a copy of the GNU Affero General Public License // along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>. -use super::entities::SmithsMembershipMetaData; -use super::IdtyIndex; +use super::entities::*; +use super::{AccountId, IdtyIndex}; use frame_support::dispatch::UnfilteredDispatchable; -use frame_support::instances::Instance2; +use frame_support::instances::{Instance1, Instance2}; use frame_support::pallet_prelude::Weight; use frame_support::Parameter; pub struct OnMembershipEventHandler<Inner, Runtime>(core::marker::PhantomData<(Inner, Runtime)>); +type MembershipMetaData = pallet_duniter_wot::MembershipMetaData<AccountId>; + impl< - IdtyIndex: Parameter, - Inner: sp_membership::traits::OnEvent<IdtyIndex, ()>, - Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex> + pallet_ud_accounts_storage::Config, - > sp_membership::traits::OnEvent<IdtyIndex, ()> for OnMembershipEventHandler<Inner, Runtime> + Inner: sp_membership::traits::OnEvent<IdtyIndex, MembershipMetaData>, + Runtime: frame_system::Config<AccountId = AccountId> + + pallet_identity::Config<IdtyIndex = IdtyIndex> + + pallet_membership::Config<Instance1, MetaData = MembershipMetaData> + + pallet_ud_accounts_storage::Config, + > sp_membership::traits::OnEvent<IdtyIndex, MembershipMetaData> + for OnMembershipEventHandler<Inner, Runtime> { - fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) -> Weight { + fn on_event(membership_event: &sp_membership::Event<IdtyIndex, MembershipMetaData>) -> Weight { (match membership_event { - sp_membership::Event::<IdtyIndex>::MembershipAcquired(idty_index, ()) => { - if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) { - <pallet_ud_accounts_storage::Pallet<Runtime>>::replace_account( - None, - Some(idty_value.owner_key), - ) - } else { - 0 - } + sp_membership::Event::MembershipAcquired(idty_index, owner_key) => { + pallet_ud_accounts_storage::Pallet::<Runtime>::replace_account( + None, + Some(owner_key.0.clone()), + *idty_index, + ) } - sp_membership::Event::<IdtyIndex>::MembershipRevoked(idty_index) => { - if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) { - <pallet_ud_accounts_storage::Pallet<Runtime>>::replace_account( - Some(idty_value.owner_key), - None, - ) - } else { - 0 - } + sp_membership::Event::MembershipRevoked(idty_index) => { + pallet_ud_accounts_storage::Pallet::<Runtime>::remove_account(*idty_index) } _ => 0, }) + Inner::on_event(membership_event) @@ -64,7 +59,8 @@ impl< IdtyIndex: Copy + Parameter, SessionKeysWrapper: Clone, Inner: sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeysWrapper>>, - Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex> + Runtime: frame_system::Config<AccountId = AccountId> + + pallet_identity::Config<IdtyIndex = IdtyIndex> + pallet_authority_members::Config<KeysWrapper = SessionKeysWrapper, MemberId = IdtyIndex> + pallet_membership::Config< Instance2, @@ -82,19 +78,21 @@ impl< (match membership_event { sp_membership::Event::MembershipAcquired( idty_index, - SmithsMembershipMetaData { session_keys, .. }, + SmithsMembershipMetaData { + owner_key, + session_keys, + .. + }, ) => { - if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) { - let call = pallet_authority_members::Call::<Runtime>::set_session_keys { - member_id: *idty_index, - keys: session_keys.clone(), - }; - if let Err(e) = call.dispatch_bypass_filter( - frame_system::Origin::<Runtime>::Signed(idty_value.owner_key).into(), - ) { - sp_std::if_std! { - println!("{:?}", e) - } + let call = pallet_authority_members::Call::<Runtime>::set_session_keys { + member_id: *idty_index, + keys: session_keys.clone(), + }; + if let Err(e) = call.dispatch_bypass_filter( + frame_system::Origin::<Runtime>::Signed(owner_key.clone()).into(), + ) { + sp_std::if_std! { + println!("{:?}", e) } } 0 @@ -117,16 +115,16 @@ impl< } } -pub struct OnRemovedAUthorityMemberHandler<Runtime>(core::marker::PhantomData<Runtime>); +pub struct OnRemovedAuthorityMemberHandler<Runtime>(core::marker::PhantomData<Runtime>); impl<Runtime> pallet_authority_members::traits::OnRemovedMember<IdtyIndex> - for OnRemovedAUthorityMemberHandler<Runtime> + for OnRemovedAuthorityMemberHandler<Runtime> where Runtime: frame_system::Config + pallet_membership::Config<Instance2, IdtyId = IdtyIndex>, { fn on_removed_member(idty_index: IdtyIndex) -> Weight { if let Err(e) = pallet_membership::Pallet::<Runtime, Instance2>::revoke_membership( frame_system::RawOrigin::Root.into(), - idty_index, + Some(idty_index), ) { sp_std::if_std! { println!("{:?}", e) diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 88b16d498..50912a0c4 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -75,16 +75,3 @@ impl pallet_identity::traits::IdtyNameValidator for IdtyNameValidatorImpl { idty_name.0.len() >= 3 && idty_name.0.len() <= 64 } } - -pub struct OwnerKeyOfImpl<Runtime>(core::marker::PhantomData<Runtime>); - -impl< - Runtime: frame_system::Config<AccountId = AccountId> - + pallet_identity::Config<IdtyIndex = IdtyIndex>, - > sp_runtime::traits::Convert<IdtyIndex, Option<AccountId>> for OwnerKeyOfImpl<Runtime> -{ - fn convert(idty_index: IdtyIndex) -> Option<AccountId> { - pallet_identity::Pallet::<Runtime>::identity(idty_index) - .map(|idty_value| idty_value.owner_key) - } -} diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs index 226d575d8..4bf4251a0 100644 --- a/runtime/common/src/pallets_config.rs +++ b/runtime/common/src/pallets_config.rs @@ -25,57 +25,57 @@ macro_rules! pallets_config { pub const Version: RuntimeVersion = VERSION; } - impl frame_system::Config for Runtime { - /// The basic call filter to use in dispatchable. - type BaseCallFilter = BaseCallFilter; - /// Block & extrinsics weights: base values and limits. - type BlockWeights = BlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = BlockLength; - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type Call = Call; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup<AccountId, ()>; - /// The index type for storing how many extrinsics an account has signed. - type Index = Index; - /// The index type for blocks. - type BlockNumber = BlockNumber; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The header type. - type Header = generic::Header<BlockNumber, BlakeTwo256>; - /// The ubiquitous event type. - type Event = Event; - /// The ubiquitous origin type. - type Origin = Origin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// Version of the runtime. - type Version = Version; - /// Converts a module to the index of the module in `construct_runtime!`. - /// - /// This type is being generated by `construct_runtime!`. - type PalletInfo = PalletInfo; - /// What to do if a new account is created. - type OnNewAccount = (); - /// What to do if an account is fully reaped from the system. - type OnKilledAccount = (); - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData<Balance>; - /// Weight information for the extrinsics of this pallet. - type SystemWeightInfo = (); - /// This is used as an identifier of the chain. 42 is the generic substrate prefix. - type SS58Prefix = SS58Prefix; - /// The set code logic, just the default since we're not a parachain. - type OnSetCode = (); + impl frame_system::Config for Runtime { + /// The basic call filter to use in dispatchable. + type BaseCallFilter = BaseCallFilter; + /// Block & extrinsics weights: base values and limits. + type BlockWeights = BlockWeights; + /// The maximum length of a block (in bytes). + type BlockLength = BlockLength; + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The aggregated dispatch type that is available for extrinsics. + type Call = Call; + /// The lookup mechanism to get account ID from whatever is passed in dispatchers. + type Lookup = AccountIdLookup<AccountId, ()>; + /// The index type for storing how many extrinsics an account has signed. + type Index = Index; + /// The index type for blocks. + type BlockNumber = BlockNumber; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The hashing algorithm used. + type Hashing = BlakeTwo256; + /// The header type. + type Header = generic::Header<BlockNumber, BlakeTwo256>; + /// The ubiquitous event type. + type Event = Event; + /// The ubiquitous origin type. + type Origin = Origin; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = BlockHashCount; + /// The weight of database operations that the runtime can invoke. + type DbWeight = RocksDbWeight; + /// Version of the runtime. + type Version = Version; + /// Converts a module to the index of the module in `construct_runtime!`. + /// + /// This type is being generated by `construct_runtime!`. + type PalletInfo = PalletInfo; + /// What to do if a new account is created. + type OnNewAccount = (); + /// What to do if an account is fully reaped from the system. + type OnKilledAccount = (); + /// The data to be stored in an account. + type AccountData = pallet_balances::AccountData<Balance>; + /// Weight information for the extrinsics of this pallet. + type SystemWeightInfo = (); + /// This is used as an identifier of the chain. 42 is the generic substrate prefix. + type SS58Prefix = SS58Prefix; + /// The set code logic, just the default since we're not a parachain. + type OnSetCode = (); type MaxConsumers = frame_support::traits::ConstU32<16>; - } + } // SCHEDULER // @@ -150,26 +150,26 @@ macro_rules! pallets_config { // MONEY MANAGEMENT // impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type Event = Event; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = pallet_balances::weights::SubstrateWeight<Runtime>; - } - - impl pallet_transaction_payment::Config for Runtime { - type OnChargeTransaction = CurrencyAdapter<Balances, ()>; - type TransactionByteFee = TransactionByteFee; + type MaxLocks = MaxLocks; + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = pallet_balances::weights::SubstrateWeight<Runtime>; + } + + impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = CurrencyAdapter<Balances, ()>; + type TransactionByteFee = TransactionByteFee; type OperationalFeeMultiplier = frame_support::traits::ConstU8<5>; - type WeightToFee = common_runtime::fees::WeightToFeeImpl<Balance>; - type FeeMultiplierUpdate = (); - } + type WeightToFee = common_runtime::fees::WeightToFeeImpl<Balance>; + type FeeMultiplierUpdate = (); + } // CONSENSUS // @@ -180,12 +180,11 @@ macro_rules! pallets_config { type Event = Event; type KeysWrapper = opaque::SessionKeysWrapper; type IsMember = SmithsMembership; - type OnRemovedMember = OnRemovedAUthorityMemberHandler<Runtime>; - type OwnerKeyOf = OwnerKeyOfImpl<Runtime>; + type OnRemovedMember = OnRemovedAuthorityMemberHandler<Runtime>; type MemberId = IdtyIndex; + type MemberIdOf = Identity; type MaxKeysLife = frame_support::pallet_prelude::ConstU32<1_000>; type MaxOfflineSessions = frame_support::pallet_prelude::ConstU32<100>; - type RefreshValidatorIdOrigin = EnsureRoot<Self::AccountId>; type RemoveMemberOrigin = EnsureRoot<Self::AccountId>; } impl pallet_authorship::Config for Runtime { @@ -226,26 +225,26 @@ macro_rules! pallets_config { type FullIdentification = ValidatorFullIdentification; type FullIdentificationOf = FullIdentificationOfImpl; } - impl pallet_grandpa::Config for Runtime { - type Event = Event; - type Call = Call; + impl pallet_grandpa::Config for Runtime { + type Event = Event; + type Call = Call; - type KeyOwnerProofSystem = (); + type KeyOwnerProofSystem = (); - type KeyOwnerProof = - <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof; + type KeyOwnerProof = + <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof; - type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<( - KeyTypeId, - GrandpaId, - )>>::IdentificationTuple; + type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<( + KeyTypeId, + GrandpaId, + )>>::IdentificationTuple; - type HandleEquivocation = (); + type HandleEquivocation = (); - type WeightInfo = (); + type WeightInfo = (); type MaxAuthorities = MaxAuthorities; - } + } // UTILITIES // @@ -258,20 +257,20 @@ macro_rules! pallets_config { // UNIVERSALÂ DIVIDEND // - impl pallet_universal_dividend::Config for Runtime { - type Currency = pallet_balances::Pallet<Runtime>; - type Event = Event; - type MembersCount = common_runtime::providers::UdAccountsProvider<Runtime>; - type MembersIds = common_runtime::providers::UdAccountsProvider<Runtime>; - type SquareMoneyGrowthRate = SquareMoneyGrowthRate; - type UdCreationPeriod = UdCreationPeriod; + impl pallet_universal_dividend::Config for Runtime { + type Currency = pallet_balances::Pallet<Runtime>; + type Event = Event; + type MembersCount = common_runtime::providers::UdAccountsProvider<Runtime>; + type MembersIds = common_runtime::providers::UdAccountsProvider<Runtime>; + type SquareMoneyGrowthRate = SquareMoneyGrowthRate; + type UdCreationPeriod = UdCreationPeriod; type UdFirstReeval = UdFirstReeval; - type UdReevalPeriod = UdReevalPeriod; - type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks; + type UdReevalPeriod = UdReevalPeriod; + type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks; type UnitsPerUd = frame_support::traits::ConstU64<1_000>; - } + } - impl pallet_ud_accounts_storage::Config for Runtime {} + impl pallet_ud_accounts_storage::Config for Runtime {} // WEBÂ OFÂ TRUST // @@ -284,50 +283,47 @@ macro_rules! pallets_config { } impl pallet_identity::Config for Runtime { - type ConfirmPeriod = ConfirmPeriod; - type Event = Event; - type EnsureIdtyCallAllowed = Wot; + type ConfirmPeriod = ConfirmPeriod; + type Event = Event; + type EnsureIdtyCallAllowed = Wot; type IdtyCreationPeriod = IdtyCreationPeriod; - type IdtyDataProvider = (); - type IdtyData = (); - type IdtyIndex = IdtyIndex; - type IdtyNameValidator = IdtyNameValidatorImpl; - type IdtyValidationOrigin = EnsureRoot<Self::AccountId>; + type IdtyIndex = IdtyIndex; + type IdtyNameValidator = IdtyNameValidatorImpl; + type IdtyValidationOrigin = EnsureRoot<Self::AccountId>; type IsMember = Membership; - type OnIdtyChange = Wot; - type MaxDisabledPeriod = MaxDisabledPeriod; - } + type OnIdtyChange = Wot; + type MaxDisabledPeriod = MaxDisabledPeriod; + } impl pallet_membership::Config<frame_support::instances::Instance1> for Runtime { - type IsIdtyAllowedToClaimMembership = Wot; type IsIdtyAllowedToRenewMembership = Wot; type IsIdtyAllowedToRequestMembership = Wot; - type IsOriginAllowedToUseIdty = Wot; type Event = Event; type ExternalizeMembershipStorage = frame_support::traits::ConstBool<false>; type IdtyId = IdtyIndex; + type IdtyIdOf = Identity; type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = MembershipPeriod; - type MetaData = (); + type MetaData = pallet_duniter_wot::MembershipMetaData<AccountId>; type OnEvent = OnMembershipEventHandler<Wot, Runtime>; type PendingMembershipPeriod = PendingMembershipPeriod; type RenewablePeriod = RenewablePeriod; type RevocationPeriod = frame_support::traits::ConstU32<0>; } - impl pallet_certification::Config<Instance1> for Runtime { - type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance1>; - type CertPeriod = CertPeriod; - type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance1>; - type Event = Event; - type IdtyIndex = IdtyIndex; - type MaxByIssuer = MaxByIssuer; + impl pallet_certification::Config<Instance1> for Runtime { + type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance1>; + type CertPeriod = CertPeriod; + type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance1>; + type Event = Event; + type IdtyIndex = IdtyIndex; + type MaxByIssuer = MaxByIssuer; type MinReceivedCertToBeAbleToIssueCert = MinReceivedCertToBeAbleToIssueCert; - type OnNewcert = Wot; - type OnRemovedCert = Wot; - type CertRenewablePeriod = CertRenewablePeriod; - type ValidityPeriod = ValidityPeriod; - } + type OnNewcert = Wot; + type OnRemovedCert = Wot; + type CertRenewablePeriod = CertRenewablePeriod; + type ValidityPeriod = ValidityPeriod; + } // SMITHSÂ SUB-WOT // @@ -340,13 +336,12 @@ macro_rules! pallets_config { } impl pallet_membership::Config<Instance2> for Runtime { - type IsIdtyAllowedToClaimMembership = (); type IsIdtyAllowedToRenewMembership = (); type IsIdtyAllowedToRequestMembership = (); - type IsOriginAllowedToUseIdty = Wot; type Event = Event; type ExternalizeMembershipStorage = frame_support::traits::ConstBool<false>; type IdtyId = IdtyIndex; + type IdtyIdOf = Identity; type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = SmithMembershipPeriod; type MetaData = SmithsMembershipMetaData<opaque::SessionKeysWrapper>; @@ -356,19 +351,19 @@ macro_rules! pallets_config { type RevocationPeriod = frame_support::traits::ConstU32<0>; } - impl pallet_certification::Config<Instance2> for Runtime { - type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance2>; - type CertPeriod = SmithCertPeriod; - type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance2>; - type Event = Event; - type IdtyIndex = IdtyIndex; - type MaxByIssuer = SmithMaxByIssuer; + impl pallet_certification::Config<Instance2> for Runtime { + type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance2>; + type CertPeriod = SmithCertPeriod; + type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance2>; + type Event = Event; + type IdtyIndex = IdtyIndex; + type MaxByIssuer = SmithMaxByIssuer; type MinReceivedCertToBeAbleToIssueCert = SmithMinReceivedCertToBeAbleToIssueCert; - type OnNewcert = SmithsSubWot; - type OnRemovedCert = SmithsSubWot; - type CertRenewablePeriod = SmithCertRenewablePeriod; - type ValidityPeriod = SmithValidityPeriod; - } + type OnNewcert = SmithsSubWot; + type OnRemovedCert = SmithsSubWot; + type CertRenewablePeriod = SmithCertRenewablePeriod; + type ValidityPeriod = SmithValidityPeriod; + } // MULTISIG // diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs index c71bad91d..ea6c251f1 100644 --- a/runtime/g1/src/lib.rs +++ b/runtime/g1/src/lib.rs @@ -40,7 +40,7 @@ pub use pallet_universal_dividend; pub use sp_runtime::BuildStorage; pub use sp_runtime::{KeyTypeId, Perbill, Permill}; -use common_runtime::{IdtyNameValidatorImpl, OwnerKeyOfImpl}; +use common_runtime::IdtyNameValidatorImpl; use frame_system::EnsureRoot; use pallet_grandpa::fg_primitives; use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs index c0527be54..9bbdb2593 100644 --- a/runtime/gdev/src/lib.rs +++ b/runtime/gdev/src/lib.rs @@ -41,7 +41,7 @@ pub use pallet_universal_dividend; pub use sp_runtime::BuildStorage; pub use sp_runtime::{KeyTypeId, Perbill, Permill}; -use common_runtime::{IdtyNameValidatorImpl, OwnerKeyOfImpl}; +use common_runtime::IdtyNameValidatorImpl; use frame_system::EnsureRoot; use pallet_grandpa::fg_primitives; use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; @@ -139,45 +139,53 @@ impl frame_support::traits::Contains<Call> for BaseCallFilter { // Configure FRAME pallets to include in runtime. common_runtime::pallets_config! { - // Dynamic parameters - pub type EpochDuration = pallet_duniter_test_parameters::BabeEpochDuration<Runtime>; - pub type CertPeriod = pallet_duniter_test_parameters::CertPeriod<Runtime>; - pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>; - pub type MinReceivedCertToBeAbleToIssueCert = pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>; - pub type CertRenewablePeriod = pallet_duniter_test_parameters::CertRenewablePeriod<Runtime>; - pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>; - pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>; - pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>; - pub type MaxDisabledPeriod = pallet_duniter_test_parameters::IdtyMaxDisabledPeriod<Runtime>; - pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>; - pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>; - pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>; - pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>; - pub type UdFirstReeval = pallet_duniter_test_parameters::UdFirstReeval<Runtime>; - pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>; - pub type UdReevalPeriodInBlocks = pallet_duniter_test_parameters::UdReevalPeriodInBlocks<Runtime>; - pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>; - pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>; - pub type WotMinCertForCreateIdtyRight = pallet_duniter_test_parameters::WotMinCertForCreateIdtyRight<Runtime>; - pub type SmithCertPeriod = pallet_duniter_test_parameters::SmithCertPeriod<Runtime>; - pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>; - pub type SmithMinReceivedCertToBeAbleToIssueCert = pallet_duniter_test_parameters::SmithCertMinReceivedCertToIssueCert<Runtime>; - pub type SmithCertRenewablePeriod = pallet_duniter_test_parameters::SmithCertRenewablePeriod<Runtime>; - pub type SmithValidityPeriod = pallet_duniter_test_parameters::SmithCertValidityPeriod<Runtime>; - pub type SmithMembershipPeriod = pallet_duniter_test_parameters::SmithMembershipPeriod<Runtime>; - pub type SmithPendingMembershipPeriod = pallet_duniter_test_parameters::SmithPendingMembershipPeriod<Runtime>; - pub type SmithRenewablePeriod = pallet_duniter_test_parameters::SmithMembershipRenewablePeriod<Runtime>; - pub type SmithsWotFirstCertIssuableOn = pallet_duniter_test_parameters::SmithsWotFirstCertIssuableOn<Runtime>; - pub type SmithsWotMinCertForMembership = pallet_duniter_test_parameters::SmithsWotMinCertForMembership<Runtime>; +// Dynamic parameters +pub type EpochDuration = pallet_duniter_test_parameters::BabeEpochDuration<Runtime>; +pub type CertPeriod = pallet_duniter_test_parameters::CertPeriod<Runtime>; +pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>; +pub type MinReceivedCertToBeAbleToIssueCert = + pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>; +pub type CertRenewablePeriod = pallet_duniter_test_parameters::CertRenewablePeriod<Runtime>; +pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>; +pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>; +pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>; +pub type MaxDisabledPeriod = pallet_duniter_test_parameters::IdtyMaxDisabledPeriod<Runtime>; +pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>; +pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>; +pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>; +pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>; +pub type UdFirstReeval = pallet_duniter_test_parameters::UdFirstReeval<Runtime>; +pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>; +pub type UdReevalPeriodInBlocks = pallet_duniter_test_parameters::UdReevalPeriodInBlocks<Runtime>; +pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>; +pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>; +pub type WotMinCertForCreateIdtyRight = + pallet_duniter_test_parameters::WotMinCertForCreateIdtyRight<Runtime>; +pub type SmithCertPeriod = pallet_duniter_test_parameters::SmithCertPeriod<Runtime>; +pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>; +pub type SmithMinReceivedCertToBeAbleToIssueCert = + pallet_duniter_test_parameters::SmithCertMinReceivedCertToIssueCert<Runtime>; +pub type SmithCertRenewablePeriod = + pallet_duniter_test_parameters::SmithCertRenewablePeriod<Runtime>; +pub type SmithValidityPeriod = pallet_duniter_test_parameters::SmithCertValidityPeriod<Runtime>; +pub type SmithMembershipPeriod = pallet_duniter_test_parameters::SmithMembershipPeriod<Runtime>; +pub type SmithPendingMembershipPeriod = + pallet_duniter_test_parameters::SmithPendingMembershipPeriod<Runtime>; +pub type SmithRenewablePeriod = + pallet_duniter_test_parameters::SmithMembershipRenewablePeriod<Runtime>; +pub type SmithsWotFirstCertIssuableOn = + pallet_duniter_test_parameters::SmithsWotFirstCertIssuableOn<Runtime>; +pub type SmithsWotMinCertForMembership = + pallet_duniter_test_parameters::SmithsWotMinCertForMembership<Runtime>; - impl pallet_duniter_test_parameters::Config for Runtime { - type CertCount = u32; - type PeriodCount = Balance; - } - impl pallet_sudo::Config for Runtime { - type Event = Event; - type Call = Call; - } +impl pallet_duniter_test_parameters::Config for Runtime { + type CertCount = u32; + type PeriodCount = Balance; +} +impl pallet_sudo::Config for Runtime { + type Event = Event; + type Call = Call; +} } // Create the runtime by composing the FRAME pallets that were previously configured. diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs index 9ee2105a0..8890c722b 100644 --- a/runtime/gtest/src/lib.rs +++ b/runtime/gtest/src/lib.rs @@ -40,7 +40,7 @@ pub use pallet_universal_dividend; pub use sp_runtime::BuildStorage; pub use sp_runtime::{KeyTypeId, Perbill, Permill}; -use common_runtime::{IdtyNameValidatorImpl, OwnerKeyOfImpl}; +use common_runtime::IdtyNameValidatorImpl; use frame_system::EnsureRoot; use pallet_grandpa::fg_primitives; use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; -- GitLab