From dcf67d7ee462f7777ba8d70fbcd5e488da8e5b0d Mon Sep 17 00:00:00 2001 From: likhita-809 <78951027+likhita-809@users.noreply.github.com> Date: Mon, 4 Oct 2021 17:16:43 +0530 Subject: [PATCH] fix!: Charge gas for key length in gas meter (#10247) ## Description Closes: #10243 Charge the per-byte fee for the key length as for the values in gas meter --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable) --- CHANGELOG.md | 3 ++- store/gaskv/store.go | 4 ++++ store/gaskv/store_test.go | 11 +++++------ testutil/testdata/tx.go | 4 ++-- x/authz/client/testutil/tx.go | 5 +++++ 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c01a3a52aa8d..3367544229ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -127,7 +127,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (client) [#10226](https://github.com/cosmos/cosmos-sdk/pull/10226) Fix --home flag parsing. * [#10180](https://github.com/cosmos/cosmos-sdk/issues/10180) Documentation: make references to Cosmos SDK consistent -* (store) [#10218](https://github.com/cosmos/cosmos-sdk/pull/10218) Charge gas even when there are no entries while seeking. * (x/genutil) [#10104](https://github.com/cosmos/cosmos-sdk/pull/10104) Ensure the `init` command reads the `--home` flag value correctly. * [\#9651](https://github.com/cosmos/cosmos-sdk/pull/9651) Change inconsistent limit of `0` to `MaxUint64` on InfiniteGasMeter and add GasRemaining func to GasMeter. * [\#9639](https://github.com/cosmos/cosmos-sdk/pull/9639) Check store keys length before accessing them by making sure that `key` is of length `m+1` (for `key[n:m]`) @@ -149,6 +148,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### State Machine Breaking +* (store) [#10247](https://github.com/cosmos/cosmos-sdk/pull/10247) Charge gas for the key length in gas meter. +* (store) [#10218](https://github.com/cosmos/cosmos-sdk/pull/10218) Charge gas even when there are no entries while seeking. * (x/auth)[\#9596](https://github.com/cosmos/cosmos-sdk/pull/9596) Enable creating periodic vesting accounts with a transactions instead of requiring them to be created in genesis. * (x/bank) [\#9611](https://github.com/cosmos/cosmos-sdk/pull/9611) Introduce a new index to act as a reverse index between a denomination and address allowing to query for token holders of a specific denomination. `DenomOwners` is updated to use the new reverse index. diff --git a/store/gaskv/store.go b/store/gaskv/store.go index 6fbc43fcf050..182b04e07c67 100644 --- a/store/gaskv/store.go +++ b/store/gaskv/store.go @@ -39,6 +39,7 @@ func (gs *Store) Get(key []byte) (value []byte) { value = gs.parent.Get(key) // TODO overflow-safe math? + gs.gasMeter.ConsumeGas(gs.gasConfig.ReadCostPerByte*types.Gas(len(key)), types.GasReadPerByteDesc) gs.gasMeter.ConsumeGas(gs.gasConfig.ReadCostPerByte*types.Gas(len(value)), types.GasReadPerByteDesc) return value @@ -50,6 +51,7 @@ func (gs *Store) Set(key []byte, value []byte) { types.AssertValidValue(value) gs.gasMeter.ConsumeGas(gs.gasConfig.WriteCostFlat, types.GasWriteCostFlatDesc) // TODO overflow-safe math? + gs.gasMeter.ConsumeGas(gs.gasConfig.WriteCostPerByte*types.Gas(len(key)), types.GasWritePerByteDesc) gs.gasMeter.ConsumeGas(gs.gasConfig.WriteCostPerByte*types.Gas(len(value)), types.GasWritePerByteDesc) gs.parent.Set(key, value) } @@ -173,8 +175,10 @@ func (gi *gasIterator) Error() error { // based on the current value's length. func (gi *gasIterator) consumeSeekGas() { if gi.Valid() { + key := gi.Key() value := gi.Value() + gi.gasMeter.ConsumeGas(gi.gasConfig.ReadCostPerByte*types.Gas(len(key)), types.GasValuePerByteDesc) gi.gasMeter.ConsumeGas(gi.gasConfig.ReadCostPerByte*types.Gas(len(value)), types.GasValuePerByteDesc) } gi.gasMeter.ConsumeGas(gi.gasConfig.IterNextCostFlat, types.GasIterNextCostFlatDesc) diff --git a/store/gaskv/store_test.go b/store/gaskv/store_test.go index f926c7b7250e..2401a9805d94 100644 --- a/store/gaskv/store_test.go +++ b/store/gaskv/store_test.go @@ -35,7 +35,7 @@ func TestGasKVStoreBasic(t *testing.T) { require.Equal(t, valFmt(1), st.Get(keyFmt(1))) st.Delete(keyFmt(1)) require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") - require.Equal(t, meter.GasConsumed(), types.Gas(6429)) + require.Equal(t, meter.GasConsumed(), types.Gas(6858)) } func TestGasKVStoreIterator(t *testing.T) { @@ -74,16 +74,16 @@ func TestGasKVStoreIterator(t *testing.T) { vb := iterator.Value() require.Equal(t, vb, valFmt(2)) iterator.Next() - require.Equal(t, types.Gas(13377), meter.GasConsumed()) + require.Equal(t, types.Gas(14565), meter.GasConsumed()) kc := iterator.Key() require.Equal(t, kc, keyFmt(3)) vc := iterator.Value() require.Equal(t, vc, valFmt(0)) iterator.Next() - require.Equal(t, types.Gas(13446), meter.GasConsumed()) + require.Equal(t, types.Gas(14667), meter.GasConsumed()) require.False(t, iterator.Valid()) require.Panics(t, iterator.Next) - require.Equal(t, types.Gas(13476), meter.GasConsumed()) + require.Equal(t, types.Gas(14697), meter.GasConsumed()) require.NoError(t, iterator.Error()) reverseIterator := st.ReverseIterator(nil, nil) @@ -100,8 +100,7 @@ func TestGasKVStoreIterator(t *testing.T) { reverseIterator.Next() require.False(t, reverseIterator.Valid()) require.Panics(t, reverseIterator.Next) - - require.Equal(t, types.Gas(13782), meter.GasConsumed()) + require.Equal(t, types.Gas(15135), meter.GasConsumed()) } func TestGasKVStoreOutOfGasSet(t *testing.T) { diff --git a/testutil/testdata/tx.go b/testutil/testdata/tx.go index e12f0467986e..5d0051f41a6a 100644 --- a/testutil/testdata/tx.go +++ b/testutil/testdata/tx.go @@ -2,7 +2,6 @@ package testdata import ( "encoding/json" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" @@ -10,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256r1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // KeyTestPubAddr generates a new secp256k1 keypair. @@ -36,7 +36,7 @@ func NewTestFeeAmount() sdk.Coins { // NewTestGasLimit is a test fee gas limit. func NewTestGasLimit() uint64 { - return 100000 + return 200000 } // NewTestMsg creates a message for testing with the given signers. diff --git a/x/authz/client/testutil/tx.go b/x/authz/client/testutil/tx.go index b379533cf71a..dc4f1b00e281 100644 --- a/x/authz/client/testutil/tx.go +++ b/x/authz/client/testutil/tx.go @@ -971,6 +971,7 @@ func (s *IntegrationTestSuite) TestExecUndelegateAuthorization() { "valid txn: (undelegate half tokens)", []string{ execMsg.Name(), + fmt.Sprintf("--%s=%s", flags.FlagGas, "250000"), fmt.Sprintf("--%s=%s", flags.FlagFrom, grantee.String()), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -984,6 +985,7 @@ func (s *IntegrationTestSuite) TestExecUndelegateAuthorization() { "valid txn: (undelegate remaining half tokens)", []string{ execMsg.Name(), + fmt.Sprintf("--%s=%s", flags.FlagGas, "250000"), fmt.Sprintf("--%s=%s", flags.FlagFrom, grantee.String()), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -997,6 +999,7 @@ func (s *IntegrationTestSuite) TestExecUndelegateAuthorization() { "failed with error no authorization found", []string{ execMsg.Name(), + fmt.Sprintf("--%s=%s", flags.FlagGas, "250000"), fmt.Sprintf("--%s=%s", flags.FlagFrom, grantee.String()), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -1061,6 +1064,7 @@ func (s *IntegrationTestSuite) TestExecUndelegateAuthorization() { "valid txn", []string{ execMsg.Name(), + fmt.Sprintf("--%s=%s", flags.FlagGas, "250000"), fmt.Sprintf("--%s=%s", flags.FlagFrom, grantee.String()), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -1074,6 +1078,7 @@ func (s *IntegrationTestSuite) TestExecUndelegateAuthorization() { "valid txn", []string{ execMsg.Name(), + fmt.Sprintf("--%s=%s", flags.FlagGas, "250000"), fmt.Sprintf("--%s=%s", flags.FlagFrom, grantee.String()), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),