Skip to main content

Changelog

  • 2019-08-30: initial draft

Context

Currently, the Cosmos SDK allows for custom account types; the auth keeper stores any type fulfilling its Account interface. However auth does not handle exporting or loading accounts to/from a genesis file, this is done by genaccounts, which only handles one of 4 concrete account types (BaseAccount, ContinuousVestingAccount, DelayedVestingAccount and ModuleAccount). Projects desiring to use custom accounts (say custom vesting accounts) need to fork and modify genaccounts.

Decision

In summary, we will (un)marshal all accounts (interface types) directly using amino, rather than converting to genaccounts’s GenesisAccount type. Since doing this removes the majority of genaccounts’s code, we will merge genaccounts into auth. Marshalled accounts will be stored in auth’s genesis state. Detailed changes:

1) (Un)Marshal accounts directly using amino

The auth module’s GenesisState gains a new field Accounts. Note these aren’t of type exported.Account for reasons outlined in section 3.
Now auth’s InitGenesis and ExportGenesis (un)marshal accounts as well as the defined params.

2) Register custom account types on the auth codec

The auth codec must have all custom account types registered to marshal them. We will follow the pattern established in gov for proposals. An example custom account definition:
The auth codec definition:

3) Genesis validation for custom account types

Modules implement a ValidateGenesis method. As auth does not know of account implementations, accounts will need to validate themselves. We will unmarshal accounts into a GenesisAccount interface that includes a Validate method.
Then the auth ValidateGenesis function becomes:

4) Move add-genesis-account cli to auth

The genaccounts module contains a cli command to add base or vesting accounts to a genesis file. This will be moved to auth. We will leave it to projects to write their own commands to add custom accounts. An extensible cli handler, similar to gov, could be created but it is not worth the complexity for this minor use case.

5) Update module and vesting accounts

Under the new scheme, module and vesting account types need some minor updates:
  • Type registration on auth’s codec (shown above)
  • A Validate method for each Account concrete type

Status

Proposed

Consequences

Positive

  • custom accounts can be used without needing to fork genaccounts
  • reduction in lines of code

Negative

Neutral

  • genaccounts module no longer exists
  • accounts in genesis files are stored under accounts in auth rather than in the genaccounts module. -add-genesis-account cli command now in auth

References