mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-02-04 08:16:19 +00:00
safer snapshot commit revert and dispose
This commit is contained in:
parent
e1c622f83f
commit
c722f34ef3
@ -103,9 +103,12 @@ proc revert*(snapshot: var ComputationSnapshot, burnsGas: bool = false) =
|
|||||||
snapshot.snapshot.revert()
|
snapshot.snapshot.revert()
|
||||||
snapshot.computation.error = Error(info: getCurrentExceptionMsg(), burnsGas: burnsGas)
|
snapshot.computation.error = Error(info: getCurrentExceptionMsg(), burnsGas: burnsGas)
|
||||||
|
|
||||||
proc commit*(snapshot: var ComputationSnapshot) =
|
proc commit*(snapshot: var ComputationSnapshot) {.inline.} =
|
||||||
snapshot.snapshot.commit()
|
snapshot.snapshot.commit()
|
||||||
|
|
||||||
|
proc dispose*(snapshot: var ComputationSnapshot) {.inline.} =
|
||||||
|
snapshot.snapshot.dispose()
|
||||||
|
|
||||||
proc applyMessageAux(computation: var BaseComputation, opCode: static[Op]) =
|
proc applyMessageAux(computation: var BaseComputation, opCode: static[Op]) =
|
||||||
if computation.msg.depth > STACK_DEPTH_LIMIT:
|
if computation.msg.depth > STACK_DEPTH_LIMIT:
|
||||||
raise newException(StackDepthError, "Stack depth limit reached")
|
raise newException(StackDepthError, "Stack depth limit reached")
|
||||||
@ -171,6 +174,8 @@ proc applyMessageAux(computation: var BaseComputation, opCode: static[Op]) =
|
|||||||
|
|
||||||
proc applyMessage(computation: var BaseComputation, opCode: static[Op]) =
|
proc applyMessage(computation: var BaseComputation, opCode: static[Op]) =
|
||||||
var snapshot = computation.snapshot()
|
var snapshot = computation.snapshot()
|
||||||
|
defer: snapshot.dispose()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
computation.applyMessageAux(opCode)
|
computation.applyMessageAux(opCode)
|
||||||
except VMError:
|
except VMError:
|
||||||
@ -197,6 +202,7 @@ proc applyCreateMessage(fork: Fork, computation: var BaseComputation, opCode: st
|
|||||||
if contractCode.len == 0: return
|
if contractCode.len == 0: return
|
||||||
|
|
||||||
var snapshot = computation.snapshot()
|
var snapshot = computation.snapshot()
|
||||||
|
defer: snapshot.dispose()
|
||||||
|
|
||||||
if fork >= FkSpurious and contractCode.len >= EIP170_CODE_SIZE_LIMIT:
|
if fork >= FkSpurious and contractCode.len >= EIP170_CODE_SIZE_LIMIT:
|
||||||
raise newException(OutOfGas, &"Contract code size exceeds EIP170 limit of {EIP170_CODE_SIZE_LIMIT}. Got code of size: {contractCode.len}")
|
raise newException(OutOfGas, &"Contract code size exceeds EIP170 limit of {EIP170_CODE_SIZE_LIMIT}. Got code of size: {contractCode.len}")
|
||||||
|
@ -144,7 +144,7 @@ proc snapshot*(vmState: BaseVMState): Snapshot =
|
|||||||
result.vmState = vmState
|
result.vmState = vmState
|
||||||
|
|
||||||
proc revert*(s: var Snapshot) =
|
proc revert*(s: var Snapshot) =
|
||||||
s.transaction.dispose()
|
s.transaction.rollback()
|
||||||
s.vmState.accountDb.rootHash = s.intermediateRoot
|
s.vmState.accountDb.rootHash = s.intermediateRoot
|
||||||
s.vmState.blockHeader.stateRoot = s.intermediateRoot
|
s.vmState.blockHeader.stateRoot = s.intermediateRoot
|
||||||
|
|
||||||
@ -152,6 +152,9 @@ proc commit*(s: var Snapshot) =
|
|||||||
s.transaction.commit()
|
s.transaction.commit()
|
||||||
s.vmState.accountDb.rootHash = s.vmState.blockHeader.stateRoot
|
s.vmState.accountDb.rootHash = s.vmState.blockHeader.stateRoot
|
||||||
|
|
||||||
|
proc dispose*(s: var Snapshot) {.inline.} =
|
||||||
|
s.transaction.dispose()
|
||||||
|
|
||||||
proc getTracingResult*(vmState: BaseVMState): JsonNode =
|
proc getTracingResult*(vmState: BaseVMState): JsonNode =
|
||||||
assert(vmState.tracingEnabled)
|
assert(vmState.tracingEnabled)
|
||||||
vmState.tracer.trace
|
vmState.tracer.trace
|
||||||
|
@ -42,6 +42,7 @@ proc setupComputation*(vmState: BaseVMState, transaction: Transaction, sender: E
|
|||||||
|
|
||||||
proc execComputation*(computation: var BaseComputation): bool =
|
proc execComputation*(computation: var BaseComputation): bool =
|
||||||
var snapshot = computation.snapshot()
|
var snapshot = computation.snapshot()
|
||||||
|
defer: snapshot.dispose()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
computation.executeOpcodes()
|
computation.executeOpcodes()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user