From dff6d0e462d3e8b2095b7fff1b5d6e8519abcc7a Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Thu, 7 Feb 2019 14:38:45 -0800 Subject: [PATCH] Merge PR #3551: Code cleanup, small coverage boost --- client/keys/utils.go | 3 ++ crypto/keys/keybase.go | 3 ++ server/init.go | 91 +++--------------------------------------- server/init_test.go | 49 +++++++++++++++++++++++ 4 files changed, 61 insertions(+), 85 deletions(-) create mode 100644 server/init_test.go diff --git a/client/keys/utils.go b/client/keys/utils.go index 1aef97f7f..5c0b6db19 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -79,6 +79,9 @@ func NewKeyBaseFromDir(rootDir string) (keys.Keybase, error) { return getLazyKeyBaseFromDir(rootDir) } +// NewInMemoryKeyBase returns a storage-less keybase. +func NewInMemoryKeyBase() keys.Keybase { return keys.NewInMemory() } + func getLazyKeyBaseFromDir(rootDir string) (keys.Keybase, error) { return keys.NewLazyKeybase(KeyDBName, filepath.Join(rootDir, "keys")), nil } diff --git a/crypto/keys/keybase.go b/crypto/keys/keybase.go index 635a62f77..285183f57 100644 --- a/crypto/keys/keybase.go +++ b/crypto/keys/keybase.go @@ -83,6 +83,9 @@ func New(db dbm.DB) Keybase { } } +// NewInMemory creates a new keybase on top of in-memory storage instance. +func NewInMemory() Keybase { return dbKeybase{dbm.NewMemDB()} } + // CreateMnemonic generates a new key and persists it to storage, encrypted // using the provided password. // It returns the generated mnemonic and the key Info. diff --git a/server/init.go b/server/init.go index b0d44d1f0..58cf98d0a 100644 --- a/server/init.go +++ b/server/init.go @@ -1,101 +1,21 @@ package server import ( - "encoding/json" - "errors" "fmt" - "github.com/tendermint/tendermint/crypto" - dbm "github.com/tendermint/tendermint/libs/db" - "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys" - tmtypes "github.com/tendermint/tendermint/types" - clkeys "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" ) -// SimpleGenTx is a simple genesis tx -type SimpleGenTx struct { - Addr sdk.AccAddress `json:"addr"` -} - -//_____________________________________________________________________ - -// Generate a genesis transaction -func SimpleAppGenTx(cdc *codec.Codec, pk crypto.PubKey) ( - appGenTx, cliPrint json.RawMessage, validator types.GenesisValidator, err error) { - var addr sdk.AccAddress - var secret string - addr, secret, err = GenerateCoinKey() - if err != nil { - return - } - var bz []byte - simpleGenTx := SimpleGenTx{Addr: addr} - bz, err = cdc.MarshalJSON(simpleGenTx) - if err != nil { - return - } - appGenTx = json.RawMessage(bz) - mm := map[string]string{"secret": secret} - bz, err = cdc.MarshalJSON(mm) - if err != nil { - return - } - cliPrint = json.RawMessage(bz) - validator = tmtypes.GenesisValidator{ - PubKey: pk, - Power: 10, - } - return -} - -// create the genesis app state -func SimpleAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( - appState json.RawMessage, err error) { - - if len(appGenTxs) != 1 { - err = errors.New("must provide a single genesis transaction") - return - } - - var tx SimpleGenTx - err = cdc.UnmarshalJSON(appGenTxs[0], &tx) - if err != nil { - return - } - - appState = json.RawMessage(fmt.Sprintf(`{ - "accounts": [{ - "address": "%s", - "coins": [ - { - "denom": "mycoin", - "amount": "9007199254740992" - } - ] - }] -}`, tx.Addr)) - return -} - -//___________________________________________________________________________________________ - // GenerateCoinKey returns the address of a public key, along with the secret // phrase to recover the private key. func GenerateCoinKey() (sdk.AccAddress, string, error) { - // construct an in-memory key store - keybase := keys.New( - dbm.NewMemDB(), - ) - // generate a private key, with recovery phrase - info, secret, err := keybase.CreateMnemonic("name", keys.English, "pass", keys.Secp256k1) + info, secret, err := clkeys.NewInMemoryKeyBase().CreateMnemonic( + "name", keys.English, "pass", keys.Secp256k1) if err != nil { return sdk.AccAddress([]byte{}), "", err } @@ -105,7 +25,8 @@ func GenerateCoinKey() (sdk.AccAddress, string, error) { // GenerateSaveCoinKey returns the address of a public key, along with the secret // phrase to recover the private key. -func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, overwrite bool) (sdk.AccAddress, string, error) { +func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, + overwrite bool) (sdk.AccAddress, string, error) { // get the keystore from the client keybase, err := clkeys.NewKeyBaseFromDir(clientRoot) @@ -127,6 +48,6 @@ func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, overwrite bool) (s if err != nil { return sdk.AccAddress([]byte{}), "", err } - addr := info.GetPubKey().Address() - return sdk.AccAddress(addr), secret, nil + + return sdk.AccAddress(info.GetPubKey().Address()), secret, nil } diff --git a/server/init_test.go b/server/init_test.go new file mode 100644 index 000000000..632042050 --- /dev/null +++ b/server/init_test.go @@ -0,0 +1,49 @@ +package server_test + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/cosmos/cosmos-sdk/client/keys" + "github.com/cosmos/cosmos-sdk/server" + "github.com/stretchr/testify/require" +) + +func TestGenerateCoinKey(t *testing.T) { + addr, mnemonic, err := server.GenerateCoinKey() + require.NoError(t, err) + + // Test creation + info, err := keys.NewInMemoryKeyBase().CreateAccount("xxx", mnemonic, "", "012345678", 0, 0) + require.NoError(t, err) + require.Equal(t, addr, info.GetAddress()) +} + +func TestGenerateSaveCoinKey(t *testing.T) { + dir, cleanup := tempdir(t) + defer cleanup() // clean after itself + // Remove the dir to that GenerateSaveCoinKey creates it automatically + os.RemoveAll(dir) + + addr, mnemonic, err := server.GenerateSaveCoinKey(dir, "keyname", "012345678", false) + require.NoError(t, err) + + // Test key was actually saved + kb, err := keys.NewKeyBaseFromDir(dir) + require.NoError(t, err) + info, err := kb.Get("keyname") + require.NoError(t, err) + require.Equal(t, addr, info.GetAddress()) + + // Test in-memory recovery + info, err = keys.NewInMemoryKeyBase().CreateAccount("xxx", mnemonic, "", "012345678", 0, 0) + require.NoError(t, err) + require.Equal(t, addr, info.GetAddress()) +} + +func tempdir(t *testing.T) (string, func()) { + dir, err := ioutil.TempDir("", t.Name()+"_") + require.NoError(t, err) + return dir, func() { os.RemoveAll(dir) } +}