From 322d6f188befa8c802cccc7d9003e69d372c883f Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Wed, 3 Apr 2024 12:14:49 +0000 Subject: [PATCH] Fix progressively increasing gas usage (#146) Part of https://www.notion.so/Set-constant-gas-price-in-laconicd-00b470964f0e4020b06153f0f2c9bcfb - Use custom KV store gas config (0 gas for KV store ops) for laconic module (auction, bond, registry) txs Reviewed-on: https://git.vdb.to/cerc-io/laconicd/pulls/146 Co-authored-by: Prathamesh Musale Co-committed-by: Prathamesh Musale --- .golangci.yml | 1 - Makefile | 2 +- rpc/websockets.go | 5 ++- utils/context.go | 20 +++++++++++ x/auction/keeper/keeper.go | 6 ++++ x/auction/keeper/msg_server.go | 20 +++++++++-- x/bond/keeper/keeper.go | 6 ++++ x/bond/keeper/msg_server.go | 28 +++++++++++++-- x/evm/simulation/operations.go | 7 ++-- x/registry/keeper/msg_server.go | 62 ++++++++++++++++++++++++++++++--- 10 files changed, 138 insertions(+), 19 deletions(-) create mode 100644 utils/context.go diff --git a/.golangci.yml b/.golangci.yml index 84dea2d3..d65f510f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -8,7 +8,6 @@ linters: - bodyclose # - depguard # 20231120 disable until https://github.com/golangci/golangci-lint/issues/3906 is released - dogsled - - dupl - errcheck - goconst - gocritic diff --git a/Makefile b/Makefile index 4d9c77e9..dbc5b767 100644 --- a/Makefile +++ b/Makefile @@ -389,7 +389,7 @@ format-fix: ############################################################################### # ------ -# NOTE: Link to the tendermintdev/sdk-proto-gen docker images: +# NOTE: Link to the tendermintdev/sdk-proto-gen docker images: # https://hub.docker.com/r/tendermintdev/sdk-proto-gen/tags # protoVer=v0.7 diff --git a/rpc/websockets.go b/rpc/websockets.go index 179c996d..c98014d7 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -94,11 +94,10 @@ func (s *websocketsServer) Start() { go func() { var err error - /* #nosec G114 -- http functions have no support for timeouts */ if s.certFile == "" || s.keyFile == "" { - err = http.ListenAndServe(s.wsAddr, ws) + err = http.ListenAndServe(s.wsAddr, ws) /* #nosec G114 -- http functions have no support for timeouts */ } else { - err = http.ListenAndServeTLS(s.wsAddr, s.certFile, s.keyFile, ws) + err = http.ListenAndServeTLS(s.wsAddr, s.certFile, s.keyFile, ws) // #nosec G114 } if err != nil { diff --git a/utils/context.go b/utils/context.go new file mode 100644 index 00000000..f7393662 --- /dev/null +++ b/utils/context.go @@ -0,0 +1,20 @@ +package utils + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func CtxWithCustomKVGasConfig(ctx *sdk.Context) *sdk.Context { + updatedCtx := ctx.WithKVGasConfig(storetypes.GasConfig{ + HasCost: 0, + DeleteCost: 0, + ReadCostFlat: 0, + ReadCostPerByte: 0, + WriteCostFlat: 0, + WriteCostPerByte: 0, + IterNextCostFlat: 0, + }) + + return &updatedCtx +} diff --git a/x/auction/keeper/keeper.go b/x/auction/keeper/keeper.go index c8774e9d..6f09d563 100644 --- a/x/auction/keeper/keeper.go +++ b/x/auction/keeper/keeper.go @@ -15,6 +15,7 @@ import ( auth "github.com/cosmos/cosmos-sdk/x/auth/keeper" bank "github.com/cosmos/cosmos-sdk/x/bank/keeper" params "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/tendermint/tendermint/libs/log" wnsUtils "github.com/cerc-io/laconicd/utils" ) @@ -78,6 +79,11 @@ func NewKeeper(accountKeeper auth.AccountKeeper, } } +// Logger returns a module-specific logger. +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", types.ModuleName) +} + func (k *Keeper) SetUsageKeepers(usageKeepers []types.AuctionUsageKeeper) { k.usageKeepers = usageKeepers } diff --git a/x/auction/keeper/msg_server.go b/x/auction/keeper/msg_server.go index 75a97ab6..c7467974 100644 --- a/x/auction/keeper/msg_server.go +++ b/x/auction/keeper/msg_server.go @@ -2,9 +2,11 @@ package keeper import ( "context" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cerc-io/laconicd/utils" "github.com/cerc-io/laconicd/x/auction/types" ) @@ -20,6 +22,7 @@ var _ types.MsgServer = msgServer{} func (s msgServer) CreateAuction(c context.Context, msg *types.MsgCreateAuction) (*types.MsgCreateAuctionResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { @@ -46,13 +49,15 @@ func (s msgServer) CreateAuction(c context.Context, msg *types.MsgCreateAuction) ), }) + s.logTxGasConsumed(ctx, "CreateAuction") + return &types.MsgCreateAuctionResponse{Auction: resp}, nil } // CommitBid is the command for committing a bid -//nolint: all func (s msgServer) CommitBid(c context.Context, msg *types.MsgCommitBid) (*types.MsgCommitBidResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { @@ -77,13 +82,15 @@ func (s msgServer) CommitBid(c context.Context, msg *types.MsgCommitBid) (*types ), }) + s.logTxGasConsumed(ctx, "CommitBid") + return &types.MsgCommitBidResponse{Bid: resp}, nil } -//RevealBid is the command for revealing a bid -//nolint: all +// RevealBid is the command for revealing a bid func (s msgServer) RevealBid(c context.Context, msg *types.MsgRevealBid) (*types.MsgRevealBidResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { @@ -108,5 +115,12 @@ func (s msgServer) RevealBid(c context.Context, msg *types.MsgRevealBid) (*types ), }) + s.logTxGasConsumed(ctx, "RevealBid") + return &types.MsgRevealBidResponse{Auction: resp}, nil } + +func (s msgServer) logTxGasConsumed(ctx sdk.Context, tx string) { + gasConsumed := ctx.GasMeter().GasConsumed() + s.Keeper.Logger(ctx).Info("tx executed", "method", tx, "gas_consumed", fmt.Sprintf("%d", gasConsumed)) +} diff --git a/x/bond/keeper/keeper.go b/x/bond/keeper/keeper.go index 044b890e..1d518967 100644 --- a/x/bond/keeper/keeper.go +++ b/x/bond/keeper/keeper.go @@ -14,6 +14,7 @@ import ( auth "github.com/cosmos/cosmos-sdk/x/auth/keeper" bank "github.com/cosmos/cosmos-sdk/x/bank/keeper" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/tendermint/tendermint/libs/log" ) // prefixIDToBondIndex is the prefix for ID -> Bond index in the KVStore. @@ -62,6 +63,11 @@ func NewKeeper(cdc codec.BinaryCodec, } } +// Logger returns a module-specific logger. +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", types.ModuleName) +} + // Generates Bond ID -> Bond index key. func getBondIndexKey(id string) []byte { return append(prefixIDToBondIndex, []byte(id)...) diff --git a/x/bond/keeper/msg_server.go b/x/bond/keeper/msg_server.go index 7db7394f..cc462341 100644 --- a/x/bond/keeper/msg_server.go +++ b/x/bond/keeper/msg_server.go @@ -2,9 +2,12 @@ package keeper import ( "context" + "fmt" - "github.com/cerc-io/laconicd/x/bond/types" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cerc-io/laconicd/utils" + "github.com/cerc-io/laconicd/x/bond/types" ) type msgServer struct { @@ -20,6 +23,8 @@ var _ types.MsgServer = msgServer{} func (k msgServer) CreateBond(c context.Context, msg *types.MsgCreateBond) (*types.MsgCreateBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -42,12 +47,15 @@ func (k msgServer) CreateBond(c context.Context, msg *types.MsgCreateBond) (*typ ), }) + k.logTxGasConsumed(ctx, "CreateBond") + return &types.MsgCreateBondResponse{}, nil } -//nolint: all func (k msgServer) RefillBond(c context.Context, msg *types.MsgRefillBond) (*types.MsgRefillBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -72,12 +80,15 @@ func (k msgServer) RefillBond(c context.Context, msg *types.MsgRefillBond) (*typ ), }) + k.logTxGasConsumed(ctx, "RefillBond") + return &types.MsgRefillBondResponse{}, nil } -//nolint: all func (k msgServer) WithdrawBond(c context.Context, msg *types.MsgWithdrawBond) (*types.MsgWithdrawBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -102,11 +113,15 @@ func (k msgServer) WithdrawBond(c context.Context, msg *types.MsgWithdrawBond) ( ), }) + k.logTxGasConsumed(ctx, "WithdrawBond") + return &types.MsgWithdrawBondResponse{}, nil } func (k msgServer) CancelBond(c context.Context, msg *types.MsgCancelBond) (*types.MsgCancelBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -129,5 +144,12 @@ func (k msgServer) CancelBond(c context.Context, msg *types.MsgCancelBond) (*typ ), }) + k.logTxGasConsumed(ctx, "CancelBond") + return &types.MsgCancelBondResponse{}, nil } + +func (k msgServer) logTxGasConsumed(ctx sdk.Context, tx string) { + gasConsumed := ctx.GasMeter().GasConsumed() + k.Keeper.Logger(ctx).Info("tx executed", "method", tx, "gas_consumed", fmt.Sprintf("%d", gasConsumed)) +} diff --git a/x/evm/simulation/operations.go b/x/evm/simulation/operations.go index 7f8960ca..e11366d7 100644 --- a/x/evm/simulation/operations.go +++ b/x/evm/simulation/operations.go @@ -32,11 +32,10 @@ import ( "github.com/ethereum/go-ethereum/crypto" ) -// #nosec 101 const ( - OpWeightMsgEthSimpleTransfer = "op_weight_msg_eth_simple_transfer" - OpWeightMsgEthCreateContract = "op_weight_msg_eth_create_contract" - OpWeightMsgEthCallContract = "op_weight_msg_eth_call_contract" + OpWeightMsgEthSimpleTransfer = "op_weight_msg_eth_simple_transfer" // #nosec G101 + OpWeightMsgEthCreateContract = "op_weight_msg_eth_create_contract" // #nosec G101 + OpWeightMsgEthCallContract = "op_weight_msg_eth_call_contract" // #nosec G101 ) const ( diff --git a/x/registry/keeper/msg_server.go b/x/registry/keeper/msg_server.go index 9a16463c..b244e654 100644 --- a/x/registry/keeper/msg_server.go +++ b/x/registry/keeper/msg_server.go @@ -2,9 +2,12 @@ package keeper import ( "context" + "fmt" - "github.com/cerc-io/laconicd/x/registry/types" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cerc-io/laconicd/utils" + "github.com/cerc-io/laconicd/x/registry/types" ) type msgServer struct { @@ -20,6 +23,8 @@ var _ types.MsgServer = msgServer{} func (m msgServer) SetRecord(c context.Context, msg *types.MsgSetRecord) (*types.MsgSetRecordResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -44,12 +49,15 @@ func (m msgServer) SetRecord(c context.Context, msg *types.MsgSetRecord) (*types ), }) + m.logTxGasConsumed(ctx, "SetRecord") + return &types.MsgSetRecordResponse{Id: record.ID}, nil } -//nolint: all func (m msgServer) SetName(c context.Context, msg *types.MsgSetName) (*types.MsgSetNameResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -71,11 +79,16 @@ func (m msgServer) SetName(c context.Context, msg *types.MsgSetName) (*types.Msg sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "SetName") + return &types.MsgSetNameResponse{}, nil } func (m msgServer) ReserveName(c context.Context, msg *types.MsgReserveAuthority) (*types.MsgReserveAuthorityResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -101,12 +114,16 @@ func (m msgServer) ReserveName(c context.Context, msg *types.MsgReserveAuthority sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "ReserveName") + return &types.MsgReserveAuthorityResponse{}, nil } -//nolint: all func (m msgServer) SetAuthorityBond(c context.Context, msg *types.MsgSetAuthorityBond) (*types.MsgSetAuthorityBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -128,11 +145,16 @@ func (m msgServer) SetAuthorityBond(c context.Context, msg *types.MsgSetAuthorit sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "SetAuthorityBond") + return &types.MsgSetAuthorityBondResponse{}, nil } func (m msgServer) DeleteName(c context.Context, msg *types.MsgDeleteNameAuthority) (*types.MsgDeleteNameAuthorityResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -153,11 +175,16 @@ func (m msgServer) DeleteName(c context.Context, msg *types.MsgDeleteNameAuthori sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "DeleteName") + return &types.MsgDeleteNameAuthorityResponse{}, nil } func (m msgServer) RenewRecord(c context.Context, msg *types.MsgRenewRecord) (*types.MsgRenewRecordResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -178,12 +205,16 @@ func (m msgServer) RenewRecord(c context.Context, msg *types.MsgRenewRecord) (*t sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "RenewRecord") + return &types.MsgRenewRecordResponse{}, nil } -//nolint: all func (m msgServer) AssociateBond(c context.Context, msg *types.MsgAssociateBond) (*types.MsgAssociateBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -206,11 +237,16 @@ func (m msgServer) AssociateBond(c context.Context, msg *types.MsgAssociateBond) sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "AssociateBond") + return &types.MsgAssociateBondResponse{}, nil } func (m msgServer) DissociateBond(c context.Context, msg *types.MsgDissociateBond) (*types.MsgDissociateBondResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -231,11 +267,16 @@ func (m msgServer) DissociateBond(c context.Context, msg *types.MsgDissociateBon sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "DissociateBond") + return &types.MsgDissociateBondResponse{}, nil } func (m msgServer) DissociateRecords(c context.Context, msg *types.MsgDissociateRecords) (*types.MsgDissociateRecordsResponse, error) { ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -256,11 +297,16 @@ func (m msgServer) DissociateRecords(c context.Context, msg *types.MsgDissociate sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "DissociateRecords") + return &types.MsgDissociateRecordsResponse{}, nil } func (m msgServer) ReAssociateRecords(c context.Context, msg *types.MsgReAssociateRecords) (*types.MsgReAssociateRecordsResponse, error) { //nolint: all ctx := sdk.UnwrapSDKContext(c) + ctx = *utils.CtxWithCustomKVGasConfig(&ctx) + _, err := sdk.AccAddressFromBech32(msg.Signer) if err != nil { return nil, err @@ -282,5 +328,13 @@ func (m msgServer) ReAssociateRecords(c context.Context, msg *types.MsgReAssocia sdk.NewAttribute(types.AttributeKeySigner, msg.Signer), ), }) + + m.logTxGasConsumed(ctx, "ReAssociateRecords") + return &types.MsgReAssociateRecordsResponse{}, nil } + +func (m msgServer) logTxGasConsumed(ctx sdk.Context, tx string) { + gasConsumed := ctx.GasMeter().GasConsumed() + m.Keeper.Logger(ctx).Info("tx executed", "method", tx, "gas_consumed", fmt.Sprintf("%d", gasConsumed)) +}