Accounts contain authentication information for a uniquely identified external user of an SDK blockchain, including public key, address, and account number / sequence number for replay protection. For efficiency, since account balances must also be fetched to pay fees, account structs also store the balance of a user as sdk.Coins.
Accounts are exposed externally as an interface, and stored internally as either a base account or vesting account. Module clients wishing to add more account types may do so.
0x01 | Address -> ProtocolBuffer(account)
Account Interface
The account interface exposes methods to read and write standard account information. Note that all of these methods operate on an account struct confirming to the interface - in order to write the account to the store, the account keeper will need to be used.
// AccountI is an interface used to store coins at a given address within state.// It presumes a notion of sequence numbers for replay protection,// a notion of account numbers for replay protection for previously pruned accounts,// and a pubkey for authentication purposes.//// Many complex conditions can be used in the concrete struct which implements AccountI.typeAccountIinterface {proto.MessageGetAddress() sdk.AccAddressSetAddress(sdk.AccAddress) error// errors if already set.GetPubKey() crypto.PubKey// can return nil.SetPubKey(crypto.PubKey) errorGetAccountNumber() uint64SetAccountNumber(uint64) errorGetSequence() uint64SetSequence(uint64) error// Ensure that account implements stringerString() string}
Base Account
A base account is the simplest and most common account type, which just stores all requisite fields directly in a struct.
// BaseAccount defines a base account type. It contains all the necessary fields// for basic account functionality. Any custom account type should extend this// type for additional functionality (e.g. vesting).message BaseAccount {string address =1; google.protobuf.Any pub_key =2;uint64 account_number =3;uint64 sequence =4;}