diff --git a/PENDING.md b/PENDING.md index 4828030dc5..96e8209a08 100644 --- a/PENDING.md +++ b/PENDING.md @@ -9,6 +9,11 @@ BREAKING CHANGES * Gaia * SDK + * \#3592 Drop deprecated keybase implementation's + New constructor in favor of a new + crypto/keys.New(string, string) implementation that + returns a lazy keybase instance. Remove client.MockKeyBase, + superseded by crypto/keys.NewInMemory() * Tendermint diff --git a/client/keys.go b/client/keys.go deleted file mode 100644 index 3e0b61d461..0000000000 --- a/client/keys.go +++ /dev/null @@ -1,14 +0,0 @@ -package client - -import ( - dbm "github.com/tendermint/tendermint/libs/db" - - "github.com/cosmos/cosmos-sdk/crypto/keys" -) - -// MockKeyBase generates an in-memory keybase that will be discarded -// useful for --dry-run to generate a seed phrase without -// storing the key -func MockKeyBase() keys.Keybase { - return keys.New(dbm.NewMemDB()) -} diff --git a/client/keys/add.go b/client/keys/add.go index 47b9a19a1f..9b437a340b 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -104,7 +104,7 @@ func runAddCmd(_ *cobra.Command, args []string) error { if viper.GetBool(flagDryRun) { // we throw this away, so don't enforce args, // we want to get a new random seed phrase quickly - kb = client.MockKeyBase() + kb = keys.NewInMemory() encryptPassword = app.DefaultKeyPass } else { kb, err = NewKeyBaseFromHomeFlag() @@ -309,7 +309,7 @@ func printCreate(info keys.Info, showMnemonic bool, mnemonic string) error { // function to just create a new seed to display in the UI before actually persisting it in the keybase func generateMnemonic(algo keys.SigningAlgo) string { - kb := client.MockKeyBase() + kb := keys.NewInMemory() pass := app.DefaultKeyPass name := "inmemorykey" _, seed, _ := kb.CreateMnemonic(name, keys.English, pass, algo) diff --git a/client/keys/keys/keys.db/LOCK b/client/keys/keys/keys.db/LOCK deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/client/keys/utils.go b/client/keys/utils.go index d772b81514..d5c2f2f55b 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -14,11 +14,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -// KeyDBName is the directory under root where we store the keys +// available output formats. const ( - KeyDBName = "keys" OutputFormatText = "text" OutputFormatJSON = "json" + + // defaultKeyDBName is the client's subdirectory where keys are stored. + defaultKeyDBName = "keys" ) type bechKeyOutFn func(keyInfo keys.Info) (KeyOutput, error) @@ -87,7 +89,7 @@ func NewKeyBaseFromDir(rootDir string) (keys.Keybase, error) { func NewInMemoryKeyBase() keys.Keybase { return keys.NewInMemory() } func getLazyKeyBaseFromDir(rootDir string) (keys.Keybase, error) { - return keys.NewLazyKeybase(KeyDBName, filepath.Join(rootDir, "keys")), nil + return keys.New(defaultKeyDBName, filepath.Join(rootDir, "keys")), nil } // create a list of KeyOutput in bech32 format diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 9e6f08fe9a..ae126ef1d5 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -682,7 +682,7 @@ func doTransferWithGas( ) (res *http.Response, body string, receiveAddr sdk.AccAddress) { // create receive address - kb := client.MockKeyBase() + kb := crkeys.NewInMemory() receiveInfo, _, err := kb.CreateMnemonic( "receive_address", crkeys.English, gapp.DefaultKeyPass, crkeys.SigningAlgo("secp256k1"), @@ -724,7 +724,7 @@ func doTransferWithGasAccAuto( ) (res *http.Response, body string, receiveAddr sdk.AccAddress) { // create receive address - kb := client.MockKeyBase() + kb := crkeys.NewInMemory() receiveInfo, _, err := kb.CreateMnemonic( "receive_address", crkeys.English, gapp.DefaultKeyPass, crkeys.SigningAlgo("secp256k1"), diff --git a/crypto/keys/keybase.go b/crypto/keys/keybase.go index 5d911ea616..f79ed20253 100644 --- a/crypto/keys/keybase.go +++ b/crypto/keys/keybase.go @@ -77,14 +77,15 @@ type dbKeybase struct { db dbm.DB } -// New creates a new keybase instance using the passed DB for reading and writing keys. -func New(db dbm.DB) Keybase { +// newDbKeybase creates a new keybase instance using the passed DB for reading and writing keys. +func newDbKeybase(db dbm.DB) Keybase { return dbKeybase{ db: db, } } -// NewInMemory creates a new keybase on top of in-memory storage instance. +// NewInMemory creates a transient keybase on top of in-memory storage +// instance useful for testing purposes and on-the-fly key generation. func NewInMemory() Keybase { return dbKeybase{dbm.NewMemDB()} } // CreateMnemonic generates a new key and persists it to storage, encrypted diff --git a/crypto/keys/keybase_test.go b/crypto/keys/keybase_test.go index 6ccbcfb2a6..330cee4f3e 100644 --- a/crypto/keys/keybase_test.go +++ b/crypto/keys/keybase_test.go @@ -1,51 +1,34 @@ -package keys +package keys_test import ( "fmt" - "io/ioutil" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + . "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/hd" "github.com/cosmos/cosmos-sdk/crypto/keys/mintkey" "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" - dbm "github.com/tendermint/tendermint/libs/db" ) func init() { mintkey.BcryptSecurityParameter = 1 } -func TestKeybaseOpenClose(t *testing.T) { - dir, err := ioutil.TempDir("", "TestKeybaseOpenClose") - assert.Nil(t, err) - - kb := New(dbm.NewDB("TestKeybaseOpenClose", dbm.LevelDBBackend, dir)) - kb.CloseDB() - - // The DB has been closed. At the moment, the expected behaviour is to panic - assert.Panics(t, func() { - _, _ = kb.CreateAccount( - "some_account", - "key pair crucial catch public canyon evil outer stage ten gym tornado", - "", "", 0, 1) - }) -} - func TestLanguage(t *testing.T) { - kb := New(dbm.NewMemDB()) + kb := NewInMemory() _, _, err := kb.CreateMnemonic("something", Japanese, "no_pass", Secp256k1) assert.Error(t, err) assert.Equal(t, "unsupported language: only english is supported", err.Error()) } func TestCreateAccountInvalidMnemonic(t *testing.T) { - kb := New(dbm.NewMemDB()) + kb := NewInMemory() _, err := kb.CreateAccount( "some_account", "malarkey pair crucial catch public canyon evil outer stage ten gym tornado", @@ -55,14 +38,14 @@ func TestCreateAccountInvalidMnemonic(t *testing.T) { } func TestCreateLedgerUnsupportedAlgo(t *testing.T) { - kb := New(dbm.NewMemDB()) + kb := NewInMemory() _, err := kb.CreateLedger("some_account", Ed25519, 0, 1) assert.Error(t, err) assert.Equal(t, "unsupported signing algo: only secp256k1 is supported", err.Error()) } func TestCreateLedger(t *testing.T) { - kb := New(dbm.NewMemDB()) + kb := NewInMemory() // test_cover and test_unit will result in different answers // test_cover does not compile some dependencies so ledger is disabled @@ -101,8 +84,7 @@ func TestCreateLedger(t *testing.T) { // TestKeyManagement makes sure we can manipulate these keys well func TestKeyManagement(t *testing.T) { // make the storage with reasonable defaults - db := dbm.NewMemDB() - cstore := New(db) + cstore := NewInMemory() algo := Secp256k1 n1, n2, n3 := "personal", "business", "other" @@ -180,13 +162,12 @@ func TestKeyManagement(t *testing.T) { // addr cache gets nuked - and test skip flag err = cstore.Delete(n2, "", true) require.NoError(t, err) - require.False(t, db.Has(addrKey(i2.GetAddress()))) } // TestSignVerify does some detailed checks on how we sign and validate // signatures func TestSignVerify(t *testing.T) { - cstore := New(dbm.NewMemDB()) + cstore := NewInMemory() algo := Secp256k1 n1, n2, n3 := "some dude", "a dudette", "dude-ish" @@ -268,12 +249,8 @@ func assertPassword(t *testing.T, cstore Keybase, name, pass, badpass string) { // TestExportImport tests exporting and importing func TestExportImport(t *testing.T) { - // make the storage with reasonable defaults - db := dbm.NewMemDB() - cstore := New( - db, - ) + cstore := NewInMemory() info, _, err := cstore.CreateMnemonic("john", English, "secretcpw", Secp256k1) require.NoError(t, err) @@ -301,10 +278,7 @@ func TestExportImport(t *testing.T) { // func TestExportImportPubKey(t *testing.T) { // make the storage with reasonable defaults - db := dbm.NewMemDB() - cstore := New( - db, - ) + cstore := NewInMemory() // CreateMnemonic a private-public key pair and ensure consistency notPasswd := "n9y25ah7" @@ -342,11 +316,8 @@ func TestExportImportPubKey(t *testing.T) { // TestAdvancedKeyManagement verifies update, import, export functionality func TestAdvancedKeyManagement(t *testing.T) { - // make the storage with reasonable defaults - cstore := New( - dbm.NewMemDB(), - ) + cstore := NewInMemory() algo := Secp256k1 n1, n2 := "old-name", "new name" @@ -394,9 +365,7 @@ func TestAdvancedKeyManagement(t *testing.T) { func TestSeedPhrase(t *testing.T) { // make the storage with reasonable defaults - cstore := New( - dbm.NewMemDB(), - ) + cstore := NewInMemory() algo := Secp256k1 n1, n2 := "lost-key", "found-again" @@ -425,9 +394,7 @@ func TestSeedPhrase(t *testing.T) { func ExampleNew() { // Select the encryption and storage for your cryptostore - cstore := New( - dbm.NewMemDB(), - ) + cstore := NewInMemory() sec := Secp256k1 diff --git a/crypto/keys/lazy_keybase.go b/crypto/keys/lazy_keybase.go index c260839722..ce3a371c8f 100644 --- a/crypto/keys/lazy_keybase.go +++ b/crypto/keys/lazy_keybase.go @@ -15,7 +15,8 @@ type lazyKeybase struct { dir string } -func NewLazyKeybase(name, dir string) Keybase { +// New creates a new instance of a lazy keybase. +func New(name, dir string) Keybase { return lazyKeybase{name: name, dir: dir} } @@ -25,7 +26,7 @@ func (lkb lazyKeybase) List() ([]Info, error) { return nil, err } defer db.Close() - return New(db).List() + return newDbKeybase(db).List() } func (lkb lazyKeybase) Get(name string) (Info, error) { @@ -34,7 +35,7 @@ func (lkb lazyKeybase) Get(name string) (Info, error) { return nil, err } defer db.Close() - return New(db).Get(name) + return newDbKeybase(db).Get(name) } func (lkb lazyKeybase) GetByAddress(address types.AccAddress) (Info, error) { @@ -43,7 +44,7 @@ func (lkb lazyKeybase) GetByAddress(address types.AccAddress) (Info, error) { return nil, err } defer db.Close() - return New(db).GetByAddress(address) + return newDbKeybase(db).GetByAddress(address) } func (lkb lazyKeybase) Delete(name, passphrase string, skipPass bool) error { @@ -52,7 +53,7 @@ func (lkb lazyKeybase) Delete(name, passphrase string, skipPass bool) error { return err } defer db.Close() - return New(db).Delete(name, passphrase, skipPass) + return newDbKeybase(db).Delete(name, passphrase, skipPass) } func (lkb lazyKeybase) Sign(name, passphrase string, msg []byte) ([]byte, crypto.PubKey, error) { @@ -61,7 +62,7 @@ func (lkb lazyKeybase) Sign(name, passphrase string, msg []byte) ([]byte, crypto return nil, nil, err } defer db.Close() - return New(db).Sign(name, passphrase, msg) + return newDbKeybase(db).Sign(name, passphrase, msg) } func (lkb lazyKeybase) CreateMnemonic(name string, language Language, passwd string, algo SigningAlgo) (info Info, seed string, err error) { @@ -70,7 +71,7 @@ func (lkb lazyKeybase) CreateMnemonic(name string, language Language, passwd str return nil, "", err } defer db.Close() - return New(db).CreateMnemonic(name, language, passwd, algo) + return newDbKeybase(db).CreateMnemonic(name, language, passwd, algo) } func (lkb lazyKeybase) CreateAccount(name, mnemonic, bip39Passwd, encryptPasswd string, account uint32, index uint32) (Info, error) { @@ -79,7 +80,7 @@ func (lkb lazyKeybase) CreateAccount(name, mnemonic, bip39Passwd, encryptPasswd return nil, err } defer db.Close() - return New(db).CreateAccount(name, mnemonic, bip39Passwd, encryptPasswd, account, index) + return newDbKeybase(db).CreateAccount(name, mnemonic, bip39Passwd, encryptPasswd, account, index) } func (lkb lazyKeybase) Derive(name, mnemonic, bip39Passwd, encryptPasswd string, params hd.BIP44Params) (Info, error) { @@ -88,7 +89,7 @@ func (lkb lazyKeybase) Derive(name, mnemonic, bip39Passwd, encryptPasswd string, return nil, err } defer db.Close() - return New(db).Derive(name, mnemonic, bip39Passwd, encryptPasswd, params) + return newDbKeybase(db).Derive(name, mnemonic, bip39Passwd, encryptPasswd, params) } func (lkb lazyKeybase) CreateLedger(name string, algo SigningAlgo, account uint32, index uint32) (info Info, err error) { @@ -97,7 +98,7 @@ func (lkb lazyKeybase) CreateLedger(name string, algo SigningAlgo, account uint3 return nil, err } defer db.Close() - return New(db).CreateLedger(name, algo, account, index) + return newDbKeybase(db).CreateLedger(name, algo, account, index) } func (lkb lazyKeybase) CreateOffline(name string, pubkey crypto.PubKey) (info Info, err error) { @@ -106,7 +107,7 @@ func (lkb lazyKeybase) CreateOffline(name string, pubkey crypto.PubKey) (info In return nil, err } defer db.Close() - return New(db).CreateOffline(name, pubkey) + return newDbKeybase(db).CreateOffline(name, pubkey) } func (lkb lazyKeybase) Update(name, oldpass string, getNewpass func() (string, error)) error { @@ -115,7 +116,7 @@ func (lkb lazyKeybase) Update(name, oldpass string, getNewpass func() (string, e return err } defer db.Close() - return New(db).Update(name, oldpass, getNewpass) + return newDbKeybase(db).Update(name, oldpass, getNewpass) } func (lkb lazyKeybase) Import(name string, armor string) (err error) { @@ -124,7 +125,7 @@ func (lkb lazyKeybase) Import(name string, armor string) (err error) { return err } defer db.Close() - return New(db).Import(name, armor) + return newDbKeybase(db).Import(name, armor) } func (lkb lazyKeybase) ImportPubKey(name string, armor string) (err error) { @@ -133,7 +134,7 @@ func (lkb lazyKeybase) ImportPubKey(name string, armor string) (err error) { return err } defer db.Close() - return New(db).ImportPubKey(name, armor) + return newDbKeybase(db).ImportPubKey(name, armor) } func (lkb lazyKeybase) Export(name string) (armor string, err error) { @@ -142,7 +143,7 @@ func (lkb lazyKeybase) Export(name string) (armor string, err error) { return "", err } defer db.Close() - return New(db).Export(name) + return newDbKeybase(db).Export(name) } func (lkb lazyKeybase) ExportPubKey(name string) (armor string, err error) { @@ -151,7 +152,7 @@ func (lkb lazyKeybase) ExportPubKey(name string) (armor string, err error) { return "", err } defer db.Close() - return New(db).ExportPubKey(name) + return newDbKeybase(db).ExportPubKey(name) } func (lkb lazyKeybase) ExportPrivateKeyObject(name string, passphrase string) (crypto.PrivKey, error) { @@ -160,7 +161,7 @@ func (lkb lazyKeybase) ExportPrivateKeyObject(name string, passphrase string) (c return nil, err } defer db.Close() - return New(db).ExportPrivateKeyObject(name, passphrase) + return newDbKeybase(db).ExportPrivateKeyObject(name, passphrase) } func (lkb lazyKeybase) CloseDB() {}