safer snapshot commit revert and dispose

This commit is contained in:
andri lim 2019-02-18 18:45:18 +07:00 committed by zah
parent e1c622f83f
commit c722f34ef3
3 changed files with 12 additions and 2 deletions

View File

@ -103,9 +103,12 @@ proc revert*(snapshot: var ComputationSnapshot, burnsGas: bool = false) =
snapshot.snapshot.revert()
snapshot.computation.error = Error(info: getCurrentExceptionMsg(), burnsGas: burnsGas)
proc commit*(snapshot: var ComputationSnapshot) =
proc commit*(snapshot: var ComputationSnapshot) {.inline.} =
snapshot.snapshot.commit()
proc dispose*(snapshot: var ComputationSnapshot) {.inline.} =
snapshot.snapshot.dispose()
proc applyMessageAux(computation: var BaseComputation, opCode: static[Op]) =
if computation.msg.depth > STACK_DEPTH_LIMIT:
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]) =
var snapshot = computation.snapshot()
defer: snapshot.dispose()
try:
computation.applyMessageAux(opCode)
except VMError:
@ -197,6 +202,7 @@ proc applyCreateMessage(fork: Fork, computation: var BaseComputation, opCode: st
if contractCode.len == 0: return
var snapshot = computation.snapshot()
defer: snapshot.dispose()
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}")

View File

@ -144,7 +144,7 @@ proc snapshot*(vmState: BaseVMState): Snapshot =
result.vmState = vmState
proc revert*(s: var Snapshot) =
s.transaction.dispose()
s.transaction.rollback()
s.vmState.accountDb.rootHash = s.intermediateRoot
s.vmState.blockHeader.stateRoot = s.intermediateRoot
@ -152,6 +152,9 @@ proc commit*(s: var Snapshot) =
s.transaction.commit()
s.vmState.accountDb.rootHash = s.vmState.blockHeader.stateRoot
proc dispose*(s: var Snapshot) {.inline.} =
s.transaction.dispose()
proc getTracingResult*(vmState: BaseVMState): JsonNode =
assert(vmState.tracingEnabled)
vmState.tracer.trace

View File

@ -42,6 +42,7 @@ proc setupComputation*(vmState: BaseVMState, transaction: Transaction, sender: E
proc execComputation*(computation: var BaseComputation): bool =
var snapshot = computation.snapshot()
defer: snapshot.dispose()
try:
computation.executeOpcodes()