Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Identity] Decouple usernames from identities #5554

Merged
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
288d351
WIP username refactor
georgepisaltu Aug 23, 2024
06f8472
Minor fixes
georgepisaltu Aug 26, 2024
ebdd61d
Fix test compilation
georgepisaltu Aug 26, 2024
e42fb1b
Fix a couple of tests
georgepisaltu Aug 26, 2024
cfa7406
All tests pass
georgepisaltu Aug 26, 2024
7d351ae
Add tests related to username deletion
georgepisaltu Aug 27, 2024
5119afe
Fix tests for accepting usernames
georgepisaltu Aug 27, 2024
6b64952
Add the rest of unit tests
georgepisaltu Aug 27, 2024
083b168
Fix benches for new changes to usernames
georgepisaltu Aug 28, 2024
6269619
Add initial migration code
georgepisaltu Aug 28, 2024
8e326af
Finish writing migration code
georgepisaltu Aug 29, 2024
4b3ee47
Add benchmarked weight for migration steps
georgepisaltu Aug 29, 2024
987fc4e
WIP fix test
georgepisaltu Aug 29, 2024
831c556
WIP some other stuff
georgepisaltu Aug 30, 2024
f28afed
WIP test almost fixed
georgepisaltu Aug 30, 2024
34611fb
Fix first part of migration
georgepisaltu Aug 30, 2024
ac22ee8
Fix compilation fail
georgepisaltu Aug 30, 2024
717439a
Fix tests
georgepisaltu Aug 30, 2024
2736a05
Finish migration
georgepisaltu Aug 30, 2024
db04e86
Get rid of benchmarks
georgepisaltu Sep 2, 2024
040cd62
Some renames
georgepisaltu Sep 2, 2024
36b474e
Update docs
georgepisaltu Sep 2, 2024
c33ff74
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 2, 2024
7c5193a
Small refactoring
georgepisaltu Sep 4, 2024
3c0beaa
Change unbinding username to store expiry
georgepisaltu Sep 4, 2024
494b521
Fix various configs
georgepisaltu Sep 4, 2024
f697ad8
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 4, 2024
0d6fdd7
Fix `IdentityVerifier` impls
georgepisaltu Sep 4, 2024
ec16e56
Update readme
georgepisaltu Sep 5, 2024
7dec7be
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 5, 2024
4cf38d1
Fix compilation in identity migrator
georgepisaltu Sep 5, 2024
23c353b
Reintroduce benchmarks for migration
georgepisaltu Sep 10, 2024
1035f6f
Refactor storage alias types
georgepisaltu Sep 10, 2024
448c034
Add dummy weights
georgepisaltu Sep 10, 2024
0acaffd
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 10, 2024
35bcc68
Small refactor
georgepisaltu Sep 11, 2024
54c67b6
Add prdoc
georgepisaltu Sep 11, 2024
7a33cd4
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 11, 2024
7a9d48c
Enable migration
georgepisaltu Sep 11, 2024
4acddb0
Fix compilation
georgepisaltu Sep 11, 2024
a49211e
Manually set the storage version
georgepisaltu Sep 11, 2024
e44d6d2
Fix bench compile
georgepisaltu Sep 11, 2024
bb0153c
Actually enable MBMs for omitted runtimes
georgepisaltu Sep 12, 2024
b39175f
Merge branch 'master' into identity-username-refactor
Ank4n Sep 13, 2024
af85fc7
Remove obsolete dangling username call
georgepisaltu Sep 12, 2024
7fe2d82
Update docs
georgepisaltu Sep 16, 2024
c3d22fe
Truncate keys
georgepisaltu Sep 16, 2024
112d870
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 26, 2024
a11ef4a
Add try runtime checks
georgepisaltu Sep 30, 2024
976e0ff
Fix docs
georgepisaltu Sep 30, 2024
a3ed0b1
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Sep 30, 2024
f31fdd6
Merge remote-tracking branch 'upstream/master' into identity-username…
georgepisaltu Oct 29, 2024
ae07a64
Update prdoc
georgepisaltu Oct 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ parameter_types! {
// 17 | Min size without `IdentityInfo` (accounted for in byte deposit)
pub const BasicDeposit: Balance = deposit(1, 17);
pub const ByteDeposit: Balance = deposit(0, 1);
pub const UsernameDeposit: Balance = deposit(0, 32);
pub const SubAccountDeposit: Balance = deposit(1, 53);
pub RelayTreasuryAccount: AccountId =
parachains_common::TREASURY_PALLET_ID.into_account_truncating();
Expand All @@ -46,6 +47,7 @@ impl pallet_identity::Config for Runtime {
type Currency = Balances;
type BasicDeposit = BasicDeposit;
type ByteDeposit = ByteDeposit;
type UsernameDeposit = UsernameDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = ConstU32<100>;
type IdentityInformation = IdentityInfo;
Expand All @@ -57,6 +59,7 @@ impl pallet_identity::Config for Runtime {
type SigningPublicKey = <Signature as Verify>::Signer;
type UsernameAuthorityOrigin = EnsureRoot<Self::AccountId>;
type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>;
type UsernameGracePeriod = ConstU32<{ 3 * DAYS }>;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = weights::pallet_identity::WeightInfo<Runtime>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
/// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`)
/// Storage: `Identity::IdentityOf` (r:1 w:1)
/// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
fn set_username_for() -> Weight {
fn set_username_for(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `80`
// Estimated: `11037`
Expand Down Expand Up @@ -368,7 +368,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
}
/// Storage: `Identity::PendingUsernames` (r:1 w:1)
/// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`)
fn remove_expired_approval() -> Weight {
fn remove_expired_approval(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `106`
// Estimated: `3542`
Expand Down Expand Up @@ -406,4 +406,13 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
fn unbind_username() -> Weight {
Weight::zero()
}
fn remove_username() -> Weight {
Weight::zero()
}
fn kill_username(_p: u32, ) -> Weight {
Weight::zero()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ parameter_types! {
// 17 | Min size without `IdentityInfo` (accounted for in byte deposit)
pub const BasicDeposit: Balance = deposit(1, 17);
pub const ByteDeposit: Balance = deposit(0, 1);
pub const UsernameDeposit: Balance = deposit(0, 32);
pub const SubAccountDeposit: Balance = deposit(1, 53);
pub RelayTreasuryAccount: AccountId =
parachains_common::TREASURY_PALLET_ID.into_account_truncating();
Expand All @@ -46,6 +47,7 @@ impl pallet_identity::Config for Runtime {
type Currency = Balances;
type BasicDeposit = BasicDeposit;
type ByteDeposit = ByteDeposit;
type UsernameDeposit = UsernameDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = ConstU32<100>;
type IdentityInformation = IdentityInfo;
Expand All @@ -57,6 +59,7 @@ impl pallet_identity::Config for Runtime {
type SigningPublicKey = <Signature as Verify>::Signer;
type UsernameAuthorityOrigin = EnsureRoot<Self::AccountId>;
type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>;
type UsernameGracePeriod = ConstU32<{ 3 * DAYS }>;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = weights::pallet_identity::WeightInfo<Runtime>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
/// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`)
/// Storage: `Identity::IdentityOf` (r:1 w:1)
/// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
fn set_username_for() -> Weight {
fn set_username_for(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `80`
// Estimated: `11037`
Expand Down Expand Up @@ -368,7 +368,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
}
/// Storage: `Identity::PendingUsernames` (r:1 w:1)
/// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`)
fn remove_expired_approval() -> Weight {
fn remove_expired_approval(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `106`
// Estimated: `3542`
Expand Down Expand Up @@ -406,4 +406,13 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
fn unbind_username() -> Weight {
Weight::zero()
}
fn remove_username() -> Weight {
Weight::zero()
}
fn kill_username(_p: u32, ) -> Weight {
Weight::zero()
}
}
2 changes: 2 additions & 0 deletions polkadot/runtime/common/src/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ impl pallet_identity::Config for Test {
type Slashed = ();
type BasicDeposit = ConstU32<100>;
type ByteDeposit = ConstU32<10>;
type UsernameDeposit = ConstU32<10>;
type SubAccountDeposit = ConstU32<100>;
type MaxSubAccounts = ConstU32<2>;
type IdentityInformation = IdentityInfo<ConstU32<2>>;
Expand All @@ -289,6 +290,7 @@ impl pallet_identity::Config for Test {
type SigningPublicKey = <MultiSignature as Verify>::Signer;
type UsernameAuthorityOrigin = EnsureRoot<AccountId>;
type PendingUsernameExpiration = ConstU32<100>;
type UsernameGracePeriod = ConstU32<10>;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = ();
Expand Down
3 changes: 3 additions & 0 deletions polkadot/runtime/rococo/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,7 @@ parameter_types! {
// Minimum 100 bytes/ROC deposited (1 CENT/byte)
pub const BasicDeposit: Balance = 1000 * CENTS; // 258 bytes on-chain
pub const ByteDeposit: Balance = deposit(0, 1);
pub const UsernameDeposit: Balance = deposit(0, 32);
pub const SubAccountDeposit: Balance = 200 * CENTS; // 53 bytes on-chain
pub const MaxSubAccounts: u32 = 100;
pub const MaxAdditionalFields: u32 = 100;
Expand All @@ -696,6 +697,7 @@ impl pallet_identity::Config for Runtime {
type Currency = Balances;
type BasicDeposit = BasicDeposit;
type ByteDeposit = ByteDeposit;
type UsernameDeposit = UsernameDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = MaxSubAccounts;
type IdentityInformation = IdentityInfo<MaxAdditionalFields>;
Expand All @@ -707,6 +709,7 @@ impl pallet_identity::Config for Runtime {
type SigningPublicKey = <Signature as Verify>::Signer;
type UsernameAuthorityOrigin = EnsureRoot<Self::AccountId>;
type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>;
type UsernameGracePeriod = ConstU32<{ 30 * DAYS }>;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = weights::pallet_identity::WeightInfo<Runtime>;
Expand Down
13 changes: 11 additions & 2 deletions polkadot/runtime/rococo/src/weights/pallet_identity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
/// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`)
/// Storage: `Identity::IdentityOf` (r:1 w:1)
/// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
fn set_username_for() -> Weight {
fn set_username_for(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `80`
// Estimated: `11037`
Expand Down Expand Up @@ -390,7 +390,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
}
/// Storage: `Identity::PendingUsernames` (r:1 w:1)
/// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`)
fn remove_expired_approval() -> Weight {
fn remove_expired_approval(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `106`
// Estimated: `3542`
Expand Down Expand Up @@ -428,4 +428,13 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
fn unbind_username() -> Weight {
Weight::zero()
}
fn remove_username() -> Weight {
Weight::zero()
}
fn kill_username(_p: u32, ) -> Weight {
Weight::zero()
}
}
3 changes: 3 additions & 0 deletions polkadot/runtime/westend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -928,6 +928,7 @@ parameter_types! {
// Minimum 100 bytes/KSM deposited (1 CENT/byte)
pub const BasicDeposit: Balance = 1000 * CENTS; // 258 bytes on-chain
pub const ByteDeposit: Balance = deposit(0, 1);
pub const UsernameDeposit: Balance = deposit(0, 32);
pub const SubAccountDeposit: Balance = 200 * CENTS; // 53 bytes on-chain
pub const MaxSubAccounts: u32 = 100;
pub const MaxAdditionalFields: u32 = 100;
Expand All @@ -940,6 +941,7 @@ impl pallet_identity::Config for Runtime {
type Slashed = ();
type BasicDeposit = BasicDeposit;
type ByteDeposit = ByteDeposit;
type UsernameDeposit = UsernameDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = MaxSubAccounts;
type IdentityInformation = IdentityInfo<MaxAdditionalFields>;
Expand All @@ -950,6 +952,7 @@ impl pallet_identity::Config for Runtime {
type SigningPublicKey = <Signature as Verify>::Signer;
type UsernameAuthorityOrigin = EnsureRoot<Self::AccountId>;
type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>;
type UsernameGracePeriod = ConstU32<{ 30 * DAYS }>;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = weights::pallet_identity::WeightInfo<Runtime>;
Expand Down
13 changes: 11 additions & 2 deletions polkadot/runtime/westend/src/weights/pallet_identity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
/// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`)
/// Storage: `Identity::IdentityOf` (r:1 w:1)
/// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
fn set_username_for() -> Weight {
fn set_username_for(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `80`
// Estimated: `11037`
Expand Down Expand Up @@ -394,7 +394,7 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
}
/// Storage: `Identity::PendingUsernames` (r:1 w:1)
/// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`)
fn remove_expired_approval() -> Weight {
fn remove_expired_approval(_p: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `106`
// Estimated: `3542`
Expand Down Expand Up @@ -432,4 +432,13 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
fn unbind_username() -> Weight {
Weight::zero()
}
fn remove_username() -> Weight {
Weight::zero()
}
fn kill_username(_p: u32, ) -> Weight {
Weight::zero()
}
}
2 changes: 1 addition & 1 deletion substrate/bin/node/runtime/src/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl IdentityVerifier<AccountId> for AllianceIdentityVerifier {
fn has_good_judgement(who: &AccountId) -> bool {
use pallet_identity::{IdentityOf, Judgement};
IdentityOf::<Runtime>::get(who)
.map(|(registration, _)| registration.judgements)
.map(|registration| registration.judgements)
.map_or(false, |judgements| {
judgements
.iter()
Expand Down
3 changes: 3 additions & 0 deletions substrate/bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1544,6 +1544,7 @@ parameter_types! {
// information, already accounted for by the byte deposit
pub const BasicDeposit: Balance = deposit(1, 17);
pub const ByteDeposit: Balance = deposit(0, 1);
pub const UsernameDeposit: Balance = deposit(0, 32);
pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain
pub const MaxSubAccounts: u32 = 100;
pub const MaxAdditionalFields: u32 = 100;
Expand All @@ -1555,6 +1556,7 @@ impl pallet_identity::Config for Runtime {
type Currency = Balances;
type BasicDeposit = BasicDeposit;
type ByteDeposit = ByteDeposit;
type UsernameDeposit = UsernameDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = MaxSubAccounts;
type IdentityInformation = IdentityInfo<MaxAdditionalFields>;
Expand All @@ -1566,6 +1568,7 @@ impl pallet_identity::Config for Runtime {
type SigningPublicKey = <Signature as traits::Verify>::Signer;
type UsernameAuthorityOrigin = EnsureRoot<Self::AccountId>;
type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>;
type UsernameGracePeriod = ConstU32<{ 30 * DAYS }>;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = pallet_identity::weights::SubstrateWeight<Runtime>;
Expand Down
6 changes: 5 additions & 1 deletion substrate/frame/alliance/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,13 @@ impl pallet_collective::Config<AllianceCollective> for Test {
parameter_types! {
pub const BasicDeposit: u64 = 100;
pub const ByteDeposit: u64 = 10;
pub const UsernameDeposit: u64 = 10;
pub const SubAccountDeposit: u64 = 100;
pub const MaxSubAccounts: u32 = 2;
pub const MaxAdditionalFields: u32 = 2;
pub const MaxRegistrars: u32 = 20;
pub const PendingUsernameExpiration: u64 = 100;
pub const UsernameGracePeriod: u64 = 10;
}
ord_parameter_types! {
pub const One: u64 = 1;
Expand All @@ -106,6 +108,7 @@ impl pallet_identity::Config for Test {
type Currency = Balances;
type BasicDeposit = BasicDeposit;
type ByteDeposit = ByteDeposit;
type UsernameDeposit = UsernameDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = MaxSubAccounts;
type IdentityInformation = IdentityInfo<MaxAdditionalFields>;
Expand All @@ -117,6 +120,7 @@ impl pallet_identity::Config for Test {
type SigningPublicKey = AccountU64;
type UsernameAuthorityOrigin = EnsureOneOrRoot;
type PendingUsernameExpiration = PendingUsernameExpiration;
type UsernameGracePeriod = UsernameGracePeriod;
type MaxSuffixLength = ConstU32<7>;
type MaxUsernameLength = ConstU32<32>;
type WeightInfo = ();
Expand Down Expand Up @@ -149,7 +153,7 @@ impl IdentityVerifier<AccountId> for AllianceIdentityVerifier {

fn has_good_judgement(who: &AccountId) -> bool {
if let Some(judgements) =
IdentityOf::<Test>::get(who).map(|(registration, _)| registration.judgements)
IdentityOf::<Test>::get(who).map(|registration| registration.judgements)
{
judgements
.iter()
Expand Down
28 changes: 20 additions & 8 deletions substrate/frame/identity/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,24 @@ no state-bloat attack is viable.

#### Usernames

The pallet provides functionality for username authorities to issue usernames. When an account
receives a username, they get a default instance of `IdentityInfo`. Usernames also serve as a
reverse lookup from username to account.
The pallet provides functionality for username authorities to issue usernames, which are independent
of the identity information functionality; an account can set:
- an identity without setting a username
- a username without setting an identity
- an identity and a username

Username authorities are given an allocation by governance to prevent state bloat. Usernames
impose no cost or deposit on the user.
The username functionality implemented in this pallet is meant to be a user friendly lookup of
accounts. There are mappings in both directions, "account -> username" and "username -> account".

Users can have multiple usernames that map to the same `AccountId`, however one `AccountId` can
only map to a single username, known as the *primary*.
To grant a username, a username authority can either:
- be given an allocation by governane of a specific amount of usernames to issue for free,
georgepisaltu marked this conversation as resolved.
Show resolved Hide resolved
joepetrowski marked this conversation as resolved.
Show resolved Hide resolved
without any deposit associated with storage costs;
- put up a deposit for each username it issues (usually a subsidized, reduced deposit, relative
to other deposits in the system).

Users can have multiple usernames that map to the same `AccountId`, however one `AccountId` can only
map to a single username, known as the _primary_. This primary username will be the result of a
lookup in the `UsernameOf` map for any given account.

### Interface

Expand All @@ -50,7 +59,8 @@ only map to a single username, known as the *primary*.
- `accept_username` - Accept a username issued by a username authority.
- `remove_expired_approval` - Remove a username that was issued but never accepted.
- `set_primary_username` - Set a given username as an account's primary.
- `remove_dangling_username` - Remove a username that maps to an account without an identity.
- `remove_dangling_username` - Remove a username that maps to an account without a primary username.
- `remove_username` - Remove a username after its grace period has ended.

##### For General Users with Sub-Identities
- `set_subs` - Set the sub-accounts of an identity.
Expand All @@ -66,12 +76,14 @@ only map to a single username, known as the *primary*.

##### For Username Authorities
- `set_username_for` - Set a username for a given account. The account must approve it.
- `unbind_username` - Start the grace period for a username.

##### For Superusers
- `add_registrar` - Add a new registrar to the system.
- `kill_identity` - Forcibly remove the associated identity; the deposit is lost.
- `add_username_authority` - Add an account with the ability to issue usernames.
- `remove_username_authority` - Remove an account with the ability to issue usernames.
- `kill_username` - Forcibly remove a username.

[`Call`]: ./enum.Call.html
[`Config`]: ./trait.Config.html
Expand Down
Loading
Loading