From a50194312c8ae642100951cc0400ea684485dfb4 Mon Sep 17 00:00:00 2001 From: s2quake Date: Fri, 25 Oct 2024 15:01:52 +0900 Subject: [PATCH] refactor: Refactor GasTracer --- src/Libplanet.Action/ActionContext.cs | 6 ++++++ src/Libplanet.Action/ActionEvaluator.cs | 6 ++---- src/Libplanet.Action/GasMeter.cs | 19 +++++++++++++++---- src/Libplanet.Action/GasTracer.cs | 21 +++++++++++++-------- src/Libplanet.Action/IActionContext.cs | 3 +++ 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/Libplanet.Action/ActionContext.cs b/src/Libplanet.Action/ActionContext.cs index 5c74bc49b3..004134cc2c 100644 --- a/src/Libplanet.Action/ActionContext.cs +++ b/src/Libplanet.Action/ActionContext.cs @@ -25,6 +25,7 @@ public ActionContext( int randomSeed, bool isPolicyAction, FungibleAssetValue? maxGasPrice, + long? gasLimit = null, IReadOnlyList? txs = null, IReadOnlyList? evidence = null) { @@ -38,6 +39,7 @@ public ActionContext( RandomSeed = randomSeed; IsPolicyAction = isPolicyAction; MaxGasPrice = maxGasPrice; + GasLimit = gasLimit; _txs = txs ?? ImmutableList.Empty; Evidence = evidence ?? ImmutableList.Empty; } @@ -73,6 +75,10 @@ public ActionContext( [Pure] public FungibleAssetValue? MaxGasPrice { get; } + /// + [Pure] + public long? GasLimit { get; } + /// public IReadOnlyList Txs => IsPolicyAction ? _txs diff --git a/src/Libplanet.Action/ActionEvaluator.cs b/src/Libplanet.Action/ActionEvaluator.cs index c95607613d..219f08afb6 100644 --- a/src/Libplanet.Action/ActionEvaluator.cs +++ b/src/Libplanet.Action/ActionEvaluator.cs @@ -221,6 +221,7 @@ IActionContext CreateActionContext( isPolicyAction: isPolicyAction, randomSeed: randomSeed, maxGasPrice: tx?.MaxGasPrice, + gasLimit: tx?.GasLimit, evidence: block.Evidence); } @@ -285,6 +286,7 @@ IActionContext CreateActionContext(IWorld newPrevState) randomSeed: inputContext.RandomSeed, isPolicyAction: isPolicyAction, maxGasPrice: tx?.MaxGasPrice, + gasLimit: tx?.GasLimit, txs: inputContext.Txs, evidence: inputContext.Evidence); } @@ -470,8 +472,6 @@ internal IEnumerable EvaluateTx( ITransaction tx, IWorld previousState) { - GasTracer.Initialize(tx.GasLimit ?? long.MaxValue); - GasTracer.StartTrace(); var evaluations = ImmutableList.Empty; if (_policyActionsRegistry.BeginTxActions.Length > 0) { @@ -500,8 +500,6 @@ internal IEnumerable EvaluateTx( EvaluatePolicyEndTxActions(block, tx, previousState)); } - GasTracer.EndTrace(); - return evaluations; } diff --git a/src/Libplanet.Action/GasMeter.cs b/src/Libplanet.Action/GasMeter.cs index 5e06a8c59d..2b0cd5587f 100644 --- a/src/Libplanet.Action/GasMeter.cs +++ b/src/Libplanet.Action/GasMeter.cs @@ -2,13 +2,18 @@ namespace Libplanet.Action { internal class GasMeter : IGasMeter { - public GasMeter(long gasLimit, long gasUsed = 0) + public GasMeter(long gasLimit, long gasAvailable) { - SetGasLimit(gasLimit); - GasUsed = gasUsed; + if (gasLimit < 0) + { + throw new GasLimitNegativeException(); + } + + GasLimit = gasLimit; + GasAvailable = gasAvailable; } - public long GasAvailable => GasLimit - GasUsed; + public long GasAvailable { get; private set; } public long GasLimit { get; private set; } @@ -37,6 +42,12 @@ public void UseGas(long gas) throw new GasLimitExceededException(GasLimit, newGasUsed); } + if (newGasUsed > GasAvailable) + { + GasUsed = GasAvailable; + throw new GasLimitExceededException(GasLimit, newGasUsed); + } + GasUsed = newGasUsed; } diff --git a/src/Libplanet.Action/GasTracer.cs b/src/Libplanet.Action/GasTracer.cs index 3a5ce0ce7a..ccad719ff7 100644 --- a/src/Libplanet.Action/GasTracer.cs +++ b/src/Libplanet.Action/GasTracer.cs @@ -44,20 +44,25 @@ public static void UseGas(long gas) } } - internal static void Initialize(long gasLimit) - { - GasMeter.Value = new GasMeter(gasLimit); - IsTrace.Value = false; - } - - internal static void StartTrace() + public static void Initialize(long gasLimit, long availableGasLimit) { + GasMeter.Value = new GasMeter(gasLimit, availableGasLimit); IsTrace.Value = true; } - internal static void EndTrace() + public static void Release() { IsTrace.Value = false; } + + // internal static void StartTrace() + // { + // IsTrace.Value = true; + // } + + // internal static void EndTrace() + // { + // IsTrace.Value = false; + // } } } diff --git a/src/Libplanet.Action/IActionContext.cs b/src/Libplanet.Action/IActionContext.cs index 2d4a06da32..546ed630dd 100644 --- a/src/Libplanet.Action/IActionContext.cs +++ b/src/Libplanet.Action/IActionContext.cs @@ -99,6 +99,9 @@ public interface IActionContext [Pure] FungibleAssetValue? MaxGasPrice { get; } + [Pure] + long? GasLimit { get; } + /// /// A list of s that are included in a as /// the to be evaluated. This information is provided only if