Merge PR #3593: hide dbKeybase's constructor

This commit is contained in:
Alessio Treglia 2019-02-11 17:18:58 -08:00 committed by Jack Zampolin
parent 9c23fe68ee
commit fe548c0829
9 changed files with 49 additions and 87 deletions

View File

@ -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

View File

@ -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())
}

View File

@ -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)

View File

@ -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

View File

@ -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"),

View File

@ -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

View File

@ -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

View File

@ -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() {}