EVMC refundGas not breaching host/evm separation anymore (#2395)
This commit is contained in:
parent
0e5fd3ffc9
commit
035ef696a6
|
@ -372,9 +372,6 @@ template chainTo*(c: Computation,
|
||||||
c.continuation = nil
|
c.continuation = nil
|
||||||
after
|
after
|
||||||
|
|
||||||
func merge*(c, child: Computation) =
|
|
||||||
c.gasMeter.refundGas(child.gasMeter.gasRefunded)
|
|
||||||
|
|
||||||
proc execSelfDestruct*(c: Computation, beneficiary: EthAddress) =
|
proc execSelfDestruct*(c: Computation, beneficiary: EthAddress) =
|
||||||
c.vmState.mutateStateDB:
|
c.vmState.mutateStateDB:
|
||||||
let localBalance = c.getBalance(c.msg.contractAddress)
|
let localBalance = c.getBalance(c.msg.contractAddress)
|
||||||
|
|
|
@ -162,7 +162,8 @@ when evmc_enabled:
|
||||||
? c.memory.write(p.memOutPos,
|
? c.memory.write(p.memOutPos,
|
||||||
c.returnData.toOpenArray(0, actualOutputSize - 1))
|
c.returnData.toOpenArray(0, actualOutputSize - 1))
|
||||||
|
|
||||||
c.gasMeter.returnGas(GasInt c.res.gas_left)
|
c.gasMeter.returnGas(c.res.gas_left)
|
||||||
|
c.gasMeter.refundGas(c.res.gas_refund)
|
||||||
|
|
||||||
if c.res.status_code == EVMC_SUCCESS:
|
if c.res.status_code == EVMC_SUCCESS:
|
||||||
? c.stack.top(1)
|
? c.stack.top(1)
|
||||||
|
@ -185,7 +186,7 @@ else:
|
||||||
c.gasMeter.returnGas(child.gasMeter.gasRemaining)
|
c.gasMeter.returnGas(child.gasMeter.gasRemaining)
|
||||||
|
|
||||||
if child.isSuccess:
|
if child.isSuccess:
|
||||||
c.merge(child)
|
c.gasMeter.refundGas(child.gasMeter.gasRefunded)
|
||||||
? c.stack.top(1)
|
? c.stack.top(1)
|
||||||
|
|
||||||
c.returnData = child.output
|
c.returnData = child.output
|
||||||
|
|
|
@ -45,7 +45,8 @@ when not defined(evmc_enabled):
|
||||||
when evmc_enabled:
|
when evmc_enabled:
|
||||||
template execSubCreate(c: Computation; msg: ref nimbus_message) =
|
template execSubCreate(c: Computation; msg: ref nimbus_message) =
|
||||||
c.chainTo(msg):
|
c.chainTo(msg):
|
||||||
c.gasMeter.returnGas(GasInt c.res.gas_left)
|
c.gasMeter.returnGas(c.res.gas_left)
|
||||||
|
c.gasMeter.refundGas(c.res.gas_refund)
|
||||||
if c.res.status_code == EVMC_SUCCESS:
|
if c.res.status_code == EVMC_SUCCESS:
|
||||||
? c.stack.top(c.res.create_address)
|
? c.stack.top(c.res.create_address)
|
||||||
elif c.res.status_code == EVMC_REVERT:
|
elif c.res.status_code == EVMC_REVERT:
|
||||||
|
@ -69,7 +70,7 @@ else:
|
||||||
c.gasMeter.returnGas(child.gasMeter.gasRemaining)
|
c.gasMeter.returnGas(child.gasMeter.gasRemaining)
|
||||||
|
|
||||||
if child.isSuccess:
|
if child.isSuccess:
|
||||||
c.merge(child)
|
c.gasMeter.refundGas(child.gasMeter.gasRefunded)
|
||||||
? c.stack.top child.msg.contractAddress
|
? c.stack.top child.msg.contractAddress
|
||||||
elif not child.error.burnsGas: # Means return was `REVERT`.
|
elif not child.error.burnsGas: # Means return was `REVERT`.
|
||||||
# From create, only use `outputData` if child returned with `REVERT`.
|
# From create, only use `outputData` if child returned with `REVERT`.
|
||||||
|
|
|
@ -62,8 +62,8 @@ proc evmcExecute(vm: ptr evmc_vm, hostInterface: ptr evmc_host_interface,
|
||||||
status_code: c.evmcStatus,
|
status_code: c.evmcStatus,
|
||||||
# Gas left is required to be zero when not `EVMC_SUCCESS` or `EVMC_REVERT`.
|
# Gas left is required to be zero when not `EVMC_SUCCESS` or `EVMC_REVERT`.
|
||||||
gas_left: if result.status_code notin {EVMC_SUCCESS, EVMC_REVERT}: 0'i64
|
gas_left: if result.status_code notin {EVMC_SUCCESS, EVMC_REVERT}: 0'i64
|
||||||
else: c.gasMeter.gasRemaining.int64,
|
else: c.gasMeter.gasRemaining,
|
||||||
gas_refund: if result.status_code == EVMC_SUCCESS: c.gasMeter.gasRefunded.int64
|
gas_refund: if result.status_code == EVMC_SUCCESS: c.gasMeter.gasRefunded
|
||||||
else: 0'i64,
|
else: 0'i64,
|
||||||
output_data: output_data,
|
output_data: output_data,
|
||||||
output_size: output_size.csize_t,
|
output_size: output_size.csize_t,
|
||||||
|
|
|
@ -42,7 +42,7 @@ proc afterExecCreateEvmcNested(host: TransactionHost, child: Computation,
|
||||||
res.gas_left = child.gasMeter.gasRemaining
|
res.gas_left = child.gasMeter.gasRemaining
|
||||||
|
|
||||||
if child.isSuccess:
|
if child.isSuccess:
|
||||||
host.computation.merge(child)
|
res.gas_refund = child.gasMeter.gasRefunded
|
||||||
res.status_code = EVMC_SUCCESS
|
res.status_code = EVMC_SUCCESS
|
||||||
res.create_address = child.msg.contractAddress.toEvmc
|
res.create_address = child.msg.contractAddress.toEvmc
|
||||||
else:
|
else:
|
||||||
|
@ -78,7 +78,7 @@ proc afterExecCallEvmcNested(host: TransactionHost, child: Computation,
|
||||||
res.gas_left = child.gasMeter.gasRemaining
|
res.gas_left = child.gasMeter.gasRemaining
|
||||||
|
|
||||||
if child.isSuccess:
|
if child.isSuccess:
|
||||||
host.computation.merge(child)
|
res.gas_refund = child.gasMeter.gasRefunded
|
||||||
res.status_code = EVMC_SUCCESS
|
res.status_code = EVMC_SUCCESS
|
||||||
else:
|
else:
|
||||||
res.status_code = child.evmcStatus
|
res.status_code = child.evmcStatus
|
||||||
|
|
Loading…
Reference in New Issue