diff --git a/CHANGELOG.md b/CHANGELOG.md index ac42cc4973..4f3b4c522d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes +* (baseapp) [#17159](https://github.com/cosmos/cosmos-sdk/pull/17159) Validators can propose blocks that exceed the gas limit. * (x/group) [#17146](https://github.com/cosmos/cosmos-sdk/pull/17146) Rename x/group legacy ORM package's error codespace from "orm" to "legacy_orm", preventing collisions with ORM's error codespace "orm". ### API Breaking Changes diff --git a/baseapp/abci_test.go b/baseapp/abci_test.go index 5458a85027..4e164b812b 100644 --- a/baseapp/abci_test.go +++ b/baseapp/abci_test.go @@ -1573,6 +1573,47 @@ func TestABCI_PrepareProposal_BadEncoding(t *testing.T) { require.Equal(t, 1, len(resPrepareProposal.Txs)) } +func TestABCI_PrepareProposal_OverGasUnderBytes(t *testing.T) { + pool := mempool.NewSenderNonceMempool() + suite := NewBaseAppSuite(t, baseapp.SetMempool(pool)) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), NoopCounterServerImpl{}) + + // set max block gas limit to 99, this will allow 9 txs of 10 gas each. + _, err := suite.baseApp.InitChain(&abci.RequestInitChain{ + ConsensusParams: &cmtproto.ConsensusParams{ + Block: &cmtproto.BlockParams{MaxGas: 99}, + }, + }) + + require.NoError(t, err) + // insert 100 txs, each with a gas limit of 10 + _, _, addr := testdata.KeyTestPubAddr() + for i := int64(0); i < 100; i++ { + msg := &baseapptestutil.MsgCounter{Counter: i, FailOnHandler: false, Signer: addr.String()} + msgs := []sdk.Msg{msg} + + builder := suite.txConfig.NewTxBuilder() + err = builder.SetMsgs(msgs...) + require.NoError(t, err) + builder.SetMemo("counter=" + strconv.FormatInt(i, 10) + "&failOnAnte=false") + builder.SetGasLimit(10) + setTxSignature(t, builder, uint64(i)) + + err := pool.Insert(sdk.Context{}, builder.GetTx()) + require.NoError(t, err) + } + + // ensure we only select transactions that fit within the block gas limit + res, err := suite.baseApp.PrepareProposal(&abci.RequestPrepareProposal{ + MaxTxBytes: 1_000_000, // large enough to ignore restriction + Height: 1, + }) + require.NoError(t, err) + + // Should include 9 transactions + require.Len(t, res.Txs, 9, "invalid number of transactions returned") +} + func TestABCI_PrepareProposal_MaxGas(t *testing.T) { pool := mempool.NewSenderNonceMempool() suite := NewBaseAppSuite(t, baseapp.SetMempool(pool)) diff --git a/baseapp/abci_utils.go b/baseapp/abci_utils.go index d73fb003b4..6dacc5407d 100644 --- a/baseapp/abci_utils.go +++ b/baseapp/abci_utils.go @@ -231,10 +231,12 @@ func (h DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHand if (txSize + totalTxBytes) < req.MaxTxBytes { // If there is a max block gas limit, add the tx only if the limit has // not been met. - if maxBlockGas > 0 && (txGasLimit+totalTxGas) <= uint64(maxBlockGas) { - totalTxGas += txGasLimit - totalTxBytes += txSize - selectedTxs = append(selectedTxs, bz) + if maxBlockGas > 0 { + if (txGasLimit + totalTxGas) <= uint64(maxBlockGas) { + totalTxGas += txGasLimit + totalTxBytes += txSize + selectedTxs = append(selectedTxs, bz) + } } else { totalTxBytes += txSize selectedTxs = append(selectedTxs, bz)