Skip to content

Commit

Permalink
chore: move server.GenerateCoinKey and server.GenerateSaveCoinKey to …
Browse files Browse the repository at this point in the history
…testutil (cosmos#10956)

* chore: move server.GenerateCoinKey and server.GenerateSaveCoinKey to testutil

* add changelog

* move testutil/known_values.go to testutil/testdata

* changelog
  • Loading branch information
robert-zaremba authored and JimLarson committed Jul 7, 2022
1 parent 7b29a91 commit 2627b59
Show file tree
Hide file tree
Showing 15 changed files with 129 additions and 60 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### API Breaking Changes

* [\#10561](https://github.com/cosmos/cosmos-sdk/pull/10561) The `CommitMultiStore` interface contains a new `SetIAVLCacheSize` method
* [\#10922](https://github.com/cosmos/cosmos-sdk/pull/10922), [/#10956](https://github.com/cosmos/cosmos-sdk/pull/10956) Deprecate key `server.Generate*` functions and move them to `testutil` and support custom mnemonics in in-process testing network. Moved `TestMnemonic` from `testutil` package to `testdata`.

### Features

Expand Down
3 changes: 2 additions & 1 deletion client/keys/add_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/cosmos/cosmos-sdk/crypto/keyring"
"github.com/cosmos/cosmos-sdk/simapp"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
bip39 "github.com/cosmos/go-bip39"
)
Expand Down Expand Up @@ -200,7 +201,7 @@ func Test_runAddCmdDryRun(t *testing.T) {
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)

path := sdk.GetConfig().GetFullBIP44Path()
_, err = kb.NewAccount("subkey", testutil.TestMnemonic, "", path, hd.Secp256k1)
_, err = kb.NewAccount("subkey", testdata.TestMnemonic, "", path, hd.Secp256k1)
require.NoError(t, err)

t.Cleanup(func() {
Expand Down
3 changes: 2 additions & 1 deletion client/keys/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand All @@ -37,7 +38,7 @@ func Test_runDeleteCmd(t *testing.T) {
kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn)
require.NoError(t, err)

_, err = kb.NewAccount(fakeKeyName1, testutil.TestMnemonic, "", path, hd.Secp256k1)
_, err = kb.NewAccount(fakeKeyName1, testdata.TestMnemonic, "", path, hd.Secp256k1)
require.NoError(t, err)

_, _, err = kb.NewMnemonic(fakeKeyName2, keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1)
Expand Down
3 changes: 2 additions & 1 deletion client/keys/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"

"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
Expand Down Expand Up @@ -91,7 +92,7 @@ func Test_runExportCmd(t *testing.T) {
})

path := sdk.GetConfig().GetFullBIP44Path()
_, err = kb.NewAccount("keyname1", testutil.TestMnemonic, "", path, hd.Secp256k1)
_, err = kb.NewAccount("keyname1", testdata.TestMnemonic, "", path, hd.Secp256k1)
require.NoError(t, err)

clientCtx := client.Context{}.
Expand Down
3 changes: 2 additions & 1 deletion client/keys/list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand All @@ -31,7 +32,7 @@ func Test_runListCmd(t *testing.T) {
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)

path := "" //sdk.GetConfig().GetFullBIP44Path()
_, err = kb.NewAccount("something", testutil.TestMnemonic, "", path, hd.Secp256k1)
_, err = kb.NewAccount("something", testdata.TestMnemonic, "", path, hd.Secp256k1)
require.NoError(t, err)

t.Cleanup(func() {
Expand Down
5 changes: 3 additions & 2 deletions client/keys/show_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand Down Expand Up @@ -68,11 +69,11 @@ func Test_runShowCmd(t *testing.T) {
})

path := hd.NewFundraiserParams(1, sdk.CoinType, 0).String()
_, err = kb.NewAccount(fakeKeyName1, testutil.TestMnemonic, "", path, hd.Secp256k1)
_, err = kb.NewAccount(fakeKeyName1, testdata.TestMnemonic, "", path, hd.Secp256k1)
require.NoError(t, err)

path2 := hd.NewFundraiserParams(1, sdk.CoinType, 1).String()
_, err = kb.NewAccount(fakeKeyName2, testutil.TestMnemonic, "", path2, hd.Secp256k1)
_, err = kb.NewAccount(fakeKeyName2, testdata.TestMnemonic, "", path2, hd.Secp256k1)
require.NoError(t, err)

// Now try single key
Expand Down
7 changes: 4 additions & 3 deletions crypto/ledger/ledger_mock.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//go:build ledger && test_ledger_mock
// +build ledger,test_ledger_mock

package ledger
Expand All @@ -15,7 +16,7 @@ import (

"github.com/cosmos/cosmos-sdk/crypto/hd"
csecp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand Down Expand Up @@ -46,7 +47,7 @@ func (mock LedgerSECP256K1Mock) GetPublicKeySECP256K1(derivationPath []uint32) (
return nil, errors.New("Invalid derivation path")
}

seed, err := bip39.NewSeedWithErrorChecking(testutil.TestMnemonic, "")
seed, err := bip39.NewSeedWithErrorChecking(testdata.TestMnemonic, "")
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -88,7 +89,7 @@ func (mock LedgerSECP256K1Mock) GetAddressPubKeySECP256K1(derivationPath []uint3

func (mock LedgerSECP256K1Mock) SignSECP256K1(derivationPath []uint32, message []byte) ([]byte, error) {
path := hd.NewParams(derivationPath[0], derivationPath[1], derivationPath[2], derivationPath[3] != 0, derivationPath[4])
seed, err := bip39.NewSeedWithErrorChecking(testutil.TestMnemonic, "")
seed, err := bip39.NewSeedWithErrorChecking(testdata.TestMnemonic, "")
if err != nil {
return nil, err
}
Expand Down
14 changes: 7 additions & 7 deletions crypto/ledger/ledger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/cosmos/cosmos-sdk/codec/legacy"
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/crypto/types"
"github.com/cosmos/cosmos-sdk/testutil"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand All @@ -33,11 +33,11 @@ func checkDefaultPubKey(t *testing.T, priv types.LedgerPrivKey) {
expectedPkStr := "PubKeySecp256k1{034FEF9CD7C4C63588D3B03FEB5281B9D232CBA34D6F3D71AEE59211FFBFE1FE87}"
require.Equal(t, "eb5ae98721034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87",
fmt.Sprintf("%x", cdc.Amino.MustMarshalBinaryBare(priv.PubKey())),
"Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
"Is your device using test mnemonic: %s ?", testdata.TestMnemonic)
require.Equal(t, expectedPkStr, priv.PubKey().String())
addr := sdk.AccAddress(priv.PubKey().Address()).String()
require.Equal(t, "cosmos1w34k53py5v5xyluazqpq65agyajavep2rflq6h",
addr, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
addr, "Is your device using test mnemonic: %s ?", testdata.TestMnemonic)
}

func TestPublicKeyUnsafeHDPath(t *testing.T) {
Expand Down Expand Up @@ -74,7 +74,7 @@ func TestPublicKeyUnsafeHDPath(t *testing.T) {

// in this test we are chekcking if the generated keys are correct.
require.Equal(t, expectedAnswers[i], priv.PubKey().String(),
"Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
"Is your device using test mnemonic: %s ?", testdata.TestMnemonic)

// Store and restore
serializedPk := priv.Bytes()
Expand Down Expand Up @@ -151,7 +151,7 @@ func TestPublicKeyHDPath(t *testing.T) {
require.Equal(t, addr2, addr)
require.Equal(t,
expectedAddrs[i], addr,
"Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
"Is your device using test mnemonic: %s ?", testdata.TestMnemonic)

// Check other methods
tmp := priv.(PrivKeyLedgerSecp256k1)
Expand All @@ -161,7 +161,7 @@ func TestPublicKeyHDPath(t *testing.T) {
// in this test we are chekcking if the generated keys are correct and stored in a right path.
require.Equal(t,
expectedPubKeys[i], priv.PubKey().String(),
"Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
"Is your device using test mnemonic: %s ?", testdata.TestMnemonic)

// Store and restore
serializedPk := priv.Bytes()
Expand Down Expand Up @@ -203,7 +203,7 @@ func TestSignaturesHD(t *testing.T) {
require.NoError(t, err)

valid := pub.VerifySignature(msg, sig)
require.True(t, valid, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
require.True(t, valid, "Is your device using test mnemonic: %s ?", testdata.TestMnemonic)
}
}

Expand Down
42 changes: 11 additions & 31 deletions server/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@ import (
"fmt"

"github.com/cosmos/cosmos-sdk/crypto/keyring"

sdk "github.com/cosmos/cosmos-sdk/types"
)

// GenerateCoinKey returns the address of a public key, along with the secret
// phrase to recover the private key.
// Deprecated: GenerateCoinKey generates a new key mnemonic along with its addrress.
// Please use testutils.GenerateCoinKey instead.
func GenerateCoinKey(algo keyring.SignatureAlgo) (sdk.AccAddress, string, error) {
// generate a private key, with recovery phrase
// generate a private key, with mnemonic
info, secret, err := keyring.NewInMemory().NewMnemonic(
"name",
keyring.English,
Expand All @@ -26,11 +25,14 @@ func GenerateCoinKey(algo keyring.SignatureAlgo) (sdk.AccAddress, string, error)
return sdk.AccAddress(info.GetPubKey().Address()), secret, nil
}

// GenerateSaveCoinKey returns the address of a public key, along with the secret
// phrase to recover the private key.
// Deprecated: GenerateSaveCoinKey generates a new key mnemonic with its addrress.
// If mnemonic is provided then it's used for key generation.
// The key is saved in the keyring. The function returns error if overwrite=true and the key
// already exists.
// Please use testutils.GenerateSaveCoinKey instead.
func GenerateSaveCoinKey(
keybase keyring.Keyring,
keyName, mnemonic string,
keyName string,
overwrite bool,
algo keyring.SignatureAlgo,
) (sdk.AccAddress, string, error) {
Expand All @@ -52,32 +54,10 @@ func GenerateSaveCoinKey(
}
}

var (
info keyring.Info
secret string
)

if mnemonic != "" {
secret = mnemonic
info, err = keybase.NewAccount(
keyName,
mnemonic,
keyring.DefaultBIP39Passphrase,
sdk.GetConfig().GetFullBIP44Path(),
algo,
)
} else {
info, secret, err = keybase.NewMnemonic(
keyName,
keyring.English,
sdk.GetConfig().GetFullBIP44Path(),
keyring.DefaultBIP39Passphrase,
algo,
)
}
k, mnemonic, err := keybase.NewMnemonic(keyName, keyring.English, sdk.GetConfig().GetFullBIP44Path(), keyring.DefaultBIP39Passphrase, algo)
if err != nil {
return sdk.AccAddress{}, "", err
}

return sdk.AccAddress(info.GetPubKey().Address()), secret, nil
return sdk.AccAddress(k.GetAddress()), mnemonic, nil
}
3 changes: 2 additions & 1 deletion simapp/simd/cmd/testnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
"github.com/cosmos/cosmos-sdk/server"
srvconfig "github.com/cosmos/cosmos-sdk/server/config"
"github.com/cosmos/cosmos-sdk/testutil"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
Expand Down Expand Up @@ -178,7 +179,7 @@ func InitTestnet(
return err
}

addr, secret, err := server.GenerateSaveCoinKey(kb, nodeDirName, "", true, algo)
addr, secret, err := testutil.GenerateSaveCoinKey(kb, nodeDirName, "", true, algo)
if err != nil {
_ = os.RemoveAll(outputDir)
return err
Expand Down
82 changes: 82 additions & 0 deletions testutil/key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package testutil

import (
"fmt"

"github.com/cosmos/cosmos-sdk/crypto/keyring"
sdk "github.com/cosmos/cosmos-sdk/types"
)

// GenerateCoinKey generates a new key mnemonic along with its addrress.
func GenerateCoinKey(algo keyring.SignatureAlgo) (sdk.AccAddress, string, error) {
// generate a private key, with mnemonic
info, secret, err := keyring.NewInMemory().NewMnemonic(
"name",
keyring.English,
sdk.GetConfig().GetFullBIP44Path(),
keyring.DefaultBIP39Passphrase,
algo,
)
if err != nil {
return sdk.AccAddress{}, "", err
}

return sdk.AccAddress(info.GetPubKey().Address()), secret, nil
}

// GenerateSaveCoinKey generates a new key mnemonic with its addrress.
// If mnemonic is provided then it's used for key generation.
// The key is saved in the keyring. The function returns error if overwrite=true and the key
// already exists.
func GenerateSaveCoinKey(
keybase keyring.Keyring,
keyName, mnemonic string,
overwrite bool,
algo keyring.SignatureAlgo,
) (sdk.AccAddress, string, error) {
exists := false
_, err := keybase.Key(keyName)
if err == nil {
exists = true
}

// ensure no overwrite
if !overwrite && exists {
return sdk.AccAddress{}, "", fmt.Errorf("key already exists, overwrite is disabled")
}

if exists {
if err := keybase.Delete(keyName); err != nil {
return sdk.AccAddress{}, "", fmt.Errorf("failed to overwrite key")
}
}

var (
info keyring.Info
secret string
)

if mnemonic != "" {
secret = mnemonic
info, err = keybase.NewAccount(
keyName,
mnemonic,
keyring.DefaultBIP39Passphrase,
sdk.GetConfig().GetFullBIP44Path(),
algo,
)
} else {
info, secret, err = keybase.NewMnemonic(
keyName,
keyring.English,
sdk.GetConfig().GetFullBIP44Path(),
keyring.DefaultBIP39Passphrase,
algo,
)
}
if err != nil {
return sdk.AccAddress{}, "", err
}

return sdk.AccAddress(info.GetAddress()), secret, nil
}
Loading

0 comments on commit 2627b59

Please sign in to comment.