diff --git a/CHANGELOG.md b/CHANGELOG.md index ae2a6f0d2256..0ac915fef7ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### State Machine Breaking * (store) [#10218](https://github.com/cosmos/cosmos-sdk/pull/10218) Charge gas even when there are no entries while seeking. +* (store) [#10247](https://github.com/cosmos/cosmos-sdk/pull/10247) Charge gas for the key length in gas meter. ## [v0.44.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.44.5) - 2021-12-02 diff --git a/store/gaskv/store.go b/store/gaskv/store.go index 6fbc43fcf050..f36119169c76 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,9 +175,12 @@ 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..90137f344bac 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,18 @@ 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) @@ -101,7 +103,7 @@ func TestGasKVStoreIterator(t *testing.T) { 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 653400ffb67c..e6ffbb8060e0 100644 --- a/testutil/testdata/tx.go +++ b/testutil/testdata/tx.go @@ -35,7 +35,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 ac003ef13b91..ebc3e3c31d2b 100644 --- a/x/authz/client/testutil/tx.go +++ b/x/authz/client/testutil/tx.go @@ -935,6 +935,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()), @@ -948,6 +949,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()), @@ -961,6 +963,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()), @@ -1025,6 +1028,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()), @@ -1038,6 +1042,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()), diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index 5378d3774338..807e2b6e7667 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -61,7 +61,7 @@ func (s *IntegrationTestSuite) SetupSuite() { val.ValAddress, val2.ValAddress, unbond, - fmt.Sprintf("--%s=%d", flags.FlagGas, 202954), // 202954 is the required + fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), ) s.Require().NoError(err) _, err = s.network.WaitForHeight(1)