From d11aca78396890a794f72d012a77fb8a8cf81a99 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 7 Jun 2019 10:29:12 +0100 Subject: [PATCH 1/3] Generalize auth/types.StdSignature into an SDK type New Signature interface available in the top level types package. auth.StdSignature implements such interface. User defined auth module can now define their own custom signature types. Work carried out in the context of the following issues: - #4488 - #4487 --- .../improvements/sdk/4507-New-Signature-g | 3 +++ client/keys/import.go | 3 ++- client/keys/list.go | 3 ++- client/keys/mnemonic_test.go | 3 ++- client/keys/update.go | 3 ++- client/utils/utils_test.go | 8 +++--- contrib/runsim/main.go | 2 +- docs/spec/auth/03_types.md | 6 ++--- simapp/test_util.go | 3 ++- types/codec.go | 1 + types/coin_test.go | 3 ++- types/tx_msg.go | 8 ++++++ x/auth/alias.go | 1 + x/auth/ante.go | 21 ++++++++------- x/auth/ante_test.go | 13 ++++----- x/auth/client/cli/tx_multisign.go | 4 ++- x/auth/client/cli/tx_sign.go | 8 +++--- x/auth/genaccounts/genesis_state_test.go | 5 ++-- x/auth/types/codec.go | 1 + x/auth/types/stdtx.go | 27 ++++++++++++++----- x/auth/types/stdtx_test.go | 14 ++++++++-- x/auth/types/test_common.go | 12 ++++----- x/auth/types/txbuilder.go | 16 +++++------ x/distribution/proposal_handler_test.go | 3 ++- x/genutil/genesis_state_test.go | 5 ++-- x/gov/types/keys_test.go | 3 ++- x/mock/app.go | 7 ++--- x/mock/app_test.go | 14 +++++----- x/staking/exported/exported.go | 3 ++- 29 files changed, 125 insertions(+), 78 deletions(-) create mode 100644 .pending/improvements/sdk/4507-New-Signature-g diff --git a/.pending/improvements/sdk/4507-New-Signature-g b/.pending/improvements/sdk/4507-New-Signature-g new file mode 100644 index 000000000000..80e1b83d12ad --- /dev/null +++ b/.pending/improvements/sdk/4507-New-Signature-g @@ -0,0 +1,3 @@ +#4507 New `Signature` generic interface available in the top level types package. +`auth.StdSignature` implements such interface. User defined auth module can now +define their own custom signature types. diff --git a/client/keys/import.go b/client/keys/import.go index 433c703a60f9..944267fdcf80 100644 --- a/client/keys/import.go +++ b/client/keys/import.go @@ -3,8 +3,9 @@ package keys import ( "io/ioutil" - "github.com/cosmos/cosmos-sdk/client/input" "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client/input" ) func importKeyCommand() *cobra.Command { diff --git a/client/keys/list.go b/client/keys/list.go index 1600d345b05b..7edec854152e 100644 --- a/client/keys/list.go +++ b/client/keys/list.go @@ -1,8 +1,9 @@ package keys import ( - "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client/flags" ) func listKeysCmd() *cobra.Command { diff --git a/client/keys/mnemonic_test.go b/client/keys/mnemonic_test.go index 617a2ecc7574..62abef02cfe2 100644 --- a/client/keys/mnemonic_test.go +++ b/client/keys/mnemonic_test.go @@ -5,9 +5,10 @@ import ( "strings" "testing" - "github.com/cosmos/cosmos-sdk/client/input" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client/input" ) func Test_RunMnemonicCmdNormal(t *testing.T) { diff --git a/client/keys/update.go b/client/keys/update.go index 3e1160fe8ebe..39131a3b4980 100644 --- a/client/keys/update.go +++ b/client/keys/update.go @@ -3,8 +3,9 @@ package keys import ( "fmt" - "github.com/cosmos/cosmos-sdk/client/input" "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client/input" ) func updateKeyCommand() *cobra.Command { diff --git a/client/utils/utils_test.go b/client/utils/utils_test.go index 94df3e797d0d..dd023510da96 100644 --- a/client/utils/utils_test.go +++ b/client/utils/utils_test.go @@ -100,7 +100,7 @@ func TestReadStdTxFromFile(t *testing.T) { // Build a test transaction fee := authtypes.NewStdFee(50000, sdk.Coins{sdk.NewInt64Coin("atom", 150)}) - stdTx := authtypes.NewStdTx([]sdk.Msg{}, fee, []authtypes.StdSignature{}, "foomemo") + stdTx := authtypes.NewStdTx([]sdk.Msg{}, fee, nil, "foomemo") // Write it to the file encodedTx, _ := cdc.MarshalJSON(stdTx) @@ -143,8 +143,8 @@ func TestValidateCmd(t *testing.T) { }{ {"misspelled command", []string{"comission"}, true}, {"no command provided", []string{}, false}, - {"help flag", []string{"comission", "--help"}, false}, - {"shorthand help flag", []string{"comission", "-h"}, false}, + {"help flag", []string{"commission", "--help"}, false}, + {"shorthand help flag", []string{"commission", "-h"}, false}, } for _, tt := range tests { @@ -158,7 +158,7 @@ func TestValidateCmd(t *testing.T) { func compareEncoders(t *testing.T, expected sdk.TxEncoder, actual sdk.TxEncoder) { msgs := []sdk.Msg{sdk.NewTestMsg(addr)} - tx := authtypes.NewStdTx(msgs, authtypes.StdFee{}, []authtypes.StdSignature{}, "") + tx := authtypes.NewStdTx(msgs, authtypes.StdFee{}, []sdk.Signature{}, "") defaultEncoderBytes, err := expected(tx) require.NoError(t, err) diff --git a/contrib/runsim/main.go b/contrib/runsim/main.go index ba96c5cae006..b54be8ba75a6 100644 --- a/contrib/runsim/main.go +++ b/contrib/runsim/main.go @@ -26,7 +26,7 @@ var ( 989182, 89182391, 11, 22, 44, 77, 99, 2020, 3232, 123123, 124124, 582582, 18931893, 29892989, 30123012, 47284728, 7601778, 8090485, - 977367484, 491163361, 424254581, 673398983, + 977367484, 491163361, 424254581, 673398983, } // goroutine-safe process map diff --git a/docs/spec/auth/03_types.md b/docs/spec/auth/03_types.md index 4d37c55c8e61..41ade660cac2 100644 --- a/docs/spec/auth/03_types.md +++ b/docs/spec/auth/03_types.md @@ -20,9 +20,9 @@ type StdFee struct { ## StdSignature -A `StdSignature` is the combination of an optional public key and a cryptographic signature -as a byte array. The SDK is agnostic to particular key or signature formats and supports any -supported by the `PubKey` interface. +`StdSignature` implements the `sdk.Signature` interface and consists of a combination of an +optional public key and a cryptographic signature as a byte slice. The SDK is agnostic to +particular key or signature formats and supports any supported by the `PubKey` interface. ```golang type StdSignature struct { diff --git a/simapp/test_util.go b/simapp/test_util.go index 8b79e757a9b5..8337a1cc4c55 100644 --- a/simapp/test_util.go +++ b/simapp/test_util.go @@ -5,10 +5,11 @@ import ( "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tendermint/libs/db" + bam "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking" - dbm "github.com/tendermint/tendermint/libs/db" ) // NewSimAppUNSAFE is used for debugging purposes only. diff --git a/types/codec.go b/types/codec.go index 3d789afe9f0a..8606ef0ad3f5 100644 --- a/types/codec.go +++ b/types/codec.go @@ -6,4 +6,5 @@ import "github.com/cosmos/cosmos-sdk/codec" func RegisterCodec(cdc *codec.Codec) { cdc.RegisterInterface((*Msg)(nil), nil) cdc.RegisterInterface((*Tx)(nil), nil) + cdc.RegisterInterface((*Signature)(nil), nil) } diff --git a/types/coin_test.go b/types/coin_test.go index 9d6177afeb78..7643b221c42b 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -4,9 +4,10 @@ import ( "strings" "testing" - "github.com/cosmos/cosmos-sdk/codec" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/codec" ) var ( diff --git a/types/tx_msg.go b/types/tx_msg.go index bc4c2540d911..15a9ea587e35 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -2,6 +2,8 @@ package types import ( "encoding/json" + + "github.com/tendermint/tendermint/crypto" ) // Transactions messages must fulfill the Msg @@ -42,6 +44,12 @@ type Tx interface { //__________________________________________________________ +// Signature defines the properties of the signature payload. +type Signature interface { + GetPubKey() crypto.PubKey + GetSignature() []byte +} + // TxDecoder unmarshals transaction bytes type TxDecoder func(txBytes []byte) (Tx, Error) diff --git a/x/auth/alias.go b/x/auth/alias.go index 3c1fe15fde10..5b0308752c58 100644 --- a/x/auth/alias.go +++ b/x/auth/alias.go @@ -46,6 +46,7 @@ var ( NewStdTx = types.NewStdTx CountSubKeys = types.CountSubKeys NewStdFee = types.NewStdFee + NewStdSignature = types.NewStdSignature StdSignBytes = types.StdSignBytes DefaultTxDecoder = types.DefaultTxDecoder DefaultTxEncoder = types.DefaultTxEncoder diff --git a/x/auth/ante.go b/x/auth/ante.go index 28a16821e9ac..04a9f0b994a8 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -136,7 +136,8 @@ func NewAnteHandler(ak AccountKeeper, fck FeeCollectionKeeper, sigGasConsumer Si // check signature, return account with incremented nonce signBytes := GetSignBytes(newCtx.ChainID(), stdTx, signerAccs[i], isGenesis) - signerAccs[i], res = processSig(newCtx, signerAccs[i], stdSigs[i], signBytes, simulate, params, sigGasConsumer) + signerAccs[i], res = processSig(newCtx, signerAccs[i], stdSigs[i], signBytes, + simulate, params, sigGasConsumer) if !res.IsOK() { return newCtx, res, true } @@ -165,7 +166,7 @@ func ValidateSigCount(stdTx StdTx, params Params) sdk.Result { sigCount := 0 for i := 0; i < len(stdSigs); i++ { - sigCount += CountSubKeys(stdSigs[i].PubKey) + sigCount += CountSubKeys(stdSigs[i].GetPubKey()) if uint64(sigCount) > params.TxSigLimit { return sdk.ErrTooManySignatures( fmt.Sprintf("signatures: %d, limit: %d", sigCount, params.TxSigLimit), @@ -194,7 +195,7 @@ func ValidateMemo(stdTx StdTx, params Params) sdk.Result { // verify the signature and increment the sequence. If the account doesn't have // a pubkey, set it. func processSig( - ctx sdk.Context, acc Account, sig StdSignature, signBytes []byte, simulate bool, params Params, + ctx sdk.Context, acc Account, sig sdk.Signature, signBytes []byte, simulate bool, params Params, sigGasConsumer SignatureVerificationGasConsumer, ) (updatedAcc Account, res sdk.Result) { @@ -216,11 +217,11 @@ func processSig( consumeSimSigGas(ctx.GasMeter(), pubKey, sig, params) } - if res := sigGasConsumer(ctx.GasMeter(), sig.Signature, pubKey, params); !res.IsOK() { + if res := sigGasConsumer(ctx.GasMeter(), sig.GetSignature(), pubKey, params); !res.IsOK() { return nil, res } - if !simulate && !pubKey.VerifyBytes(signBytes, sig.Signature) { + if !simulate && !pubKey.VerifyBytes(signBytes, sig.GetSignature()) { return nil, sdk.ErrUnauthorized("signature verification failed; verify correct account sequence and chain-id").Result() } @@ -231,9 +232,9 @@ func processSig( return acc, res } -func consumeSimSigGas(gasmeter sdk.GasMeter, pubkey crypto.PubKey, sig StdSignature, params Params) { - simSig := StdSignature{PubKey: pubkey} - if len(sig.Signature) == 0 { +func consumeSimSigGas(gasmeter sdk.GasMeter, pubkey crypto.PubKey, sig sdk.Signature, params Params) { + simSig := NewStdSignature(pubkey, nil) + if len(sig.GetSignature()) == 0 { simSig.Signature = simSecp256k1Sig[:] } @@ -252,7 +253,7 @@ func consumeSimSigGas(gasmeter sdk.GasMeter, pubkey crypto.PubKey, sig StdSignat // ProcessPubKey verifies that the given account address matches that of the // StdSignature. In addition, it will set the public key of the account if it // has not been set. -func ProcessPubKey(acc Account, sig StdSignature, simulate bool) (crypto.PubKey, sdk.Result) { +func ProcessPubKey(acc Account, sig sdk.Signature, simulate bool) (crypto.PubKey, sdk.Result) { // If pubkey is not known for account, set it from the StdSignature. pubKey := acc.GetPubKey() if simulate { @@ -268,7 +269,7 @@ func ProcessPubKey(acc Account, sig StdSignature, simulate bool) (crypto.PubKey, } if pubKey == nil { - pubKey = sig.PubKey + pubKey = sig.GetPubKey() if pubKey == nil { return nil, sdk.ErrInvalidPubKey("PubKey not found").Result() } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index f0c3125144ff..3fe0d4f06cb5 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -515,7 +515,8 @@ func TestAnteHandlerSetPubKey(t *testing.T) { msgs = []sdk.Msg{msg} tx = NewTestTx(ctx, msgs, privs, []uint64{1}, seqs, fee) sigs := tx.(types.StdTx).GetSignatures() - sigs[0].PubKey = nil + sig := sigs[0].(StdSignature) + sig.PubKey = nil checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeInvalidPubKey) acc2 = input.ak.GetAccount(ctx, addr2) @@ -551,11 +552,11 @@ func TestProcessPubKey(t *testing.T) { args args wantErr bool }{ - {"no sigs, simulate off", args{acc1, StdSignature{}, false}, true}, - {"no sigs, simulate on", args{acc1, StdSignature{}, true}, false}, - {"no sigs, account with pub, simulate on", args{acc2, StdSignature{}, true}, false}, - {"pubkey doesn't match addr, simulate off", args{acc1, StdSignature{PubKey: priv2.PubKey()}, false}, true}, - {"pubkey doesn't match addr, simulate on", args{acc1, StdSignature{PubKey: priv2.PubKey()}, true}, false}, + {"no sigs, simulate off", args{acc1, NewStdSignature(nil, nil), false}, true}, + {"no sigs, simulate on", args{acc1, NewStdSignature(nil, nil), true}, false}, + {"no sigs, account with pub, simulate on", args{acc2, NewStdSignature(nil, nil), true}, false}, + {"pubkey doesn't match addr, simulate off", args{acc1, NewStdSignature(priv2.PubKey(), nil), false}, true}, + {"pubkey doesn't match addr, simulate on", args{acc1, NewStdSignature(priv2.PubKey(), nil), true}, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index c1a88a6a0b03..6505811d5278 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -18,6 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/utils" "github.com/cosmos/cosmos-sdk/codec" crkeys "github.com/cosmos/cosmos-sdk/crypto/keys" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -119,7 +120,8 @@ func makeMultiSignCmd(cdc *codec.Codec) func(cmd *cobra.Command, args []string) } newStdSig := types.StdSignature{Signature: cdc.MustMarshalBinaryBare(multisigSig), PubKey: multisigPub} - newTx := types.NewStdTx(stdTx.GetMsgs(), stdTx.Fee, []types.StdSignature{newStdSig}, stdTx.GetMemo()) + newTx := types.NewStdTx(stdTx.GetMsgs(), stdTx.Fee, []sdk.Signature{newStdSig}, + stdTx.GetMemo()) sigOnly := viper.GetBool(flagSigOnly) var json []byte diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index f7be335010e4..f3c701e49600 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -206,7 +206,7 @@ func printAndValidateSigs( } for i, sig := range sigs { - sigAddr := sdk.AccAddress(sig.Address()) + sigAddr := sdk.AccAddress(sig.GetPubKey().Address()) sigSanity := "OK" var ( @@ -233,16 +233,16 @@ func printAndValidateSigs( stdTx.Fee, stdTx.GetMsgs(), stdTx.GetMemo(), ) - if ok := sig.VerifyBytes(sigBytes, sig.Signature); !ok { + if ok := sig.GetPubKey().VerifyBytes(sigBytes, sig.GetSignature()); !ok { sigSanity = "ERROR: signature invalid" success = false } } - multiPK, ok := sig.PubKey.(multisig.PubKeyMultisigThreshold) + multiPK, ok := sig.GetPubKey().(multisig.PubKeyMultisigThreshold) if ok { var multiSig multisig.Multisignature - cliCtx.Codec.MustUnmarshalBinaryBare(sig.Signature, &multiSig) + cliCtx.Codec.MustUnmarshalBinaryBare(sig.GetSignature(), &multiSig) var b strings.Builder b.WriteString("\n MultiSig Signatures:\n") diff --git a/x/auth/genaccounts/genesis_state_test.go b/x/auth/genaccounts/genesis_state_test.go index 4977fab37cfe..bca4fbcc3800 100644 --- a/x/auth/genaccounts/genesis_state_test.go +++ b/x/auth/genaccounts/genesis_state_test.go @@ -3,10 +3,11 @@ package genaccounts import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/ed25519" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) func TestSanitize(t *testing.T) { diff --git a/x/auth/types/codec.go b/x/auth/types/codec.go index 296c2b148356..de917de6e99b 100644 --- a/x/auth/types/codec.go +++ b/x/auth/types/codec.go @@ -13,6 +13,7 @@ func RegisterCodec(cdc *codec.Codec) { cdc.RegisterConcrete(&ContinuousVestingAccount{}, "auth/ContinuousVestingAccount", nil) cdc.RegisterConcrete(&DelayedVestingAccount{}, "auth/DelayedVestingAccount", nil) cdc.RegisterConcrete(StdTx{}, "auth/StdTx", nil) + cdc.RegisterConcrete(StdSignature{}, "auth/StdSignature", nil) } // RegisterBaseAccount most users shouldn't use this, but this comes in handy for tests. diff --git a/x/auth/types/stdtx.go b/x/auth/types/stdtx.go index 18cdfaf0a0f2..b885d1796624 100644 --- a/x/auth/types/stdtx.go +++ b/x/auth/types/stdtx.go @@ -12,7 +12,9 @@ import ( ) var ( - _ sdk.Tx = (*StdTx)(nil) + _ sdk.Tx = (*StdTx)(nil) + _ sdk.Signature = (*StdSignature)(nil) + _ sdk.Signature = StdSignature{} maxGasWanted = uint64((1 << 63) - 1) ) @@ -20,13 +22,13 @@ var ( // StdTx is a standard way to wrap a Msg with Fee and Signatures. // NOTE: the first signature is the fee payer (Signatures must not be nil). type StdTx struct { - Msgs []sdk.Msg `json:"msg"` - Fee StdFee `json:"fee"` - Signatures []StdSignature `json:"signatures"` - Memo string `json:"memo"` + Msgs []sdk.Msg `json:"msg"` + Fee StdFee `json:"fee"` + Signatures []sdk.Signature `json:"signatures"` + Memo string `json:"memo"` } -func NewStdTx(msgs []sdk.Msg, fee StdFee, sigs []StdSignature, memo string) StdTx { +func NewStdTx(msgs []sdk.Msg, fee StdFee, sigs []sdk.Signature, memo string) StdTx { return StdTx{ Msgs: msgs, Fee: fee, @@ -104,7 +106,7 @@ func (tx StdTx) GetMemo() string { return tx.Memo } // CONTRACT: If the signature is missing (ie the Msg is // invalid), then the corresponding signature is // .Empty(). -func (tx StdTx) GetSignatures() []StdSignature { return tx.Signatures } +func (tx StdTx) GetSignatures() []sdk.Signature { return tx.Signatures } //__________________________________________________________ @@ -191,6 +193,17 @@ type StdSignature struct { Signature []byte `json:"signature"` } +// NewStdSignature constructs a new StdSignature instance. +func NewStdSignature(pubKey crypto.PubKey, signature []byte) StdSignature { + return StdSignature{PubKey: pubKey, Signature: signature} +} + +// GetPubKey returns the embedded crypto.PubKey type. +func (sig StdSignature) GetPubKey() crypto.PubKey { return sig.PubKey } + +// GetSignature returns the embedded byte signature. +func (sig StdSignature) GetSignature() []byte { return sig.Signature } + // DefaultTxDecoder logic for standard transaction decoding func DefaultTxDecoder(cdc *codec.Codec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, sdk.Error) { diff --git a/x/auth/types/stdtx_test.go b/x/auth/types/stdtx_test.go index d6315d5fb9f7..270788215995 100644 --- a/x/auth/types/stdtx_test.go +++ b/x/auth/types/stdtx_test.go @@ -1,10 +1,12 @@ package types import ( + "bytes" "fmt" "testing" "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" @@ -22,7 +24,7 @@ var ( func TestStdTx(t *testing.T) { msgs := []sdk.Msg{sdk.NewTestMsg(addr)} fee := NewTestStdFee() - sigs := []StdSignature{} + sigs := []sdk.Signature{} tx := NewStdTx(msgs, fee, sigs, "") require.Equal(t, msgs, tx.GetMsgs()) @@ -121,7 +123,7 @@ func TestDefaultTxEncoder(t *testing.T) { msgs := []sdk.Msg{sdk.NewTestMsg(addr)} fee := NewTestStdFee() - sigs := []StdSignature{} + sigs := []sdk.Signature{} tx := NewStdTx(msgs, fee, sigs, "") @@ -133,3 +135,11 @@ func TestDefaultTxEncoder(t *testing.T) { require.NoError(t, err) require.Equal(t, cdcBytes, encoderBytes) } + +func TestNewStdSignature(t *testing.T) { + pub := ed25519.GenPrivKey().PubKey() + sigBytes := []byte("data") + got := NewStdSignature(pub, sigBytes) + require.True(t, bytes.Equal(got.GetSignature(), sigBytes)) + require.True(t, got.GetPubKey().Equals(pub)) +} diff --git a/x/auth/types/test_common.go b/x/auth/types/test_common.go index c6f4d26b1d62..8b12d3055071 100644 --- a/x/auth/types/test_common.go +++ b/x/auth/types/test_common.go @@ -70,7 +70,7 @@ func KeyTestPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { } func NewTestTx(ctx sdk.Context, msgs []sdk.Msg, privs []crypto.PrivKey, accNums []uint64, seqs []uint64, fee StdFee) sdk.Tx { - sigs := make([]StdSignature, len(privs)) + sigs := make([]sdk.Signature, len(privs)) for i, priv := range privs { signBytes := StdSignBytes(ctx.ChainID(), accNums[i], seqs[i], fee, msgs, "") @@ -79,7 +79,7 @@ func NewTestTx(ctx sdk.Context, msgs []sdk.Msg, privs []crypto.PrivKey, accNums panic(err) } - sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: sig} + sigs[i] = NewStdSignature(priv.PubKey(), sig) } tx := NewStdTx(msgs, fee, sigs, "") @@ -87,7 +87,7 @@ func NewTestTx(ctx sdk.Context, msgs []sdk.Msg, privs []crypto.PrivKey, accNums } func NewTestTxWithMemo(ctx sdk.Context, msgs []sdk.Msg, privs []crypto.PrivKey, accNums []uint64, seqs []uint64, fee StdFee, memo string) sdk.Tx { - sigs := make([]StdSignature, len(privs)) + sigs := make([]sdk.Signature, len(privs)) for i, priv := range privs { signBytes := StdSignBytes(ctx.ChainID(), accNums[i], seqs[i], fee, msgs, memo) @@ -96,7 +96,7 @@ func NewTestTxWithMemo(ctx sdk.Context, msgs []sdk.Msg, privs []crypto.PrivKey, panic(err) } - sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: sig} + sigs[i] = NewStdSignature(priv.PubKey(), sig) } tx := NewStdTx(msgs, fee, sigs, memo) @@ -104,14 +104,14 @@ func NewTestTxWithMemo(ctx sdk.Context, msgs []sdk.Msg, privs []crypto.PrivKey, } func NewTestTxWithSignBytes(msgs []sdk.Msg, privs []crypto.PrivKey, accNums []uint64, seqs []uint64, fee StdFee, signBytes []byte, memo string) sdk.Tx { - sigs := make([]StdSignature, len(privs)) + sigs := make([]sdk.Signature, len(privs)) for i, priv := range privs { sig, err := priv.Sign(signBytes) if err != nil { panic(err) } - sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: sig} + sigs[i] = NewStdSignature(priv.PubKey(), sig) } tx := NewStdTx(msgs, fee, sigs, memo) diff --git a/x/auth/types/txbuilder.go b/x/auth/types/txbuilder.go index b29d977fd468..c9375c4318ab 100644 --- a/x/auth/types/txbuilder.go +++ b/x/auth/types/txbuilder.go @@ -214,7 +214,7 @@ func (bldr TxBuilder) Sign(name, passphrase string, msg StdSignMsg) ([]byte, err return nil, err } - return bldr.txEncoder(NewStdTx(msg.Msgs, msg.Fee, []StdSignature{sig}, msg.Memo)) + return bldr.txEncoder(NewStdTx(msg.Msgs, msg.Fee, []sdk.Signature{sig}, msg.Memo)) } // BuildAndSign builds a single message to be signed, and signs a transaction @@ -237,7 +237,7 @@ func (bldr TxBuilder) BuildTxForSim(msgs []sdk.Msg) ([]byte, error) { } // the ante handler will populate with a sentinel pubkey - sigs := []StdSignature{{}} + sigs := []sdk.Signature{NewStdSignature(nil, nil)} return bldr.txEncoder(NewStdTx(signMsg.Msgs, signMsg.Fee, sigs, signMsg.Memo)) } @@ -262,7 +262,7 @@ func (bldr TxBuilder) SignStdTx(name, passphrase string, stdTx StdTx, appendSig sigs := stdTx.GetSignatures() if len(sigs) == 0 || !appendSig { - sigs = []StdSignature{stdSignature} + sigs = []sdk.Signature{stdSignature} } else { sigs = append(sigs, stdSignature) } @@ -271,8 +271,8 @@ func (bldr TxBuilder) SignStdTx(name, passphrase string, stdTx StdTx, appendSig } // MakeSignature builds a StdSignature given keybase, key name, passphrase, and a StdSignMsg. -func MakeSignature(keybase crkeys.Keybase, name, passphrase string, - msg StdSignMsg) (sig StdSignature, err error) { +func MakeSignature(keybase crkeys.Keybase, name, + passphrase string, msg StdSignMsg) (sig sdk.Signature, err error) { if keybase == nil { keybase, err = keys.NewKeyBaseFromHomeFlag() if err != nil { @@ -284,8 +284,6 @@ func MakeSignature(keybase crkeys.Keybase, name, passphrase string, if err != nil { return } - return StdSignature{ - PubKey: pubkey, - Signature: sigBytes, - }, nil + + return NewStdSignature(pubkey, sigBytes), nil } diff --git a/x/distribution/proposal_handler_test.go b/x/distribution/proposal_handler_test.go index 8d26753dcde1..9551e2bc94bd 100644 --- a/x/distribution/proposal_handler_test.go +++ b/x/distribution/proposal_handler_test.go @@ -5,9 +5,10 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/stretchr/testify/require" ) var ( diff --git a/x/genutil/genesis_state_test.go b/x/genutil/genesis_state_test.go index c835de44c0f2..78175f214c76 100644 --- a/x/genutil/genesis_state_test.go +++ b/x/genutil/genesis_state_test.go @@ -3,11 +3,12 @@ package genutil import ( "testing" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" ) var ( diff --git a/x/gov/types/keys_test.go b/x/gov/types/keys_test.go index 93434d457de3..80d77c66043a 100644 --- a/x/gov/types/keys_test.go +++ b/x/gov/types/keys_test.go @@ -4,9 +4,10 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/ed25519" + + sdk "github.com/cosmos/cosmos-sdk/types" ) var addr = sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address()) diff --git a/x/mock/app.go b/x/mock/app.go index 75deed6a5caf..3f36c3f2a9f8 100644 --- a/x/mock/app.go +++ b/x/mock/app.go @@ -217,7 +217,7 @@ func GenTx(msgs []sdk.Msg, accnums []uint64, seq []uint64, priv ...crypto.PrivKe Gas: 100000, } - sigs := make([]auth.StdSignature, len(priv)) + sigs := make([]sdk.Signature, len(priv)) memo := "testmemotestmemo" for i, p := range priv { @@ -226,10 +226,7 @@ func GenTx(msgs []sdk.Msg, accnums []uint64, seq []uint64, priv ...crypto.PrivKe panic(err) } - sigs[i] = auth.StdSignature{ - PubKey: p.PubKey(), - Signature: sig, - } + sigs[i] = auth.NewStdSignature(p.PubKey(), sig) } return auth.NewStdTx(msgs, fee, sigs, memo) diff --git a/x/mock/app_test.go b/x/mock/app_test.go index 7a2b6adfd41e..91d9e3406051 100644 --- a/x/mock/app_test.go +++ b/x/mock/app_test.go @@ -24,13 +24,13 @@ type testMsg struct { positiveNum int64 } -func (tx testMsg) Route() string { return msgRoute } -func (tx testMsg) Type() string { return "test" } -func (tx testMsg) GetMsg() sdk.Msg { return tx } -func (tx testMsg) GetMemo() string { return "" } -func (tx testMsg) GetSignBytes() []byte { return nil } -func (tx testMsg) GetSigners() []sdk.AccAddress { return tx.signers } -func (tx testMsg) GetSignatures() []auth.StdSignature { return nil } +func (tx testMsg) Route() string { return msgRoute } +func (tx testMsg) Type() string { return "test" } +func (tx testMsg) GetMsg() sdk.Msg { return tx } +func (tx testMsg) GetMemo() string { return "" } +func (tx testMsg) GetSignBytes() []byte { return nil } +func (tx testMsg) GetSigners() []sdk.AccAddress { return tx.signers } +func (tx testMsg) GetSignatures() []sdk.Signature { return nil } func (tx testMsg) ValidateBasic() sdk.Error { if tx.positiveNum >= 0 { return nil diff --git a/x/staking/exported/exported.go b/x/staking/exported/exported.go index 496fda5a5618..121bf20a0895 100644 --- a/x/staking/exported/exported.go +++ b/x/staking/exported/exported.go @@ -1,8 +1,9 @@ package exported import ( - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/crypto" + + sdk "github.com/cosmos/cosmos-sdk/types" ) // DelegationI delegation bond for a delegated proof of stake system From 58eaa4c3bed26ce5049c1a81fcb859e858e8da10 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 7 Jun 2019 14:13:38 +0100 Subject: [PATCH 2/3] Mark this as breaking --- .pending/{improvements => breaking}/sdk/4507-New-Signature-g | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .pending/{improvements => breaking}/sdk/4507-New-Signature-g (100%) diff --git a/.pending/improvements/sdk/4507-New-Signature-g b/.pending/breaking/sdk/4507-New-Signature-g similarity index 100% rename from .pending/improvements/sdk/4507-New-Signature-g rename to .pending/breaking/sdk/4507-New-Signature-g From 28674bfa215fe4e263f3112e4109ffa6c5dec95d Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 7 Jun 2019 14:15:10 +0100 Subject: [PATCH 3/3] Remove redundant type check --- x/auth/types/stdtx.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/auth/types/stdtx.go b/x/auth/types/stdtx.go index b885d1796624..b577522202a9 100644 --- a/x/auth/types/stdtx.go +++ b/x/auth/types/stdtx.go @@ -14,7 +14,6 @@ import ( var ( _ sdk.Tx = (*StdTx)(nil) _ sdk.Signature = (*StdSignature)(nil) - _ sdk.Signature = StdSignature{} maxGasWanted = uint64((1 << 63) - 1) )