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

add proposal for modify the MaxGasUsedPerBlock #209

Merged
merged 2 commits into from
Aug 23, 2023
Merged
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
7 changes: 7 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,7 @@ func NewOKBChainApp(
app.SetEvmWatcherCollector(app.EvmKeeper.Watcher.Collect)
app.SetUpdateCMTxNonceHandler(NewUpdateCMTxNonceHandler())
app.SetGetGasConfigHandler(NewGetGasConfigHandler(app.ParamsKeeper))
app.SetGetBlockConfigHandler(NewGetBlockConfigHandler(app.ParamsKeeper))
mpt.AccountStateRootRetriever = app.AccountKeeper
if loadLatest {
err := app.LoadLatestVersion(app.keys[bam.MainStoreKey])
Expand Down Expand Up @@ -968,3 +969,9 @@ func NewGetGasConfigHandler(pk params.Keeper) sdk.GetGasConfigHandler {
return pk.GetGasConfig(ctx)
}
}

func NewGetBlockConfigHandler(pk params.Keeper) sdk.GetBlockConfigHandler {
return func(ctx sdk.Context) *sdk.BlockConfig {
return pk.GetBlockConfig(ctx)
}
}
8 changes: 8 additions & 0 deletions app/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/okx/okbchain/libs/cosmos-sdk/server"
"github.com/okx/okbchain/libs/cosmos-sdk/store/iavl"
"github.com/okx/okbchain/libs/cosmos-sdk/store/types"
sdk "github.com/okx/okbchain/libs/cosmos-sdk/types"
tmiavl "github.com/okx/okbchain/libs/iavl"
iavlconfig "github.com/okx/okbchain/libs/iavl/config"
"github.com/okx/okbchain/libs/system"
Expand Down Expand Up @@ -230,6 +231,10 @@ var (
confLogger log.Logger
)

func GetChainMaxGasUsedPerBlock() int64 {
return sdk.GetMaxGasUsedPerBlock()
}

func GetOkbcConfig() *OkbcConfig {
once.Do(func() {
okbcConfig = NewOkbcConfig()
Expand Down Expand Up @@ -834,6 +839,9 @@ func (c *OkbcConfig) SetEnableDeleteMinGPTx(enable bool) {
}

func (c *OkbcConfig) GetMaxGasUsedPerBlock() int64 {
if c.maxGasUsedPerBlock == -1 {
return GetChainMaxGasUsedPerBlock()
}
return c.maxGasUsedPerBlock
}

Expand Down
11 changes: 11 additions & 0 deletions libs/cosmos-sdk/baseapp/abci.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg
app.UpdateGlobalGasConfig(app.deliverState.ctx)
}

if app.getBlockConfigHandler != nil {
app.UpdateBlockConfig(app.deliverState.ctx)
}

app.deliverState.ctx.SetBlockGasMeter(gasMeter)

if app.beginBlocker != nil {
Expand All @@ -188,6 +192,13 @@ func (app *BaseApp) UpdateGlobalGasConfig(ctx sdk.Context) {
stypes.UpdateGlobalGasConfig(app.getGasConfigHandler(ctx))
}

func (app *BaseApp) UpdateBlockConfig(ctx sdk.Context) {
if ctx.IsCheckTx() || ctx.IsTraceTx() {
return
}
sdk.UpdateBlockConfig(app.getBlockConfigHandler(ctx))
}

func (app *BaseApp) UpdateFeeCollector(fee sdk.Coins, add bool) {
if fee.IsZero() {
return
Expand Down
1 change: 1 addition & 0 deletions libs/cosmos-sdk/baseapp/baseapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ type BaseApp struct { // nolint: maligned
getTxFeeHandler sdk.GetTxFeeHandler
updateCMTxNonceHandler sdk.UpdateCMTxNonceHandler
getGasConfigHandler sdk.GetGasConfigHandler
getBlockConfigHandler sdk.GetBlockConfigHandler

// volatile states:
//
Expand Down
7 changes: 7 additions & 0 deletions libs/cosmos-sdk/baseapp/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,3 +226,10 @@ func (app *BaseApp) SetGetGasConfigHandler(handler sdk.GetGasConfigHandler) {
}
app.getGasConfigHandler = handler
}

func (app *BaseApp) SetGetBlockConfigHandler(handler sdk.GetBlockConfigHandler) {
if app.sealed {
panic("SetGetBlockConfigHandler() on sealed BaseApp")
}
app.getBlockConfigHandler = handler
}
17 changes: 17 additions & 0 deletions libs/cosmos-sdk/types/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package types
import (
"context"
"sync"
"sync/atomic"

"github.com/okx/okbchain/libs/cosmos-sdk/version"
)
Expand Down Expand Up @@ -198,3 +199,19 @@ func KeyringServiceName() string {
}
return version.Name
}

const DefaultMaxGasUsedPerBlock int64 = -1

var globalBlockConfig = &BlockConfig{MaxGasUsedPerBlock: DefaultMaxGasUsedPerBlock}

type BlockConfig struct {
MaxGasUsedPerBlock int64
}

func UpdateBlockConfig(bc *BlockConfig) {
atomic.StoreInt64(&globalBlockConfig.MaxGasUsedPerBlock, bc.MaxGasUsedPerBlock)
}

func GetMaxGasUsedPerBlock() int64 {
return atomic.LoadInt64(&globalBlockConfig.MaxGasUsedPerBlock)
}
8 changes: 8 additions & 0 deletions libs/cosmos-sdk/types/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,11 @@ func TestConfig_SetFullFundraiserPath(t *testing.T) {
func TestKeyringServiceName(t *testing.T) {
require.Equal(t, sdk.DefaultKeyringServiceName, sdk.KeyringServiceName())
}

func TestBlockConfig(t *testing.T) {
require.Equal(t, sdk.DefaultMaxGasUsedPerBlock, sdk.GetMaxGasUsedPerBlock())
sdk.UpdateBlockConfig(&sdk.BlockConfig{0})
require.Equal(t, int64(0), sdk.GetMaxGasUsedPerBlock())
sdk.UpdateBlockConfig(&sdk.BlockConfig{100})
require.Equal(t, int64(100), sdk.GetMaxGasUsedPerBlock())
}
2 changes: 2 additions & 0 deletions libs/cosmos-sdk/types/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ type UpdateFeeCollectorAccHandler func(ctx Context, balance Coins, txFeesplit []

type GetGasConfigHandler func(ctx Context) *stypes.GasConfig

type GetBlockConfigHandler func(ctx Context) *BlockConfig

type UpdateCosmosTxCount func(ctx Context, txCount int)

type LogFix func(tx []Tx, logIndex []int, hasEnterEvmTx []bool, errs []error, resp []abci.ResponseDeliverTx) (logs [][]byte)
Expand Down
26 changes: 26 additions & 0 deletions x/params/client/cli/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
GetCmdQueryParams(queryRoute, cdc),
GetCmdQueryUpgrade(queryRoute, cdc),
GetCmdQueryGasConfig(queryRoute, cdc),
GetCmdQueryBlockConfig(queryRoute, cdc),
)...)

return queryCmd
Expand Down Expand Up @@ -78,3 +79,28 @@ $ exchaincli query params gasconfig
},
}
}

// GetCmdQueryBlockConfig implements the query params command.
func GetCmdQueryBlockConfig(queryRoute string, cdc *codec.Codec) *cobra.Command {
return &cobra.Command{
Use: "blockconfig",
Short: "Query parameters of blockconfig",
Long: strings.TrimSpace(`Query parameters of blockconfig:
$ exchaincli query params blockconfig
`),
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)

route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryBlockConfig)
bz, _, err := cliCtx.QueryWithData(route, nil)
if err != nil {
return err
}

var params types.BlockConfig
cdc.MustUnmarshalJSON(bz, &params)
return cliCtx.PrintOutput(params)
},
}
}
13 changes: 13 additions & 0 deletions x/params/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,16 @@ func (keeper Keeper) getGasConfig(ctx sdk.Context) (params types.GasConfig) {
stypes.AsDefaultGasConfig(&params.GasConfig)
return
}

func (keeper Keeper) GetBlockConfig(ctx sdk.Context) *sdk.BlockConfig {
params := keeper.getBlockConfig(ctx)
return &sdk.BlockConfig{params.MaxGasUsedPerBlock}
}

func (keeper Keeper) getBlockConfig(ctx sdk.Context) *types.BlockConfig {
params := types.NewDefaultBlockConfig()
for _, pair := range params.ParamSetPairs() {
keeper.paramSpace.GetIfExists(ctx, pair.Key, pair.Value)
}
return params
}
53 changes: 53 additions & 0 deletions x/params/keeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,56 @@ func (suite *KeeperSuite) TestGetGasConfig() {
tt.fncheck(*res)
}
}

func (suite *KeeperSuite) TestGetBlockConfig() {
sub := "params"
tests := []struct {
changes []types.ParamChange
fncheck func(res sdk.BlockConfig, err error)
}{
{
changes: []types.ParamChange{{Subspace: sub, Key: types.MaxGasUsedPerBlock, Value: "\"-1\""}},
fncheck: func(res sdk.BlockConfig, err error) {
suite.NoError(err)
suite.Equal(sdk.BlockConfig{MaxGasUsedPerBlock: -1}, res)
},
},
{
changes: []types.ParamChange{{Subspace: sub, Key: types.MaxGasUsedPerBlock, Value: "\"0\""}},
fncheck: func(res sdk.BlockConfig, err error) {
suite.NoError(err)
suite.Equal(sdk.BlockConfig{MaxGasUsedPerBlock: 0}, res)
},
},
{
changes: []types.ParamChange{{Subspace: sub, Key: types.MaxGasUsedPerBlock, Value: "\"100\""}},
fncheck: func(res sdk.BlockConfig, err error) {
suite.NoError(err)
suite.Equal(sdk.BlockConfig{MaxGasUsedPerBlock: 100}, res)
},
},
{
changes: []types.ParamChange{{Subspace: sub, Key: types.MaxGasUsedPerBlock, Value: "\"1000000000000\""}},
fncheck: func(res sdk.BlockConfig, err error) {
suite.NoError(err)
suite.Equal(sdk.BlockConfig{MaxGasUsedPerBlock: 1000000000000}, res)
},
},
{
changes: []types.ParamChange{{Subspace: sub, Key: types.MaxGasUsedPerBlock, Value: "\"-2\""}},
fncheck: func(res sdk.BlockConfig, err error) {
suite.Error(err)
suite.Equal(sdk.BlockConfig{MaxGasUsedPerBlock: 1000000000000}, res)
},
},
}

for _, tt := range tests {
ctx := suite.Context(0)

err := changeParams(ctx, &suite.paramsKeeper, types.NewParameterChangeProposal("hello", "word", tt.changes, 1))

res := suite.paramsKeeper.GetBlockConfig(ctx)
tt.fncheck(*res, err)
}
}
10 changes: 10 additions & 0 deletions x/params/querier.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ func NewQuerier(keeper Keeper) sdk.Querier {
return queryUpgrade(ctx, path[1], keeper)
case types.QueryGasConfig:
return queryGasConfig(ctx, req, keeper)
case types.QueryBlockConfig:
return queryBlockConfig(ctx, req, keeper)
default:
return nil, sdk.ErrUnknownRequest("unknown params query endpoint")
}
Expand Down Expand Up @@ -71,3 +73,11 @@ func queryGasConfig(ctx sdk.Context, _ abci.RequestQuery, keeper Keeper) ([]byte
}
return bz, nil
}

func queryBlockConfig(ctx sdk.Context, _ abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
bz, err := codec.MarshalJSONIndent(keeper.cdc, keeper.getBlockConfig(ctx))
if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, fmt.Sprintf("could not marshal result to JSON %s", err.Error()))
}
return bz, nil
}
1 change: 1 addition & 0 deletions x/params/types/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func ParamKeyTable() sdkparams.KeyTable {
kt := sdkparams.NewKeyTable()
kt.RegisterParamSet(&Params{})
kt.RegisterParamSet(&GasConfig{})
kt.RegisterParamSet(&BlockConfig{})
return kt
}

Expand Down
53 changes: 53 additions & 0 deletions x/params/types/params_block.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package types

import (
"fmt"
sdk "github.com/okx/okbchain/libs/cosmos-sdk/types"
"github.com/okx/okbchain/libs/cosmos-sdk/x/params/subspace"
)

const (
QueryBlockConfig = "blockconfig"
MaxGasUsedPerBlock = "MaxGasUsedPerBlock"
)

// BlockConfig is the struct of the parameters in this module
type BlockConfig struct {
MaxGasUsedPerBlock int64 `json:"maxGasUsedPerBlock"`
}

func NewDefaultBlockConfig() *BlockConfig {
return &BlockConfig{
MaxGasUsedPerBlock: sdk.DefaultMaxGasUsedPerBlock,
}
}

func (p BlockConfig) String() string {
return fmt.Sprintf(`
MaxGasUsedPerBlock: %d,
`, p.MaxGasUsedPerBlock)
}

// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs
// pairs of auth module's parameters.
// nolint
func (p *BlockConfig) ParamSetPairs() subspace.ParamSetPairs {
return subspace.ParamSetPairs{
{[]byte(MaxGasUsedPerBlock), &p.MaxGasUsedPerBlock, ValidateInt64("maxGasUsedPerBlock")},
}
}

func ValidateInt64(param string) subspace.ValueValidatorFn {
return func(i interface{}) error {
v, ok := i.(int64)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v < -1 {
return fmt.Errorf("%s must be equal or greater than -1: %d", param, v)
}

return nil
}
}
Loading