status-go/account/generator
Andrea Maria Piana c78e084eb9 Fix tests and lint
2020-12-17 14:10:00 +01:00
..
account.go Fix tests and lint 2020-12-17 14:10:00 +01:00
generator.go Fix failing tests due to account not present in test env 2020-12-17 14:10:00 +01:00
generator_test.go Use goimports instead of gofmt 2020-01-06 10:17:23 +01:00
path_decoder.go add multi-account support (#1500) 2019-07-24 20:59:15 +02:00
path_decoder_test.go add multi-account support (#1500) 2019-07-24 20:59:15 +02:00
README.md add multi-account LoadAccount, ImportMnemonic, and Reset functions (#1542) 2019-07-26 11:33:38 +02:00
utils.go Abstract accounts.Key and geth keystore 2020-01-06 10:17:23 +01:00
utils_test.go Use goimports instead of gofmt 2020-01-06 10:17:23 +01:00

Account Generator

The Account Generator is used to generate, import, derive child keys, and store accounts. It is instantiated in the account.Manager struct and it's accessible from the lib and mobile package through functions with the MultiAccount prefix:

  • MultiAccountGenerate
  • MultiAccountGenerateAndDeriveAddresses
  • MultiAccountImportMnemonic
  • MultiAccountDeriveAddresses
  • MultiAccountStoreDerivedAccounts
  • MultiAccountImportPrivateKey
  • MultiAccountStoreAccount
  • MultiAccountLoadAccount
  • MultiAccountReset

Using Generate and ImportMnemonic, a master key is loaded in memory and a random temporarily id is returned. Bare in mind these accounts are not saved. They are in memory until StoreAccount or StoreDerivedAccounts are called. Calling Reset or restarting the application will remove everything from memory. Logging-in and Logging-out will do the same.

Since Generate and ImportMnemonic create extended keys, we can use those keys to derive new child keys. MultiAccountDeriveAddresses(id, paths) returns a list of addresses/pubKey, one for each path. This can be used to check balances on those addresses and show them to the user.

Once the user is happy with some specific derivation paths, we can store them using StoreDerivedAccounts(id, passwordToEncryptKey, paths). StoreDerivedAccounts returns an address/pubKey for each path. The address can be use in the future to load them in memory again. Calling StoreDerivedAccounts will encrypt and store the keys, each one in a keystore json file, and remove all the keys from memory. Since they are derived from an extended key, they are extended keys too, so they can be used in the future to derive more child keys. StoreAccount stores the key identified by its ID, so in case the key comes from Generate or ImportPrivateKey, it will store the master key. In general we want to avoid saving master keys, so we should only use StoreDerivedAccounts for extended keys, and StoreAccount for normal keys.

Calling Load(address, password) will unlock the key specified by addresses using password, and load it in memory. Load returns a new id that can be used again with DeriveAddresses, StoreAccount, and StoreDerivedAccounts.

ImportPrivateKey imports a raw private key specified by its hex form. It's not an extended key, so it can't be used to derive child addresses. You can call DeriveAddresses to derive the address/pubKey of a normal key passing an empty string as derivation path. StoreAccount will save the key without deriving a child key.