diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d22b8ab5..b53e90a54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/client/keys/add_test.go b/client/keys/add_test.go index 2ac32d36e..f59848a8d 100644 --- a/client/keys/add_test.go +++ b/client/keys/add_test.go @@ -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" ) @@ -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() { diff --git a/client/keys/delete_test.go b/client/keys/delete_test.go index e1687fc8d..77686b910 100644 --- a/client/keys/delete_test.go +++ b/client/keys/delete_test.go @@ -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" ) @@ -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) diff --git a/client/keys/export_test.go b/client/keys/export_test.go index a63cf7f9b..85a0fcaf5 100644 --- a/client/keys/export_test.go +++ b/client/keys/export_test.go @@ -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" @@ -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{}. diff --git a/client/keys/list_test.go b/client/keys/list_test.go index a9d5462cc..d7ccfb2e9 100644 --- a/client/keys/list_test.go +++ b/client/keys/list_test.go @@ -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" ) @@ -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() { diff --git a/client/keys/show_test.go b/client/keys/show_test.go index f7642a773..f05c1878d 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -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" ) @@ -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 diff --git a/crypto/ledger/ledger_mock.go b/crypto/ledger/ledger_mock.go index 4f7feb2c5..2a05c7f2b 100644 --- a/crypto/ledger/ledger_mock.go +++ b/crypto/ledger/ledger_mock.go @@ -1,3 +1,4 @@ +//go:build ledger && test_ledger_mock // +build ledger,test_ledger_mock package ledger @@ -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" ) @@ -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 } @@ -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 } diff --git a/crypto/ledger/ledger_test.go b/crypto/ledger/ledger_test.go index 61d50c7de..9f4bf9427 100644 --- a/crypto/ledger/ledger_test.go +++ b/crypto/ledger/ledger_test.go @@ -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" ) @@ -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) { @@ -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() @@ -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) @@ -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() @@ -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) } } diff --git a/server/init.go b/server/init.go index a956046ce..00b7b26af 100644 --- a/server/init.go +++ b/server/init.go @@ -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, @@ -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) { @@ -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 } diff --git a/simapp/simd/cmd/testnet.go b/simapp/simd/cmd/testnet.go index 975f03af9..443f7899f 100644 --- a/simapp/simd/cmd/testnet.go +++ b/simapp/simd/cmd/testnet.go @@ -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" @@ -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 diff --git a/testutil/key.go b/testutil/key.go new file mode 100644 index 000000000..142f53c24 --- /dev/null +++ b/testutil/key.go @@ -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 +} diff --git a/server/init_test.go b/testutil/key_test.go similarity index 76% rename from server/init_test.go rename to testutil/key_test.go index 0b9aac658..d3fec6ef5 100644 --- a/server/init_test.go +++ b/testutil/key_test.go @@ -1,4 +1,4 @@ -package server_test +package testutil import ( "testing" @@ -7,13 +7,12 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/types" ) func TestGenerateCoinKey(t *testing.T) { t.Parallel() - addr, mnemonic, err := server.GenerateCoinKey(hd.Secp256k1) + addr, mnemonic, err := GenerateCoinKey(hd.Secp256k1) require.NoError(t, err) // Test creation @@ -28,7 +27,7 @@ func TestGenerateSaveCoinKey(t *testing.T) { kb, err := keyring.New(t.Name(), "test", t.TempDir(), nil) require.NoError(t, err) - addr, mnemonic, err := server.GenerateSaveCoinKey(kb, "keyname", "", false, hd.Secp256k1) + addr, mnemonic, err := GenerateSaveCoinKey(kb, "keyname", "", false, hd.Secp256k1) require.NoError(t, err) // Test key was actually saved @@ -49,15 +48,15 @@ func TestGenerateSaveCoinKeyOverwriteFlag(t *testing.T) { require.NoError(t, err) keyname := "justakey" - addr1, _, err := server.GenerateSaveCoinKey(kb, keyname, "", false, hd.Secp256k1) + addr1, _, err := GenerateSaveCoinKey(kb, keyname, "", false, hd.Secp256k1) require.NoError(t, err) // Test overwrite with overwrite=false - _, _, err = server.GenerateSaveCoinKey(kb, keyname, "", false, hd.Secp256k1) + _, _, err = GenerateSaveCoinKey(kb, keyname, "", false, hd.Secp256k1) require.Error(t, err) // Test overwrite with overwrite=true - addr2, _, err := server.GenerateSaveCoinKey(kb, keyname, "", true, hd.Secp256k1) + addr2, _, err := GenerateSaveCoinKey(kb, keyname, "", true, hd.Secp256k1) require.NoError(t, err) require.NotEqual(t, addr1, addr2) diff --git a/testutil/network/network.go b/testutil/network/network.go index 9642841b9..9c5bf6f3b 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -40,6 +40,7 @@ import ( "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/simapp/params" storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -288,7 +289,7 @@ func New(t *testing.T, cfg Config) *Network { mnemonic = cfg.Mnemonics[i] } - addr, secret, err := server.GenerateSaveCoinKey(kb, nodeDirName, mnemonic, true, algo) + addr, secret, err := testutil.GenerateSaveCoinKey(kb, nodeDirName, mnemonic, true, algo) require.NoError(t, err) info := map[string]string{"secret": secret} diff --git a/testutil/known_values.go b/testutil/testdata/known_values.go similarity index 90% rename from testutil/known_values.go rename to testutil/testdata/known_values.go index a87ccd2af..616a07e66 100644 --- a/testutil/known_values.go +++ b/testutil/testdata/known_values.go @@ -1,4 +1,4 @@ -package testutil +package testdata const ( // Tests expect a ledger device initialized to the following mnemonic diff --git a/types/bech32/legacybech32/pk_test.go b/types/bech32/legacybech32/pk_test.go index 262784c04..26183475b 100644 --- a/types/bech32/legacybech32/pk_test.go +++ b/types/bech32/legacybech32/pk_test.go @@ -7,7 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/ledger" - "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -21,6 +21,5 @@ func TestBeach32ifPbKey(t *testing.T) { pubKeyAddr, err := MarshalPubKey(AccPK, priv.PubKey()) require.NoError(err) require.Equal("cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", - pubKeyAddr, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) - + pubKeyAddr, "Is your device using test mnemonic: %s ?", testdata.TestMnemonic) }