From 4e1f47e1872739fff6ac924410d4ed7d12a510bb Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Sat, 8 Aug 2020 14:25:02 +0100 Subject: [PATCH] Add ability to create HD accounts with a specific path --- cmd/accountcreate.go | 30 ++++++++++++++++++++++++------ docs/howto.md | 18 ++++++++++++++++++ docs/usage.md | 3 +++ go.mod | 6 +++--- go.sum | 6 ++++++ 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/cmd/accountcreate.go b/cmd/accountcreate.go index a026783..6c9a385 100644 --- a/cmd/accountcreate.go +++ b/cmd/accountcreate.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "os" + "regexp" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -62,12 +63,25 @@ In quiet mode this will return 0 if the account is created successfully, otherwi defer cancel() account, err = distributedCreator.CreateDistributedAccount(ctx, accountName, viper.GetUint32("participants"), viper.GetUint32("signing-threshold"), []byte(getPassphrase())) } else { - // Want a standard account. - creator, isCreator := wallet.(e2wtypes.WalletAccountCreator) - assert(isCreator, "Wallet does not support account creation") - ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("timeout")) - defer cancel() - account, err = creator.CreateAccount(ctx, accountName, []byte(getPassphrase())) + if viper.GetString("path") != "" { + // Want a pathed account + creator, isCreator := wallet.(e2wtypes.WalletPathedAccountCreator) + assert(isCreator, "Wallet does not support account creation with an explicit path") + var match bool + match, err = regexp.Match("^m/[0-9]+/[0-9]+(/[0-9+])+", []byte(viper.GetString("path"))) + errCheck(err, "Unable to match path to regular expression") + assert(match, "Path does not match expected format m/...") + ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("timeout")) + defer cancel() + account, err = creator.CreatePathedAccount(ctx, viper.GetString("path"), accountName, []byte(getPassphrase())) + } else { + // Want a standard account. + creator, isCreator := wallet.(e2wtypes.WalletAccountCreator) + assert(isCreator, "Wallet does not support account creation") + ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("timeout")) + defer cancel() + account, err = creator.CreateAccount(ctx, accountName, []byte(getPassphrase())) + } } errCheck(err, "Failed to create account") @@ -92,4 +106,8 @@ func init() { if err := viper.BindPFlag("signing-threshold", accountCreateCmd.Flags().Lookup("signing-threshold")); err != nil { panic(err) } + accountCreateCmd.Flags().String("path", "", "path of account (for hierarchical deterministic accounts)") + if err := viper.BindPFlag("path", accountCreateCmd.Flags().Lookup("path")); err != nil { + panic(err) + } } diff --git a/docs/howto.md b/docs/howto.md index df51ceb..a851047 100644 --- a/docs/howto.md +++ b/docs/howto.md @@ -65,3 +65,21 @@ ethdo wallet info --verbose --wallet="My wallet" ``` This will provide, amongst other information, a `Location` line giving the directory where the wallet information resides. + +## Recreate launchpad wallet and accounts + +Recreating launchpad accounts requires two steps: recreating the wallet, and recreating the individual accounts. All that is required is the mnemonic from the launchpad process. + +To recreate the wallet with the given mnemonic run the following command (changing the wallet name, passphrase and mnemonic as required): + +```sh +ethdo wallet create --wallet="Launchpad" --type=hd --walletpassphrase=walletsecret --mnemonic="faculty key lamp panel appear choose express off absent dance strike twenty elephant expect swift that resist bicycle kind sun favorite evoke engage thumb" +``` + +Launchpad accounts are identified by their path. The path can be seen in the filename of the keystore, for example the filename `keystore-m_12381_3600_1_0_0-1596891358.json` relates to a path of `m/12381/3600/1/0/0`. It is also present directly in the keystore under the `path` key. + +To create an account corresponding to this key you would use the command: + +```sh +ethdo account create --wallet="Launchpad" --walletpassphrase=walletsecret --passphrase=secret --path=m/12381/3600/1/0/0 +``` diff --git a/docs/usage.md b/docs/usage.md index a8458e1..9ae969f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -112,9 +112,12 @@ Account commands focus on information about local accounts, generally those used `ethdo account create` creates a new account with the given parameters. Options for creating an account include: - `account`: the name of the account to create - `passphrase`: the passphrase for the account + - `path`: the HD path for the account (only for hierarchical deterministic accounts) Note that for hierarchical deterministic wallets you will also need to supply `--walletpassphrase` to unlock the wallet seed. +For distributed accounts you will also need to supply `--participants` and `--signing-threshold`. + ```sh $ ethdo account create --account="Personal wallet/Operations" --walletpassphrase="my wallet secret" --passphrase="my account secret" ``` diff --git a/go.mod b/go.mod index 7c86429..c335249 100644 --- a/go.mod +++ b/go.mod @@ -30,15 +30,15 @@ require ( github.com/wealdtech/go-ecodec v1.1.0 github.com/wealdtech/go-eth2-types/v2 v2.5.0 github.com/wealdtech/go-eth2-util v1.5.0 - github.com/wealdtech/go-eth2-wallet v1.12.0 + github.com/wealdtech/go-eth2-wallet v1.13.0 github.com/wealdtech/go-eth2-wallet-dirk v1.0.1 github.com/wealdtech/go-eth2-wallet-distributed v1.1.0 github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.1.0 - github.com/wealdtech/go-eth2-wallet-hd/v2 v2.3.0 + github.com/wealdtech/go-eth2-wallet-hd/v2 v2.4.0 github.com/wealdtech/go-eth2-wallet-nd/v2 v2.3.0 github.com/wealdtech/go-eth2-wallet-store-filesystem v1.16.1 github.com/wealdtech/go-eth2-wallet-store-s3 v1.8.0 - github.com/wealdtech/go-eth2-wallet-types/v2 v2.6.0 + github.com/wealdtech/go-eth2-wallet-types/v2 v2.7.0 github.com/wealdtech/go-string2eth v1.1.0 golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 // indirect golang.org/x/text v0.3.3 // indirect diff --git a/go.sum b/go.sum index 7426875..74e7035 100644 --- a/go.sum +++ b/go.sum @@ -334,6 +334,8 @@ github.com/wealdtech/go-eth2-wallet v1.11.0 h1:2KfrWDqF4sWGgk4N5+DaYmh0hOnqiCl0P github.com/wealdtech/go-eth2-wallet v1.11.0/go.mod h1:E9ZRNO4JNdi27ys7oc+xWWucXu4IGfV5q1vWC9X3oqg= github.com/wealdtech/go-eth2-wallet v1.12.0 h1:nrwI3jPhehUhJGlBtNv/UmIo/57llvuVZZavLnfdQHI= github.com/wealdtech/go-eth2-wallet v1.12.0/go.mod h1:ouV+YSMbzk2dyecmofm8jhaMKdSigdIPMSnSqmWEfW8= +github.com/wealdtech/go-eth2-wallet v1.13.0 h1:ayy/jBcKVZhqU4OMlZDieRzhwSiF3Ozmc3e3LrdpWro= +github.com/wealdtech/go-eth2-wallet v1.13.0/go.mod h1:O4efkfrSBRRa7Q8vZQ8usUCBRki+/zE531b3JqScIII= github.com/wealdtech/go-eth2-wallet-dirk v1.0.0 h1:1QUcWILF3h4OLCgTPpWklvRSuPu0fqrt15jwSm7CSC4= github.com/wealdtech/go-eth2-wallet-dirk v1.0.0/go.mod h1:VTzjJ51dedvYPr4huI7g7KXZVTpGR6ZrCDQwBxJpLck= github.com/wealdtech/go-eth2-wallet-dirk v1.0.1 h1:YUE1QlJPun8b+xbz0JM71/3t1i9zp9KjcZdJvtJQL+E= @@ -351,6 +353,8 @@ github.com/wealdtech/go-eth2-wallet-hd/v2 v2.2.0 h1:L+yrAn8TC9DQUw+S7moOJxQTp2jr github.com/wealdtech/go-eth2-wallet-hd/v2 v2.2.0/go.mod h1:lhSwtkIO/Pfg5kz8k50yrDgj7ZQaElCPsXnixlrQn/I= github.com/wealdtech/go-eth2-wallet-hd/v2 v2.3.0 h1:UORXUYRoUYgYF96Y+QiBq33OKQVtn/nEjnSoQbe1UOA= github.com/wealdtech/go-eth2-wallet-hd/v2 v2.3.0/go.mod h1:Kc/8WcqMTczfH2xy5mDfCRd0NI/ca/j2jXmqJ7gz8yk= +github.com/wealdtech/go-eth2-wallet-hd/v2 v2.4.0 h1:bqG/i1fpDpnQFgJ+NBLgOLdmGhXiinwlrFVD1OAgZlo= +github.com/wealdtech/go-eth2-wallet-hd/v2 v2.4.0/go.mod h1:xBbzc+aRD06dTL5phnMshpM4sryyWYM8m86sjQKG5u0= github.com/wealdtech/go-eth2-wallet-nd/v2 v2.1.2/go.mod h1:IssxoHII0ewO1VysMfCmdJP1D00tRhRhXIhhaEXIOVE= github.com/wealdtech/go-eth2-wallet-nd/v2 v2.2.0 h1:h4eePfG0ANOJYMonmIYOvxJ9uLmBEX4APb2O8Vhtv6k= github.com/wealdtech/go-eth2-wallet-nd/v2 v2.2.0/go.mod h1:Un2EtseZWSObmTBjgkt7Qz2am54S/0115jrF83lto1U= @@ -380,6 +384,8 @@ github.com/wealdtech/go-eth2-wallet-types/v2 v2.5.0 h1:J29mbkSCUMl2xdu8Lg6U+JptF github.com/wealdtech/go-eth2-wallet-types/v2 v2.5.0/go.mod h1:X9kYUH/E5YMqFMZ4xL6MJanABUkJGaH/yPZRT2o+yYA= github.com/wealdtech/go-eth2-wallet-types/v2 v2.6.0 h1:vBrH5icPPSeb14cdShA7/P2PBZOgZscJ2IhBlTIaFrA= github.com/wealdtech/go-eth2-wallet-types/v2 v2.6.0/go.mod h1:X9kYUH/E5YMqFMZ4xL6MJanABUkJGaH/yPZRT2o+yYA= +github.com/wealdtech/go-eth2-wallet-types/v2 v2.7.0 h1:pquFQdIWEiSYrpIpFuvsRuialI8t9KhFsPvbIBPnzic= +github.com/wealdtech/go-eth2-wallet-types/v2 v2.7.0/go.mod h1:X9kYUH/E5YMqFMZ4xL6MJanABUkJGaH/yPZRT2o+yYA= github.com/wealdtech/go-indexer v1.0.0 h1:/S4rfWQbSOnnYmwnvuTVatDibZ8o1s9bmTCHO16XINg= github.com/wealdtech/go-indexer v1.0.0/go.mod h1:u1cjsbsOXsm5jzJDyLmZY7GsrdX8KYXKBXkZcAmk3Zg= github.com/wealdtech/go-string2eth v1.1.0 h1:USJQmysUrBYYmZs7d45pMb90hRSyEwizP7lZaOZLDAw=