From 86613536cd31961830ad302fba93990607dc4ceb Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 22 Nov 2022 11:47:52 +0800 Subject: [PATCH 1/2] Change default rent price to 0 --- x/dex/types/params.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/dex/types/params.go b/x/dex/types/params.go index 3fb55143ce..8120682e8f 100644 --- a/x/dex/types/params.go +++ b/x/dex/types/params.go @@ -17,7 +17,7 @@ const ( DefaultPriceSnapshotRetention = 24 * 3600 // default to one day ) -var DefaultSudoCallGasPrice = sdk.NewDecWithPrec(1, 1) // 0.1 +var DefaultSudoCallGasPrice = sdk.ZeroDec() // 0 var _ paramtypes.ParamSet = (*Params)(nil) From 4274aab25948217ffeeea26ae37acd9910582556 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 22 Nov 2022 14:21:28 +0800 Subject: [PATCH 2/2] fix race condition --- x/dex/contract/abci.go | 16 ++++++++-------- x/dex/keeper/contract_test.go | 2 ++ x/dex/keeper/utils/wasm.go | 10 ++++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/x/dex/contract/abci.go b/x/dex/contract/abci.go index 616f056ef9..5b06fdf917 100644 --- a/x/dex/contract/abci.go +++ b/x/dex/contract/abci.go @@ -42,19 +42,19 @@ func EndBlockerAtomic(ctx sdk.Context, keeper *keeper.Keeper, validContractsInfo spanCtx, span := (*tracer).Start(tracingInfo.TracerContext, "DexEndBlockerAtomic") defer span.End() env := newEnv(ctx, validContractsInfo, keeper) - ctx, msCached := cacheAndDecorateContext(ctx, env) - memStateCopy := dexutils.GetMemState(ctx.Context()).DeepCopy() + cachedCtx, msCached := cacheAndDecorateContext(ctx, env) + memStateCopy := dexutils.GetMemState(cachedCtx.Context()).DeepCopy() - handleDeposits(ctx, env, keeper, tracer) + handleDeposits(cachedCtx, env, keeper, tracer) runner := NewParallelRunner(func(contract types.ContractInfoV2) { - orderMatchingRunnable(spanCtx, ctx, env, keeper, contract, tracer) - }, validContractsInfo, ctx) + orderMatchingRunnable(spanCtx, cachedCtx, env, keeper, contract, tracer) + }, validContractsInfo, cachedCtx) runner.Run() - handleSettlements(spanCtx, ctx, env, keeper, tracer) - handleUnfulfilledMarketOrders(spanCtx, ctx, env, keeper, tracer) - handleFinalizedBlocks(spanCtx, ctx, env, keeper, tracer) + handleSettlements(spanCtx, cachedCtx, env, keeper, tracer) + handleUnfulfilledMarketOrders(spanCtx, cachedCtx, env, keeper, tracer) + handleFinalizedBlocks(spanCtx, cachedCtx, env, keeper, tracer) // No error is thrown for any contract. This should happen most of the time. if env.failedContractAddresses.Size() == 0 { diff --git a/x/dex/keeper/contract_test.go b/x/dex/keeper/contract_test.go index 2a0d7dae9e..6638966f42 100644 --- a/x/dex/keeper/contract_test.go +++ b/x/dex/keeper/contract_test.go @@ -3,6 +3,7 @@ package keeper_test import ( "testing" + sdk "github.com/cosmos/cosmos-sdk/types" keepertest "github.com/sei-protocol/sei-chain/testutil/keeper" "github.com/sei-protocol/sei-chain/x/dex/types" "github.com/stretchr/testify/require" @@ -10,6 +11,7 @@ import ( func TestChargeRentForGas(t *testing.T) { keeper, ctx := keepertest.DexKeeper(t) + keeper.SetParams(ctx, types.Params{SudoCallGasPrice: sdk.NewDecWithPrec(1, 1), PriceSnapshotRetention: 1}) err := keeper.SetContract(ctx, &types.ContractInfoV2{ Creator: keepertest.TestAccount, ContractAddr: keepertest.TestContract, diff --git a/x/dex/keeper/utils/wasm.go b/x/dex/keeper/utils/wasm.go index c5127120f3..7b77487006 100644 --- a/x/dex/keeper/utils/wasm.go +++ b/x/dex/keeper/utils/wasm.go @@ -38,15 +38,17 @@ func getMsgType(msg interface{}) string { func sudo(sdkCtx sdk.Context, k *keeper.Keeper, contractAddress []byte, wasmMsg []byte, msgType string) ([]byte, uint64, error) { // Measure the time it takes to execute the contract in WASM defer metrics.MeasureSudoExecutionDuration(time.Now(), msgType) - gasConsumedBefore := sdkCtx.GasMeter().GasConsumed() + // set up a tmp context to prevent race condition in reading gas consumed + tmpCtx := sdkCtx.WithGasMeter(sdk.NewInfiniteGasMeter()) data, err := k.WasmKeeper.Sudo( - sdkCtx, contractAddress, wasmMsg, + tmpCtx, contractAddress, wasmMsg, ) - gasConsumedAfter := sdkCtx.GasMeter().GasConsumed() + gasConsumed := tmpCtx.GasMeter().GasConsumed() + sdkCtx.GasMeter().ConsumeGas(gasConsumed, "sudo") if hasErrInstantiatingWasmModuleDueToCPUFeature(err) { panic(utils.DecorateHardFailError(err)) } - return data, gasConsumedAfter - gasConsumedBefore, err + return data, gasConsumed, err } func hasErrInstantiatingWasmModuleDueToCPUFeature(err error) bool {