From 09517056b07dbd1ba55c7ebffe9b537b11a5907d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 8 May 2018 17:46:02 +0200 Subject: [PATCH] Catch out-of-gas panics --- baseapp/baseapp.go | 14 ++++++++++---- baseapp/baseapp_test.go | 10 +++++----- cmd/gaia/app/app.go | 2 +- examples/basecoin/app/app.go | 2 +- examples/democoin/app/app.go | 2 +- examples/kvstore/main.go | 2 +- mock/app.go | 2 +- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index aeb534d43c..e1198c3c8a 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -58,7 +58,7 @@ var _ abci.Application = (*BaseApp)(nil) // Create and name new BaseApp // NOTE: The db is used to store the version number for now. -func NewBaseApp(name string, cdc *wire.Codec, logger log.Logger, db dbm.DB) *BaseApp { +func NewBaseApp(name string, cdc *wire.Codec, logger log.Logger, db dbm.DB, txGasLimit sdk.Gas) *BaseApp { app := &BaseApp{ Logger: logger, name: name, @@ -67,7 +67,7 @@ func NewBaseApp(name string, cdc *wire.Codec, logger log.Logger, db dbm.DB) *Bas router: NewRouter(), codespacer: sdk.NewCodespacer(), txDecoder: defaultTxDecoder(cdc), - txGasLimit: sdk.Gas(10000), + txGasLimit: txGasLimit, } // Register the undefined & root codespaces, which should not be used by any modules app.codespacer.RegisterOrPanic(sdk.CodespaceUndefined) @@ -375,8 +375,14 @@ func (app *BaseApp) runTx(isCheckTx bool, txBytes []byte, tx sdk.Tx) (result sdk // Handle any panics. defer func() { if r := recover(); r != nil { - log := fmt.Sprintf("Recovered: %v\nstack:\n%v", r, string(debug.Stack())) - result = sdk.ErrInternal(log).Result() + switch r.(type) { + case sdk.ErrorOutOfGas: + log := fmt.Sprintf("Out of gas in location: %v", r.(sdk.ErrorOutOfGas).Descriptor) + result = sdk.ErrOutOfGas(log).Result() + default: + log := fmt.Sprintf("Recovered: %v\nstack:\n%v", r, string(debug.Stack())) + result = sdk.ErrInternal(log).Result() + } } }() diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index aab64fc200..3c07e4ac01 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -25,7 +25,7 @@ func defaultLogger() log.Logger { func newBaseApp(name string) *BaseApp { logger := defaultLogger() db := dbm.NewMemDB() - return NewBaseApp(name, nil, logger, db) + return NewBaseApp(name, nil, logger, db, 10000) } func TestMountStores(t *testing.T) { @@ -59,7 +59,7 @@ func TestLoadVersion(t *testing.T) { logger := defaultLogger() db := dbm.NewMemDB() name := t.Name() - app := NewBaseApp(name, nil, logger, db) + app := NewBaseApp(name, nil, logger, db, 10000) // make a cap key and mount the store capKey := sdk.NewKVStoreKey("main") @@ -81,7 +81,7 @@ func TestLoadVersion(t *testing.T) { commitID := sdk.CommitID{1, res.Data} // reload - app = NewBaseApp(name, nil, logger, db) + app = NewBaseApp(name, nil, logger, db, 10000) app.MountStoresIAVL(capKey) err = app.LoadLatestVersion(capKey) // needed to make stores non-nil assert.Nil(t, err) @@ -147,7 +147,7 @@ func TestInitChainer(t *testing.T) { name := t.Name() db := dbm.NewMemDB() logger := defaultLogger() - app := NewBaseApp(name, nil, logger, db) + app := NewBaseApp(name, nil, logger, db, 10000) // make cap keys and mount the stores // NOTE/TODO: mounting multiple stores is broken // see https://github.com/cosmos/cosmos-sdk/issues/532 @@ -184,7 +184,7 @@ func TestInitChainer(t *testing.T) { assert.Equal(t, value, res.Value) // reload app - app = NewBaseApp(name, nil, logger, db) + app = NewBaseApp(name, nil, logger, db, 10000) app.MountStoresIAVL(capKey, capKey2) err = app.LoadLatestVersion(capKey) // needed to make stores non-nil assert.Nil(t, err) diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 5ff532bffa..672fd5b76c 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -51,7 +51,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // create your application object var app = &GaiaApp{ - BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + BaseApp: bam.NewBaseApp(appName, cdc, logger, db, 10000), cdc: cdc, keyMain: sdk.NewKVStoreKey("main"), keyAccount: sdk.NewKVStoreKey("acc"), diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index b1a434fa2c..d5994f55bd 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -48,7 +48,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // Create your application object. var app = &BasecoinApp{ - BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + BaseApp: bam.NewBaseApp(appName, cdc, logger, db, 10000), cdc: cdc, keyMain: sdk.NewKVStoreKey("main"), keyAccount: sdk.NewKVStoreKey("acc"), diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 7c8250b189..bf48348b44 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -56,7 +56,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { // Create your application object. var app = &DemocoinApp{ - BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + BaseApp: bam.NewBaseApp(appName, cdc, logger, db, 10000), cdc: cdc, capKeyMainStore: sdk.NewKVStoreKey("main"), capKeyAccountStore: sdk.NewKVStoreKey("acc"), diff --git a/examples/kvstore/main.go b/examples/kvstore/main.go index 856538f63a..bd10d31e94 100644 --- a/examples/kvstore/main.go +++ b/examples/kvstore/main.go @@ -32,7 +32,7 @@ func main() { var capKeyMainStore = sdk.NewKVStoreKey("main") // Create BaseApp. - var baseApp = bam.NewBaseApp("kvstore", nil, logger, db) + var baseApp = bam.NewBaseApp("kvstore", nil, logger, db, 10000) // Set mounts for BaseApp's MultiStore. baseApp.MountStoresIAVL(capKeyMainStore) diff --git a/mock/app.go b/mock/app.go index ab1a8447a5..4799b726a5 100644 --- a/mock/app.go +++ b/mock/app.go @@ -29,7 +29,7 @@ func NewApp(rootDir string, logger log.Logger) (abci.Application, error) { capKeyMainStore := sdk.NewKVStoreKey("main") // Create BaseApp. - baseApp := bam.NewBaseApp("kvstore", nil, logger, db) + baseApp := bam.NewBaseApp("kvstore", nil, logger, db, 10000) // Set mounts for BaseApp's MultiStore. baseApp.MountStoresIAVL(capKeyMainStore)