diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 1842be6b1ba8..b7d7d46dea31 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -363,17 +363,18 @@ func ConsumeMultisignatureVerificationGas( sigIndex := 0 for i := 0; i < size; i++ { - if sig.BitArray.GetIndex(i) { - sigV2 := signing.SignatureV2{ - PubKey: pubkey.GetPubKeys()[i], - Data: sig.Signatures[sigIndex], - } - err := DefaultSigVerificationGasConsumer(meter, sigV2, params) - if err != nil { - return err - } - sigIndex++ + if !sig.BitArray.GetIndex(i) { + continue + } + sigV2 := signing.SignatureV2{ + PubKey: pubkey.GetPubKeys()[i], + Data: sig.Signatures[sigIndex], + } + err := DefaultSigVerificationGasConsumer(meter, sigV2, params) + if err != nil { + return err } + sigIndex++ } return nil diff --git a/x/auth/signing/verify_test.go b/x/auth/signing/verify_test.go new file mode 100644 index 000000000000..c6f2c7cb1534 --- /dev/null +++ b/x/auth/signing/verify_test.go @@ -0,0 +1,67 @@ +package signing_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +func TestVerifySignature(t *testing.T) { + priv, pubKey, addr := types.KeyTestPubAddr() + + const ( + memo = "testmemo" + chainId = "test-chain" + ) + + app, ctx := createTestApp(false) + ctx = ctx.WithBlockHeight(1) + + cdc := codec.New() + sdk.RegisterCodec(cdc) + types.RegisterCodec(cdc) + cdc.RegisterConcrete(sdk.TestMsg{}, "cosmos-sdk/Test", nil) + + acc1 := app.AccountKeeper.NewAccountWithAddress(ctx, addr) + app.AccountKeeper.SetAccount(ctx, acc1) + balances := sdk.NewCoins(sdk.NewInt64Coin("atom", 200)) + require.NoError(t, app.BankKeeper.SetBalances(ctx, addr, balances)) + acc, err := ante.GetSignerAcc(ctx, app.AccountKeeper, addr) + require.NoError(t, app.BankKeeper.SetBalances(ctx, addr, balances)) + + msgs := []sdk.Msg{types.NewTestMsg(addr)} + fee := types.NewStdFee(50000, sdk.Coins{sdk.NewInt64Coin("atom", 150)}) + signerData := signing.SignerData{ + ChainID: chainId, + AccountNumber: acc.GetAccountNumber(), + AccountSequence: acc.GetSequence(), + } + signBytes := types.StdSignBytes(signerData.ChainID, signerData.AccountNumber, signerData.AccountSequence, + fee, msgs, memo) + signature, err := priv.Sign(signBytes) + require.NoError(t, err) + + stdSig := types.StdSignature{PubKey: pubKey.Bytes(), Signature: signature} + sigV2, err := types.StdSignatureToSignatureV2(cdc, stdSig) + handler := MakeTestHandlerMap() + stdTx := types.NewStdTx(msgs, fee, []types.StdSignature{stdSig}, memo) + err = signing.VerifySignature(pubKey, signerData, sigV2.Data, handler, stdTx) + require.NoError(t, err) +} + +// returns context and app with params set on account keeper +func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { + app := simapp.Setup(isCheckTx) + ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{}) + app.AccountKeeper.SetParams(ctx, types.DefaultParams()) + + return app, ctx +} diff --git a/x/auth/types/stdtx_test.go b/x/auth/types/stdtx_test.go index df43ccda9268..bdd94d3336e4 100644 --- a/x/auth/types/stdtx_test.go +++ b/x/auth/types/stdtx_test.go @@ -227,3 +227,26 @@ func TestSignatureV2Conversions(t *testing.T) { require.Equal(t, multiPK, sigV2.PubKey) require.Equal(t, msigData, sigV2.Data) } + +func TestGetSignaturesV2(t *testing.T) { + _, pubKey, _ := KeyTestPubAddr() + dummy := []byte("dummySig") + + cdc := codec.New() + sdk.RegisterCodec(cdc) + RegisterCodec(cdc) + + fee := NewStdFee(50000, sdk.Coins{sdk.NewInt64Coin("atom", 150)}) + sig := StdSignature{PubKey: pubKey.Bytes(), Signature: dummy} + stdTx := NewStdTx([]sdk.Msg{NewTestMsg()}, fee, []StdSignature{sig}, "testsigs") + + sigs, err := stdTx.GetSignaturesV2() + require.Nil(t, err) + require.Equal(t, len(sigs), 1) + + require.Equal(t, sigs[0].PubKey.Bytes(), sig.GetPubKey().Bytes()) + require.Equal(t, sigs[0].Data, &signing.SingleSignatureData{ + SignMode: signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, + Signature: sig.GetSignature(), + }) +}