From f6ce963881b4f3c4c7da02e5152a26d4a90bd7c1 Mon Sep 17 00:00:00 2001 From: Shane Bammel Date: Tue, 15 Feb 2022 21:06:28 -0600 Subject: [PATCH] Track required gas for executing a transaction --- core/state_transition.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index b8b5febc9..927f2080d 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -83,9 +83,10 @@ type Message interface { // ExecutionResult includes all output after executing given evm // message no matter the execution itself is successful or not. type ExecutionResult struct { - UsedGas uint64 // Total used gas but include the refunded gas - Err error // Any error encountered during the execution(listed in core/vm/errors.go) - ReturnData []byte // Returned data from evm(function result or data supplied with revert opcode) + RequiredGas uint64 // The total gas required to run the transaction (before any state refunds) + UsedGas uint64 // Total used gas (minus any state refunds applied after the transaction) + Err error // Any error encountered during the execution(listed in core/vm/errors.go) + ReturnData []byte // Returned data from evm(function result or data supplied with revert opcode) } // Unwrap returns the internal evm error which allows us for further @@ -315,8 +316,9 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { st.state.PrepareAccessList(msg.From(), msg.To(), vm.ActivePrecompiles(rules), msg.AccessList()) } var ( - ret []byte - vmerr error // vm errors do not effect consensus and are therefore not assigned to err + ret []byte + vmerr error // vm errors do not effect consensus and are therefore not assigned to err + requiredGas uint64 ) if contractCreation { ret, _, st.gas, vmerr = st.evm.Create(sender, st.data, st.gas, st.value) @@ -326,6 +328,9 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { ret, st.gas, vmerr = st.evm.Call(sender, st.to(), st.data, st.gas, st.value) } + // capture the required gas prior to state refunds + requiredGas = st.gasUsed() + if !london { // Before EIP-3529: refunds were capped to gasUsed / 2 st.refundGas(params.RefundQuotient) @@ -345,9 +350,10 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { } return &ExecutionResult{ - UsedGas: st.gasUsed(), - Err: vmerr, - ReturnData: ret, + RequiredGas: requiredGas, + UsedGas: st.gasUsed(), + Err: vmerr, + ReturnData: ret, }, nil }