fix(baseapp): Reset GasMeter before deliverTX (#18714)
This commit is contained in:
parent
0ba62db727
commit
e7f5c2ec8f
@ -79,6 +79,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* (baseapp) [#18609](https://github.com/cosmos/cosmos-sdk/issues/18609) Fixed accounting in the block gas meter after BeginBlock and before DeliverTx, ensuring transaction processing always starts with the expected zeroed out block gas meter.
|
||||
* (baseapp) [#18727](https://github.com/cosmos/cosmos-sdk/pull/18727) Ensure that `BaseApp.Init` firstly returns any errors from a nil commit multistore instead of panicking on nil dereferencing and before sealing the app.
|
||||
* (client) [#18622](https://github.com/cosmos/cosmos-sdk/pull/18622) Fixed a potential under/overflow from `uint64->int64` when computing gas fees as a LegacyDec.
|
||||
* (client/keys) [#18562](https://github.com/cosmos/cosmos-sdk/pull/18562) `keys delete` won't terminate when a key is not found.
|
||||
|
||||
@ -780,6 +780,10 @@ func (app *BaseApp) internalFinalizeBlock(ctx context.Context, req *abci.Request
|
||||
|
||||
events = append(events, beginBlock.Events...)
|
||||
|
||||
// Reset the gas meter so that the AnteHandlers aren't required to
|
||||
gasMeter = app.getBlockGasMeter(app.finalizeBlockState.ctx)
|
||||
app.finalizeBlockState.ctx = app.finalizeBlockState.ctx.WithBlockGasMeter(gasMeter)
|
||||
|
||||
// Iterate over all raw transactions in the proposal and attempt to execute
|
||||
// them, gathering the execution results.
|
||||
//
|
||||
|
||||
@ -192,6 +192,40 @@ func NewBaseAppSuiteWithSnapshots(t *testing.T, cfg SnapshotsConfig, opts ...fun
|
||||
return suite
|
||||
}
|
||||
|
||||
func TestAnteHandlerGasMeter(t *testing.T) {
|
||||
// run BeginBlock and assert that the gas meter passed into the first Txn is zeroed out
|
||||
anteOpt := func(bapp *baseapp.BaseApp) {
|
||||
bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) {
|
||||
gasMeter := ctx.BlockGasMeter()
|
||||
require.NotNil(t, gasMeter)
|
||||
require.Equal(t, storetypes.Gas(0), gasMeter.GasConsumed())
|
||||
return ctx, nil
|
||||
})
|
||||
}
|
||||
// set the beginBlocker to use some gas
|
||||
beginBlockerOpt := func(bapp *baseapp.BaseApp) {
|
||||
bapp.SetBeginBlocker(func(ctx sdk.Context) (sdk.BeginBlock, error) {
|
||||
ctx.BlockGasMeter().ConsumeGas(1, "beginBlocker gas consumption")
|
||||
return sdk.BeginBlock{}, nil
|
||||
})
|
||||
}
|
||||
|
||||
suite := NewBaseAppSuite(t, anteOpt, beginBlockerOpt)
|
||||
_, err := suite.baseApp.InitChain(&abci.RequestInitChain{
|
||||
ConsensusParams: &cmtproto.ConsensusParams{},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
deliverKey := []byte("deliver-key")
|
||||
baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImpl{t, capKey1, deliverKey})
|
||||
|
||||
tx := newTxCounter(t, suite.txConfig, 0, 0)
|
||||
txBytes, err := suite.txConfig.TxEncoder()(tx)
|
||||
require.NoError(t, err)
|
||||
_, err = suite.baseApp.FinalizeBlock(&abci.RequestFinalizeBlock{Height: 1, Txs: [][]byte{txBytes}})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestLoadVersion(t *testing.T) {
|
||||
logger := log.NewTestLogger(t)
|
||||
pruningOpt := baseapp.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user