From 6dd14e4f4f744189702802981b466f10332a4c9a Mon Sep 17 00:00:00 2001 From: Jamie Lokier Date: Mon, 3 May 2021 09:07:56 +0100 Subject: [PATCH] GraphQL: Move EVM-calling function makeCall to rpcMakeCall `makeCall` used by GraphQL is another way to setup and call the EVM. Move it to `transaction/call_evm`. Signed-off-by: Jamie Lokier --- nimbus/graphql/ethapi.nim | 17 ++++------------- nimbus/transaction/call_evm.nim | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/nimbus/graphql/ethapi.nim b/nimbus/graphql/ethapi.nim index f38969158..27e4e5981 100644 --- a/nimbus/graphql/ethapi.nim +++ b/nimbus/graphql/ethapi.nim @@ -746,20 +746,11 @@ proc toCallData(n: Node): (RpcCallData, bool) = (cd, gasLimit) proc makeCall(ctx: GraphqlContextRef, callData: RpcCallData, header: BlockHeader, chainDB: BaseChainDB): RespResult = - # TODO: handle revert - var - # we use current header stateRoot, unlike block validation - # which use previous block stateRoot - vmState = newBaseVMState(header.stateRoot, header, chainDB) - fork = toFork(chainDB.config, header.blockNumber) - comp = rpcSetupComputation(vmState, callData, fork) - - let gas = comp.gasMeter.gasRemaining - comp.execComputation() + let (outputHex, gasUsed, isError) = rpcMakeCall(callData, header, chainDB) var map = respMap(ctx.ids[ethCallResult]) - map["data"] = resp("0x" & comp.output.toHex) - map["gasUsed"] = longNode(gas - comp.gasMeter.gasRemaining).get() - map["status"] = longNode(if comp.isError: 0 else: 1).get() + map["data"] = resp("0x" & outputHex) + map["gasUsed"] = longNode(gasUsed).get() + map["status"] = longNode(if isError: 0 else: 1).get() ok(map) proc blockCall(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} = diff --git a/nimbus/transaction/call_evm.nim b/nimbus/transaction/call_evm.nim index ae67767b6..3756f6aca 100644 --- a/nimbus/transaction/call_evm.nim +++ b/nimbus/transaction/call_evm.nim @@ -7,7 +7,7 @@ # at your option. This file may not be copied, modified, or distributed except according to those terms. import - eth/common/eth_types, stint, options, + eth/common/eth_types, stint, options, stew/byteutils, ".."/[vm_types, vm_types2, vm_state, vm_computation], ".."/[db/db_chain, config, vm_state_transactions, rpc/hexstrings], ".."/[db/accounts_cache, p2p/executor], eth/trie/db @@ -55,6 +55,19 @@ proc rpcDoCall*(call: RpcCallData, header: BlockHeader, chain: BaseChainDB): Hex comp.execComputation() result = hexDataStr(comp.output) +proc rpcMakeCall*(call: RpcCallData, header: BlockHeader, chain: BaseChainDB): (string, GasInt, bool) = + # TODO: handle revert + var + # we use current header stateRoot, unlike block validation + # which use previous block stateRoot + vmState = newBaseVMState(header.stateRoot, header, chain) + fork = toFork(chain.config, header.blockNumber) + comp = rpcSetupComputation(vmState, call, fork) + + let gas = comp.gasMeter.gasRemaining + comp.execComputation() + return (comp.output.toHex, gas - comp.gasMeter.gasRemaining, comp.isError) + proc rpcEstimateGas*(call: RpcCallData, header: BlockHeader, chain: BaseChainDB, haveGasLimit: bool): GasInt = # TODO: handle revert and error var