Skip to content

Commit

Permalink
feat: add option to disable block gas meter
Browse files Browse the repository at this point in the history
ref: #19613

block gas meter is not safe when executing transactions in parallel.
  • Loading branch information
yihuang committed Mar 5, 2024
1 parent fcfc099 commit 4bcd297
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ Ref: https://keepachangelog.com/en/1.0.0/

* (x/auth) [#19549](https://github.com/cosmos/cosmos-sdk/pull/19549) Accept custom get signers when injecting `x/auth/tx`.

### Features

* (baseapp) [#19626](https://github.com/cosmos/cosmos-sdk/pull/19626) Adds `DisableBlockGasMeter` option to `BaseApp`, which removes the block gas meter during transaction execution.

## [v0.50.4](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.50.4) - 2023-02-19

### Features
Expand Down
11 changes: 11 additions & 0 deletions baseapp/baseapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,13 @@ type BaseApp struct {
// including the goroutine handling.This is experimental and must be enabled
// by developers.
optimisticExec *oe.OptimisticExecution

// disableBlockGasMeter will disable the block gas meter if true, block gas meter is tricky to support
// when executing transactions in parallel.
// when disabled, the block gas meter in context is `nil`.
//
// SAFTY: it's safe to do if validators validates the total gas wanted in the proposal.
disableBlockGasMeter bool
}

// NewBaseApp returns a reference to an initialized BaseApp. It accepts a
Expand Down Expand Up @@ -640,6 +647,10 @@ func (app *BaseApp) getState(mode execMode) *state {
}

func (app *BaseApp) getBlockGasMeter(ctx sdk.Context) storetypes.GasMeter {
if app.disableBlockGasMeter {
return noopGasMeter{}
}

if maxGas := app.GetMaximumBlockGas(ctx); maxGas > 0 {
return storetypes.NewGasMeter(maxGas)
}
Expand Down
17 changes: 17 additions & 0 deletions baseapp/noopgasmeter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package baseapp

import storetypes "cosmossdk.io/store/types"

type noopGasMeter struct{}

var _ storetypes.GasMeter = noopGasMeter{}

func (noopGasMeter) GasConsumed() storetypes.Gas { return 0 }
func (noopGasMeter) GasConsumedToLimit() storetypes.Gas { return 0 }
func (noopGasMeter) GasRemaining() storetypes.Gas { return 0 }
func (noopGasMeter) Limit() storetypes.Gas { return 0 }
func (noopGasMeter) ConsumeGas(storetypes.Gas, string) {}
func (noopGasMeter) RefundGas(storetypes.Gas, string) {}
func (noopGasMeter) IsPastLimit() bool { return false }
func (noopGasMeter) IsOutOfGas() bool { return false }
func (noopGasMeter) String() string { return "noopGasMeter" }
10 changes: 10 additions & 0 deletions baseapp/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ func SetOptimisticExecution(opts ...func(*oe.OptimisticExecution)) func(*BaseApp
}
}

// DisableBlockGasMeter disables the block gas meter.
func DisableBlockGasMeter() func(*BaseApp) {
return func(app *BaseApp) { app.SetDisableBlockGasMeter(true) }
}

func (app *BaseApp) SetName(name string) {
if app.sealed {
panic("SetName() on sealed BaseApp")
Expand Down Expand Up @@ -362,3 +367,8 @@ func (app *BaseApp) SetStoreMetrics(gatherer metrics.StoreMetrics) {
func (app *BaseApp) SetStreamingManager(manager storetypes.StreamingManager) {
app.streamingManager = manager
}

// SetDisableBlockGasMeter sets the disableBlockGasMeter flag for the BaseApp.
func (app *BaseApp) SetDisableBlockGasMeter(disableBlockGasMeter bool) {
app.disableBlockGasMeter = disableBlockGasMeter
}

0 comments on commit 4bcd297

Please sign in to comment.