Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: min gas prices config #3340

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion gno.land/cmd/gnoland/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/gnolang/gno/tm2/pkg/crypto"
"github.com/gnolang/gno/tm2/pkg/events"
osm "github.com/gnolang/gno/tm2/pkg/os"

"github.com/gnolang/gno/tm2/pkg/std"
"github.com/gnolang/gno/tm2/pkg/telemetry"
"go.uber.org/zap"
Expand Down Expand Up @@ -234,9 +235,10 @@ func execStart(ctx context.Context, c *startCfg, io commands.IO) error {

// Create a top-level shared event switch
evsw := events.NewEventSwitch()
minGasPrices := cfg.Application.MinGasPrices

// Create application and node
cfg.LocalApp, err = gnoland.NewApp(nodeDir, c.skipFailingGenesisTxs, evsw, logger)
cfg.LocalApp, err = gnoland.NewApp(nodeDir, c.skipFailingGenesisTxs, evsw, logger, minGasPrices)
if err != nil {
return fmt.Errorf("unable to create the Gnoland app, %w", err)
}
Expand Down
11 changes: 9 additions & 2 deletions gno.land/pkg/gnoland/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
EventSwitch events.EventSwitch // required
VMOutput io.Writer // optional
InitChainerConfig // options related to InitChainer
MinGasPrices string // optional
}

// TestAppOptions provides a "ready" default [AppOptions] for use with
Expand Down Expand Up @@ -79,9 +80,13 @@
mainKey := store.NewStoreKey("main")
baseKey := store.NewStoreKey("base")

// set sdk app options
var appOpts []func(*sdk.BaseApp)
if cfg.MinGasPrices != "" {
appOpts = append(appOpts, sdk.SetMinGasPrices(cfg.MinGasPrices))
}

Check warning on line 87 in gno.land/pkg/gnoland/app.go

View check run for this annotation

Codecov / codecov/patch

gno.land/pkg/gnoland/app.go#L86-L87

Added lines #L86 - L87 were not covered by tests
// Create BaseApp.
// TODO: Add a consensus based min gas prices for the node, by default it does not check
baseApp := sdk.NewBaseApp("gnoland", cfg.Logger, cfg.DB, baseKey, mainKey)
baseApp := sdk.NewBaseApp("gnoland", cfg.Logger, cfg.DB, baseKey, mainKey, appOpts...)
baseApp.SetAppVersion("dev")

// Set mounts for BaseApp's MultiStore.
Expand Down Expand Up @@ -181,6 +186,7 @@
skipFailingGenesisTxs bool,
evsw events.EventSwitch,
logger *slog.Logger,
minGasPrices string,
) (abci.Application, error) {
var err error

Expand All @@ -191,6 +197,7 @@
GenesisTxResultHandler: PanicOnFailingTxResultHandler,
StdlibDir: filepath.Join(gnoenv.RootDir(), "gnovm", "stdlibs"),
},
MinGasPrices: minGasPrices,
}
if skipFailingGenesisTxs {
cfg.GenesisTxResultHandler = NoopGenesisTxResultHandler
Expand Down
2 changes: 1 addition & 1 deletion gno.land/pkg/gnoland/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ func TestNewApp(t *testing.T) {
// NewApp should have good defaults and manage to run InitChain.
td := t.TempDir()

app, err := NewApp(td, true, events.NewEventSwitch(), log.NewNoopLogger())
app, err := NewApp(td, true, events.NewEventSwitch(), log.NewNoopLogger(), "")
require.NoError(t, err, "NewApp should be successful")

resp := app.InitChain(abci.RequestInitChain{
Expand Down
7 changes: 7 additions & 0 deletions tm2/pkg/bft/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"github.com/gnolang/gno/tm2/pkg/errors"
osm "github.com/gnolang/gno/tm2/pkg/os"
p2p "github.com/gnolang/gno/tm2/pkg/p2p/config"
sdk "github.com/gnolang/gno/tm2/pkg/sdk/config"
telemetry "github.com/gnolang/gno/tm2/pkg/telemetry/config"
)

Expand Down Expand Up @@ -54,6 +55,7 @@
Consensus *cns.ConsensusConfig `json:"consensus" toml:"consensus" comment:"##### consensus configuration options #####"`
TxEventStore *eventstore.Config `json:"tx_event_store" toml:"tx_event_store" comment:"##### event store #####"`
Telemetry *telemetry.Config `json:"telemetry" toml:"telemetry" comment:"##### node telemetry #####"`
Application *sdk.AppConfig `json:"application" toml:"application" comment:"##### app settings #####"`
}

// DefaultConfig returns a default configuration for a Tendermint node
Expand All @@ -66,6 +68,7 @@
Consensus: cns.DefaultConsensusConfig(),
TxEventStore: eventstore.DefaultEventStoreConfig(),
Telemetry: telemetry.DefaultTelemetryConfig(),
Application: sdk.DefaultAppConfig(),
}
}

Expand Down Expand Up @@ -173,6 +176,7 @@
Consensus: cns.TestConsensusConfig(),
TxEventStore: eventstore.DefaultEventStoreConfig(),
Telemetry: telemetry.DefaultTelemetryConfig(),
Application: sdk.DefaultAppConfig(),
}
}

Expand Down Expand Up @@ -228,6 +232,9 @@
if err := cfg.Consensus.ValidateBasic(); err != nil {
return errors.Wrap(err, "Error in [consensus] section")
}
if err := cfg.Application.ValidateBasic(); err != nil {
return errors.Wrap(err, "Error in [application] section")
}

Check warning on line 237 in tm2/pkg/bft/config/config.go

View check run for this annotation

Codecov / codecov/patch

tm2/pkg/bft/config/config.go#L236-L237

Added lines #L236 - L237 were not covered by tests
return nil
}

Expand Down
3 changes: 2 additions & 1 deletion tm2/pkg/sdk/auth/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -387,9 +387,10 @@ func EnsureSufficientMempoolFees(ctx sdk.Context, fee std.Fee) sdk.Result {
if prod1.Cmp(prod2) >= 0 {
return sdk.Result{}
} else {
fee := new(big.Int).Quo(prod2, gpg)
return abciResult(std.ErrInsufficientFee(
fmt.Sprintf(
"insufficient fees; got: {Gas-Wanted: %d, Gas-Fee %s}, fee required: %+v as minimum gas price set by the node", feeGasPrice.Gas, feeGasPrice.Price, gp,
"insufficient fees; got: {Gas-Wanted: %d, Gas-Fee %s}, fee required: %d with %+v as minimum gas price set by the node", feeGasPrice.Gas, feeGasPrice.Price, fee, gp,
),
))
}
Expand Down
35 changes: 35 additions & 0 deletions tm2/pkg/sdk/config/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package config

import (
"github.com/gnolang/gno/tm2/pkg/errors"
"github.com/gnolang/gno/tm2/pkg/std"
)

// -----------------------------------------------------------------------------
// Application Config

// AppConfig defines the configuration options for the Application
type AppConfig struct {
// Lowest gas prices accepted by a validator in the form of "100tokenA/3gas;10tokenB/5gas" separated by semicolons
MinGasPrices string `json:"min_gas_prices" toml:"min_gas_prices" comment:"Lowest gas prices accepted by a validator"`
}

// DefaultAppConfig returns a default configuration for the application
func DefaultAppConfig() *AppConfig {
return &AppConfig{
MinGasPrices: "",
}
}

// ValidateBasic performs basic validation, checking format and param bounds, etc., and
// returns an error if any check fails.
func (cfg *AppConfig) ValidateBasic() error {
if cfg.MinGasPrices == "" {
return nil
}
if _, err := std.ParseGasPrices(cfg.MinGasPrices); err != nil {
return errors.Wrap(err, "invalid min gas prices")
}

return nil
}
36 changes: 36 additions & 0 deletions tm2/pkg/sdk/config/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package config

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestValidateAppConfig(t *testing.T) {
c := DefaultAppConfig()
c.MinGasPrices = "" // empty

testCases := []struct {
testName string
minGasPrices string
expectErr bool
}{
{"invalid min gas prices invalid gas", "10token/1", true},
{"invalid min gas prices invalid gas denom", "9token/0gs", true},
{"invalid min gas prices zero gas", "10token/0gas", true},
{"invalid min gas prices no gas", "10token/gas", true},
{"invalid min gas prices negtive gas", "10token/-1gas", true},
{"invalid min gas prices invalid denom", "10$token/2gas", true},
{"invalid min gas prices invalid second denom", "10token/2gas;10/3gas", true},
{"valid min gas prices", "10foo/3gas;5bar/3gas", false},
}

cfg := DefaultAppConfig()
for _, tc := range testCases {
tc := tc
t.Run(tc.testName, func(t *testing.T) {
cfg.MinGasPrices = tc.minGasPrices
assert.Equal(t, tc.expectErr, cfg.ValidateBasic() != nil)
})
}
}
6 changes: 4 additions & 2 deletions tm2/pkg/std/gasprice.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ func ParseGasPrice(gasprice string) (GasPrice, error) {
if gas.Denom != "gas" {
return GasPrice{}, errors.New("invalid gas price: %s (invalid gas denom)", gasprice)
}
if gas.Amount == 0 {
return GasPrice{}, errors.New("invalid gas price: %s (gas can not be zero)", gasprice)

if gas.Amount <= 0 {
return GasPrice{}, errors.New("invalid gas price: %s (invalid gas amount)", gasprice)
}

return GasPrice{
Gas: gas.Amount,
Price: price,
Expand Down
Loading