simplifies computation.getFork
This commit is contained in:
parent
8244418965
commit
79df931234
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue