simplifies computation.getFork

This commit is contained in:
andri lim 2020-01-10 07:52:13 +07:00 committed by zah
parent 8244418965
commit 79df931234
9 changed files with 24 additions and 34 deletions

View File

@ -272,7 +272,7 @@ proc setupEthRpc*(node: EthereumNode, chain: BaseChainDB, rpcsrv: RpcServer) =
# TODO: Relies on pending pool implementation
discard
proc setupComputation(vmState: BaseVMState, blockNumber: BlockNumber,
proc setupComputation(vmState: BaseVMState,
value: UInt256, data: seq[byte],
sender, destination: EthAddress,
gasLimit, gasPrice: GasInt,
@ -292,7 +292,7 @@ proc setupEthRpc*(node: EthereumNode, chain: BaseChainDB, rpcsrv: RpcServer) =
data: data,
code: vmState.readOnlyStateDB.getCode(destination).toSeq
)
result = newBaseComputation(vmState, blockNumber, message)
result = newBaseComputation(vmState, message)
rpcsrv.rpc("eth_call") do(call: EthCall, quantityTag: string) -> HexDataStr:
## Executes a new message call immediately without creating a transaction on the block chain.
@ -325,7 +325,7 @@ proc setupEthRpc*(node: EthereumNode, chain: BaseChainDB, rpcsrv: RpcServer) =
destination = if call.to.isSome: call.to.get.toAddress else: ZERO_ADDRESS
data = if call.data.isSome: nimcrypto.utils.fromHex(call.data.get.string) else: @[]
value = if call.value.isSome: call.value.get else: 0.u256
comp = setupComputation(vmState, header.blockNumber, value, data, sender, destination, gasLimit, gasPrice, call.to.isNone)
comp = setupComputation(vmState, value, data, sender, destination, gasLimit, gasPrice, call.to.isNone)
comp.execComputation
result = ("0x" & nimcrypto.toHex(comp.output)).HexDataStr

View File

@ -17,7 +17,7 @@ import
logScope:
topics = "vm computation"
proc newBaseComputation*(vmState: BaseVMState, blockNumber: BlockNumber, message: Message, forkOverride=none(Fork)): BaseComputation =
proc newBaseComputation*(vmState: BaseVMState, message: Message, forkOverride=none(Fork)): BaseComputation =
new result
result.vmState = vmState
result.msg = message
@ -27,13 +27,12 @@ proc newBaseComputation*(vmState: BaseVMState, blockNumber: BlockNumber, message
result.touchedAccounts = initHashSet[EthAddress]()
result.suicides = initHashSet[EthAddress]()
result.code = newCodeStream(message.code)
# result.rawOutput = "0x"
result.gasCosts =
result.fork =
if forkOverride.isSome:
forkOverride.get.forkToSchedule
forkOverride.get
else:
blockNumber.toFork.forkToSchedule
result.forkOverride = forkOverride
vmState.blockNumber.toFork
result.gasCosts = result.fork.forkToSchedule
# a dummy/terminus continuation proc
result.nextProc = proc() =
discard
@ -92,13 +91,6 @@ proc rollback*(comp: BaseComputation) =
proc setError*(comp: BaseComputation, msg: string, burnsGas = false) {.inline.} =
comp.error = Error(info: msg, burnsGas: burnsGas)
proc getFork*(computation: BaseComputation): Fork =
result =
if computation.forkOverride.isSome:
computation.forkOverride.get
else:
computation.vmState.blockNumber.toFork
proc writeContract*(computation: BaseComputation, fork: Fork): bool {.gcsafe.} =
result = true
@ -150,7 +142,7 @@ const ripemdAddr = initAddress(3)
proc postExecuteVM(computation: BaseComputation, opCode: static[Op]) {.gcsafe.} =
when opCode == Create:
if computation.isSuccess:
let fork = computation.getFork
let fork = computation.fork
let contractFailed = not computation.writeContract(fork)
if contractFailed and fork >= FkHomestead:
computation.setError(&"writeContract failed, depth={computation.msg.depth}", true)
@ -174,10 +166,10 @@ proc applyMessage*(computation: BaseComputation, opCode: static[Op]) =
# EIP161 nonce incrementation
when opCode in {Create, Create2}:
if computation.getFork >= FkSpurious:
if computation.fork >= FkSpurious:
computation.vmState.mutateStateDb:
db.incNonce(computation.msg.contractAddress)
if computation.getFork >= FkByzantium:
if computation.fork >= FkByzantium:
# RevertInCreateInInit.json
db.setStorageRoot(computation.msg.contractAddress, emptyRlpHash)
@ -199,7 +191,7 @@ proc applyMessage*(computation: BaseComputation, opCode: static[Op]) =
executeOpcodes(computation)
proc addChildComputation*(computation: BaseComputation, child: BaseComputation) =
if child.isError or computation.getFork == FKIstanbul:
if child.isError or computation.fork == FKIstanbul:
if not child.msg.isCreate:
if child.msg.contractAddress == ripemdAddr:
child.vmState.touchedAccounts.incl child.msg.contractAddress

View File

@ -544,7 +544,7 @@ proc setupCreate(computation: BaseComputation, memPos, len: int, value: Uint256,
var
createMsgGas = computation.getGasRemaining()
if getFork(computation) >= FkTangerine:
if computation.fork >= FkTangerine:
createMsgGas -= createMsgGas div 64
# Consume gas here that will be passed to child
@ -594,9 +594,8 @@ proc setupCreate(computation: BaseComputation, memPos, len: int, value: Uint256,
result = newBaseComputation(
computation.vmState,
computation.vmState.blockNumber,
childMsg,
some(computation.getFork))
some(computation.fork))
template genCreate(callName: untyped, opCode: Op): untyped =
op callName, inline = false, val, startPosition, size:
@ -711,7 +710,7 @@ template genCall(callName: untyped, opCode: Op): untyped =
let (memInPos, memInLen, memOutPos, memOutLen) = (memoryInputStartPosition.cleanMemRef, memoryInputSize.cleanMemRef, memoryOutputStartPosition.cleanMemRef, memoryOutputSize.cleanMemRef)
let isNewAccount = if getFork(computation) >= FkSpurious:
let isNewAccount = if computation.fork >= FkSpurious:
computation.vmState.readOnlyStateDb.isDeadAccount(contractAddress)
else:
not computation.vmState.readOnlyStateDb.accountExists(contractAddress)
@ -761,9 +760,8 @@ template genCall(callName: untyped, opCode: Op): untyped =
var childComp = newBaseComputation(
computation.vmState,
computation.vmState.blockNumber,
childMsg,
some(computation.getFork))
some(computation.fork))
computation.memOutPos = memOutPos
computation.memOutLen = memOutLen

View File

@ -339,7 +339,7 @@ proc selectVM(computation: BaseComputation, fork: Fork) {.gcsafe.} =
computation.istanbulVM()
proc executeOpcodes(computation: BaseComputation) =
let fork = computation.getFork
let fork = computation.fork
block:
if computation.execPrecompiles(fork):

View File

@ -58,7 +58,7 @@ proc setupComputation*(vmState: BaseVMState, tx: Transaction, sender, recipient:
code: code
)
result = newBaseComputation(vmState, vmState.blockNumber, msg, some(fork))
result = newBaseComputation(vmState, msg, some(fork))
doAssert result.isOriginComputation
proc execComputation*(computation: var BaseComputation) =
@ -77,7 +77,7 @@ proc execComputation*(computation: var BaseComputation) =
const RefundSelfDestruct = 24_000
computation.gasMeter.refundGas(RefundSelfDestruct * suicidedCount)
if computation.getFork >= FkSpurious:
if computation.fork >= FkSpurious:
computation.collectTouchedAccounts()
computation.vmstate.status = computation.isSuccess

View File

@ -62,10 +62,10 @@ type
rawOutput*: seq[byte]
returnData*: seq[byte]
error*: Error
touchedAccounts*: HashSet[EthAddress]
touchedAccounts*: HashSet[EthAddress]
suicides*: HashSet[EthAddress]
gasCosts*: GasCosts # TODO - will be hidden at a lower layer
forkOverride*: Option[Fork]
fork*: Fork
logEntries*: seq[Log]
dbsnapshot*: Snapshot
instr*: Op

View File

@ -220,7 +220,7 @@ proc initComputation(vmState: BaseVMState, tx: Transaction, sender: EthAddress,
code: tx.payload
)
newBaseComputation(vmState, vmState.blockNumber, msg, some(fork))
newBaseComputation(vmState, msg, some(fork))
proc initDatabase*(): (Uint256, BaseChainDB) =
let

View File

@ -41,7 +41,7 @@ template doTest(fixture: JsonNode, address: byte, action: untyped): untyped =
data: data,
code: @[]
)
computation = newBaseComputation(vmState, header.blockNumber, message)
computation = newBaseComputation(vmState, message)
echo "Running ", action.astToStr, " - ", test["name"]
`action`(computation)
let c = computation.rawOutput == expected

View File

@ -59,7 +59,7 @@ proc testFixture(fixtures: JsonNode, testStatusIMPL: var TestStatus) =
code: code
)
var computation = newBaseComputation(vmState, header.blockNumber, message)
var computation = newBaseComputation(vmState, message)
computation.executeOpcodes()
if not fixture{"post"}.isNil: