From 79df931234517b8f795277fecff88e396c0ea236 Mon Sep 17 00:00:00 2001 From: andri lim Date: Fri, 10 Jan 2020 07:52:13 +0700 Subject: [PATCH] simplifies computation.getFork --- nimbus/rpc/p2p.nim | 6 +++--- nimbus/vm/computation.nim | 26 +++++++++----------------- nimbus/vm/interpreter/opcodes_impl.nim | 10 ++++------ nimbus/vm/interpreter_dispatch.nim | 2 +- nimbus/vm_state_transactions.nim | 4 ++-- nimbus/vm_types.nim | 4 ++-- tests/macro_assembler.nim | 2 +- tests/test_precompiles.nim | 2 +- tests/test_vm_json.nim | 2 +- 9 files changed, 24 insertions(+), 34 deletions(-) diff --git a/nimbus/rpc/p2p.nim b/nimbus/rpc/p2p.nim index 16d34dc16..701bfee2b 100644 --- a/nimbus/rpc/p2p.nim +++ b/nimbus/rpc/p2p.nim @@ -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 diff --git a/nimbus/vm/computation.nim b/nimbus/vm/computation.nim index 691d097b6..7fb318932 100644 --- a/nimbus/vm/computation.nim +++ b/nimbus/vm/computation.nim @@ -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 diff --git a/nimbus/vm/interpreter/opcodes_impl.nim b/nimbus/vm/interpreter/opcodes_impl.nim index 3cd51112d..41a339a03 100644 --- a/nimbus/vm/interpreter/opcodes_impl.nim +++ b/nimbus/vm/interpreter/opcodes_impl.nim @@ -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 diff --git a/nimbus/vm/interpreter_dispatch.nim b/nimbus/vm/interpreter_dispatch.nim index b4d74270e..afbf3c657 100644 --- a/nimbus/vm/interpreter_dispatch.nim +++ b/nimbus/vm/interpreter_dispatch.nim @@ -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): diff --git a/nimbus/vm_state_transactions.nim b/nimbus/vm_state_transactions.nim index f386211f4..a9ca2502b 100644 --- a/nimbus/vm_state_transactions.nim +++ b/nimbus/vm_state_transactions.nim @@ -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 diff --git a/nimbus/vm_types.nim b/nimbus/vm_types.nim index 941176a6f..8b203a2e4 100644 --- a/nimbus/vm_types.nim +++ b/nimbus/vm_types.nim @@ -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 diff --git a/tests/macro_assembler.nim b/tests/macro_assembler.nim index 55f2045cd..4f5af217a 100644 --- a/tests/macro_assembler.nim +++ b/tests/macro_assembler.nim @@ -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 diff --git a/tests/test_precompiles.nim b/tests/test_precompiles.nim index 742c7eca9..9c9f23cd4 100644 --- a/tests/test_precompiles.nim +++ b/tests/test_precompiles.nim @@ -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 diff --git a/tests/test_vm_json.nim b/tests/test_vm_json.nim index cc91a4fc1..4f26e3c9b 100644 --- a/tests/test_vm_json.nim +++ b/tests/test_vm_json.nim @@ -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: