From 40a30b738f22dd318ea955b9c1945fd3db374339 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Mon, 10 Dec 2018 02:48:19 -0800 Subject: [PATCH] Update gas costs to more reasonable numbers for GoS (#3052) --- PENDING.md | 1 + scripts/multisim.sh | 2 +- store/gaskvstore.go | 2 +- store/gaskvstore_test.go | 14 +++++++------- types/gas.go | 16 +++++++--------- x/auth/ante.go | 10 +++++----- x/auth/ante_test.go | 15 ++++++++------- x/auth/stdtx_test.go | 2 +- x/bank/keeper.go | 14 -------------- 9 files changed, 31 insertions(+), 45 deletions(-) diff --git a/PENDING.md b/PENDING.md index 73567c237303..202205111f50 100644 --- a/PENDING.md +++ b/PENDING.md @@ -14,6 +14,7 @@ BREAKING CHANGES - [#128](https://github.com/tendermint/devops/issues/128) Updated CircleCI job to trigger website build on every push to master/develop. - [\#2994](https://github.com/cosmos/cosmos-sdk/pull/2994) Change wrong-password error message. - \#3009 Added missing Gaia genesis verification + - [gas] \#3052 Updated gas costs to more reasonable numbers * SDK - [auth] \#2952 Signatures are no longer serialized on chain with the account number and sequence number diff --git a/scripts/multisim.sh b/scripts/multisim.sh index 028b6563f84f..b8d30772a483 100755 --- a/scripts/multisim.sh +++ b/scripts/multisim.sh @@ -22,7 +22,7 @@ sim() { file="$tmpdir/gaia-simulation-seed-$seed-date-$(date -u +"%Y-%m-%dT%H:%M:%S+00:00").stdout" echo "Writing stdout to $file..." go test ./cmd/gaia/app -run $testname -SimulationEnabled=true -SimulationNumBlocks=$blocks \ - -SimulationVerbose=true -SimulationCommit=true -SimulationSeed=$seed -v -timeout 24h > $file + -SimulationVerbose=true -SimulationCommit=true -SimulationSeed=$seed -SimulationPeriod=5 -v -timeout 24h > $file } i=0 diff --git a/store/gaskvstore.go b/store/gaskvstore.go index 2ce6415e666b..1100f8433979 100644 --- a/store/gaskvstore.go +++ b/store/gaskvstore.go @@ -179,6 +179,6 @@ func (gi *gasIterator) Close() { func (gi *gasIterator) consumeSeekGas() { value := gi.Value() - gi.gasMeter.ConsumeGas(gi.gasConfig.ValueCostPerByte*sdk.Gas(len(value)), sdk.GasValuePerByteDesc) + gi.gasMeter.ConsumeGas(gi.gasConfig.ReadCostPerByte*sdk.Gas(len(value)), sdk.GasValuePerByteDesc) gi.gasMeter.ConsumeGas(gi.gasConfig.IterNextCostFlat, sdk.GasIterNextCostFlatDesc) } diff --git a/store/gaskvstore_test.go b/store/gaskvstore_test.go index f059df7f8231..2426cf334727 100644 --- a/store/gaskvstore_test.go +++ b/store/gaskvstore_test.go @@ -12,26 +12,26 @@ import ( ) func newGasKVStore() KVStore { - meter := sdk.NewGasMeter(1000) + meter := sdk.NewGasMeter(10000) mem := dbStoreAdapter{dbm.NewMemDB()} return NewGasKVStore(meter, sdk.KVGasConfig(), mem) } func TestGasKVStoreBasic(t *testing.T) { mem := dbStoreAdapter{dbm.NewMemDB()} - meter := sdk.NewGasMeter(1000) + meter := sdk.NewGasMeter(10000) st := NewGasKVStore(meter, sdk.KVGasConfig(), mem) require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") st.Set(keyFmt(1), valFmt(1)) 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(), sdk.Gas(193)) + require.Equal(t, meter.GasConsumed(), sdk.Gas(6429)) } func TestGasKVStoreIterator(t *testing.T) { mem := dbStoreAdapter{dbm.NewMemDB()} - meter := sdk.NewGasMeter(1000) + meter := sdk.NewGasMeter(10000) st := NewGasKVStore(meter, sdk.KVGasConfig(), mem) require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") require.Empty(t, st.Get(keyFmt(2)), "Expected `key2` to be empty") @@ -50,7 +50,7 @@ func TestGasKVStoreIterator(t *testing.T) { iterator.Next() require.False(t, iterator.Valid()) require.Panics(t, iterator.Next) - require.Equal(t, meter.GasConsumed(), sdk.Gas(384)) + require.Equal(t, meter.GasConsumed(), sdk.Gas(6987)) } func TestGasKVStoreOutOfGasSet(t *testing.T) { @@ -62,7 +62,7 @@ func TestGasKVStoreOutOfGasSet(t *testing.T) { func TestGasKVStoreOutOfGasIterator(t *testing.T) { mem := dbStoreAdapter{dbm.NewMemDB()} - meter := sdk.NewGasMeter(200) + meter := sdk.NewGasMeter(20000) st := NewGasKVStore(meter, sdk.KVGasConfig(), mem) st.Set(keyFmt(1), valFmt(1)) iterator := st.Iterator(nil, nil) @@ -71,7 +71,7 @@ func TestGasKVStoreOutOfGasIterator(t *testing.T) { } func testGasKVStoreWrap(t *testing.T, store KVStore) { - meter := sdk.NewGasMeter(10000) + meter := sdk.NewGasMeter(100000) store = store.Gas(meter, sdk.GasConfig{HasCost: 10}) require.Equal(t, uint64(0), meter.GasConsumed()) diff --git a/types/gas.go b/types/gas.go index 100b004305b8..2daecdeb18dd 100644 --- a/types/gas.go +++ b/types/gas.go @@ -140,21 +140,19 @@ type GasConfig struct { ReadCostPerByte Gas WriteCostFlat Gas WriteCostPerByte Gas - ValueCostPerByte Gas IterNextCostFlat Gas } // KVGasConfig returns a default gas config for KVStores. func KVGasConfig() GasConfig { return GasConfig{ - HasCost: 10, - DeleteCost: 10, - ReadCostFlat: 10, - ReadCostPerByte: 1, - WriteCostFlat: 10, - WriteCostPerByte: 10, - ValueCostPerByte: 1, - IterNextCostFlat: 15, + HasCost: 1000, + DeleteCost: 1000, + ReadCostFlat: 1000, + ReadCostPerByte: 3, + WriteCostFlat: 2000, + WriteCostPerByte: 30, + IterNextCostFlat: 30, } } diff --git a/x/auth/ante.go b/x/auth/ante.go index 7c3195572b75..3c8a0f9aac97 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -12,13 +12,13 @@ import ( ) const ( - memoCostPerByte sdk.Gas = 1 - ed25519VerifyCost = 59 - secp256k1VerifyCost = 100 - maxMemoCharacters = 100 + memoCostPerByte sdk.Gas = 3 + ed25519VerifyCost = 590 + secp256k1VerifyCost = 1000 + maxMemoCharacters = 256 // how much gas = 1 atom - gasPerUnitCost = 1000 + gasPerUnitCost = 10000 // max total number of sigs per tx txSigLimit = 7 diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 88a63094a035..20fec8896f68 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -2,6 +2,7 @@ package auth import ( "fmt" + "strings" "testing" codec "github.com/cosmos/cosmos-sdk/codec" @@ -20,7 +21,7 @@ func newTestMsg(addrs ...sdk.AccAddress) *sdk.TestMsg { } func newStdFee() StdFee { - return NewStdFee(5000, + return NewStdFee(50000, sdk.NewInt64Coin("atom", 150), ) } @@ -437,13 +438,13 @@ func TestAnteHandlerMemoGas(t *testing.T) { checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeOutOfGas) // memo too large - fee = NewStdFee(2001, sdk.NewInt64Coin("atom", 0)) - tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, "abcininasidniandsinasindiansdiansdinaisndiasndiadninsdabcininasidniandsinasindiansdiansdinaisndiasndiadninsdabcininasidniandsinasindiansdiansdinaisndiasndiadninsd") + fee = NewStdFee(9000, sdk.NewInt64Coin("atom", 0)) + tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, strings.Repeat("01234567890", 500)) checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeMemoTooLarge) // tx with memo has enough gas - fee = NewStdFee(1100, sdk.NewInt64Coin("atom", 0)) - tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, "abcininasidniandsinasindiansdiansdinaisndiasndiadninsd") + fee = NewStdFee(9000, sdk.NewInt64Coin("atom", 0)) + tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, strings.Repeat("0123456789", 10)) checkValidTx(t, anteHandler, ctx, tx, false) } @@ -706,8 +707,8 @@ func TestAdjustFeesByGas(t *testing.T) { args args want sdk.Coins }{ - {"nil coins", args{sdk.Coins{}, 10000}, sdk.Coins{}}, - {"nil coins", args{sdk.Coins{sdk.NewInt64Coin("A", 10), sdk.NewInt64Coin("B", 0)}, 10000}, sdk.Coins{sdk.NewInt64Coin("A", 20), sdk.NewInt64Coin("B", 10)}}, + {"nil coins", args{sdk.Coins{}, 100000}, sdk.Coins{}}, + {"nil coins", args{sdk.Coins{sdk.NewInt64Coin("A", 10), sdk.NewInt64Coin("B", 0)}, 100000}, sdk.Coins{sdk.NewInt64Coin("A", 20), sdk.NewInt64Coin("B", 10)}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/x/auth/stdtx_test.go b/x/auth/stdtx_test.go index ee6556101244..1f2fefaca031 100644 --- a/x/auth/stdtx_test.go +++ b/x/auth/stdtx_test.go @@ -47,7 +47,7 @@ func TestStdSignBytes(t *testing.T) { }{ { args{"1234", 3, 6, defaultFee, []sdk.Msg{sdk.NewTestMsg(addr)}, "memo"}, - fmt.Sprintf("{\"account_number\":\"3\",\"chain_id\":\"1234\",\"fee\":{\"amount\":[{\"amount\":\"150\",\"denom\":\"atom\"}],\"gas\":\"5000\"},\"memo\":\"memo\",\"msgs\":[[\"%s\"]],\"sequence\":\"6\"}", addr), + fmt.Sprintf("{\"account_number\":\"3\",\"chain_id\":\"1234\",\"fee\":{\"amount\":[{\"amount\":\"150\",\"denom\":\"atom\"}],\"gas\":\"50000\"},\"memo\":\"memo\",\"msgs\":[[\"%s\"]],\"sequence\":\"6\"}", addr), }, } for i, tc := range tests { diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 579c0a2a9858..706f445eb9ae 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -7,14 +7,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" ) -const ( - costGetCoins sdk.Gas = 10 - costHasCoins sdk.Gas = 10 - costSetCoins sdk.Gas = 100 - costSubtractCoins sdk.Gas = 10 - costAddCoins sdk.Gas = 10 -) - //----------------------------------------------------------------------------- // Keeper @@ -150,7 +142,6 @@ func (keeper BaseViewKeeper) HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt //----------------------------------------------------------------------------- func getCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress) sdk.Coins { - ctx.GasMeter().ConsumeGas(costGetCoins, "getCoins") acc := am.GetAccount(ctx, addr) if acc == nil { return sdk.Coins{} @@ -159,7 +150,6 @@ func getCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress) sdk.C } func setCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) sdk.Error { - ctx.GasMeter().ConsumeGas(costSetCoins, "setCoins") acc := am.GetAccount(ctx, addr) if acc == nil { acc = am.NewAccountWithAddress(ctx, addr) @@ -175,14 +165,11 @@ func setCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt s // HasCoins returns whether or not an account has at least amt coins. func hasCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) bool { - ctx.GasMeter().ConsumeGas(costHasCoins, "hasCoins") return getCoins(ctx, am, addr).IsAllGTE(amt) } // SubtractCoins subtracts amt from the coins at the addr. func subtractCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { - ctx.GasMeter().ConsumeGas(costSubtractCoins, "subtractCoins") - oldCoins := getCoins(ctx, am, addr) newCoins, hasNeg := oldCoins.SafeMinus(amt) if hasNeg { @@ -196,7 +183,6 @@ func subtractCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, // AddCoins adds amt to the coins at the addr. func addCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { - ctx.GasMeter().ConsumeGas(costAddCoins, "addCoins") oldCoins := getCoins(ctx, am, addr) newCoins := oldCoins.Plus(amt) if !newCoins.IsNotNegative() {