EVM call: Simplify and make consistent how to select the fork
Allow the fork to be specified consistently through an `option[Fork]` instead of varying inconsistencies depending on which call. When fork is not specified, the `BaseVMState` code picks the correct fork by default for the block number and chain. This change actually deletes code, because a number of functions (RPC etc) had redundant code to pick the fork, which always resolved to same as default. Signed-off-by: Jamie Lokier <jamie@shareable.org>
This commit is contained in:
parent
236a65d598
commit
751068a4d4
|
@ -24,11 +24,11 @@ type
|
||||||
contractCreation*: bool
|
contractCreation*: bool
|
||||||
|
|
||||||
proc rpcSetupComputation(vmState: BaseVMState, call: RpcCallData,
|
proc rpcSetupComputation(vmState: BaseVMState, call: RpcCallData,
|
||||||
fork: Fork, gasLimit: GasInt): Computation =
|
gasLimit: GasInt, forkOverride = none(Fork)): Computation =
|
||||||
vmState.setupTxContext(
|
vmState.setupTxContext(
|
||||||
origin = call.source,
|
origin = call.source,
|
||||||
gasPrice = call.gasPrice,
|
gasPrice = call.gasPrice,
|
||||||
forkOverride = some(fork)
|
forkOverride = forkOverride,
|
||||||
)
|
)
|
||||||
|
|
||||||
var msg = Message(
|
var msg = Message(
|
||||||
|
@ -55,8 +55,7 @@ proc rpcDoCall*(call: RpcCallData, header: BlockHeader, chain: BaseChainDB): Hex
|
||||||
# we use current header stateRoot, unlike block validation
|
# we use current header stateRoot, unlike block validation
|
||||||
# which use previous block stateRoot
|
# which use previous block stateRoot
|
||||||
vmState = newBaseVMState(header.stateRoot, header, chain)
|
vmState = newBaseVMState(header.stateRoot, header, chain)
|
||||||
fork = toFork(chain.config, header.blockNumber)
|
comp = rpcSetupComputation(vmState, call, call.gas)
|
||||||
comp = rpcSetupComputation(vmState, call, fork, call.gas)
|
|
||||||
|
|
||||||
comp.execComputation()
|
comp.execComputation()
|
||||||
result = hexDataStr(comp.output)
|
result = hexDataStr(comp.output)
|
||||||
|
@ -67,8 +66,7 @@ proc rpcMakeCall*(call: RpcCallData, header: BlockHeader, chain: BaseChainDB): (
|
||||||
# we use current header stateRoot, unlike block validation
|
# we use current header stateRoot, unlike block validation
|
||||||
# which use previous block stateRoot
|
# which use previous block stateRoot
|
||||||
vmState = newBaseVMState(header.stateRoot, header, chain)
|
vmState = newBaseVMState(header.stateRoot, header, chain)
|
||||||
fork = toFork(chain.config, header.blockNumber)
|
comp = rpcSetupComputation(vmState, call, call.gas)
|
||||||
comp = rpcSetupComputation(vmState, call, fork, call.gas)
|
|
||||||
|
|
||||||
let gas = comp.gasMeter.gasRemaining
|
let gas = comp.gasMeter.gasRemaining
|
||||||
comp.execComputation()
|
comp.execComputation()
|
||||||
|
@ -138,7 +136,7 @@ proc rpcEstimateGas*(call: RpcCallData, header: BlockHeader, chain: BaseChainDB,
|
||||||
rpcInitialAccessListEIP2929(call, vmState, fork)
|
rpcInitialAccessListEIP2929(call, vmState, fork)
|
||||||
|
|
||||||
# TODO: Deduction of `intrinsicGas` also differs from `rpcDoCall` and `rpcMakeCall`.
|
# TODO: Deduction of `intrinsicGas` also differs from `rpcDoCall` and `rpcMakeCall`.
|
||||||
var c = rpcSetupComputation(vmState, call, fork, gasLimit - intrinsicGas)
|
var c = rpcSetupComputation(vmState, call, gasLimit - intrinsicGas, some(fork))
|
||||||
vmState.mutateStateDB:
|
vmState.mutateStateDB:
|
||||||
db.subBalance(call.source, gasCost)
|
db.subBalance(call.source, gasCost)
|
||||||
|
|
||||||
|
@ -207,21 +205,16 @@ proc txCallEvm*(tx: Transaction, sender: EthAddress, vmState: BaseVMState, fork:
|
||||||
txRefundGas(tx, sender, c)
|
txRefundGas(tx, sender, c)
|
||||||
return tx.gasLimit - c.gasMeter.gasRemaining
|
return tx.gasLimit - c.gasMeter.gasRemaining
|
||||||
|
|
||||||
proc asmSetupComputation(tx: Transaction, sender: EthAddress, vmState: BaseVMState, data: seq[byte], forkOverride=none(Fork)): Computation =
|
proc asmSetupComputation(tx: Transaction, sender: EthAddress, vmState: BaseVMState,
|
||||||
|
data: seq[byte], forkOverride = none(Fork)): Computation =
|
||||||
doAssert tx.isContractCreation
|
doAssert tx.isContractCreation
|
||||||
|
|
||||||
let fork =
|
|
||||||
if forkOverride.isSome:
|
|
||||||
forkOverride.get
|
|
||||||
else:
|
|
||||||
vmState.chainDB.config.toFork(vmState.blockNumber)
|
|
||||||
|
|
||||||
let gasUsed = 0 #tx.payload.intrinsicGas.GasInt + gasFees[fork][GasTXCreate]
|
let gasUsed = 0 #tx.payload.intrinsicGas.GasInt + gasFees[fork][GasTXCreate]
|
||||||
|
|
||||||
vmState.setupTxContext(
|
vmState.setupTxContext(
|
||||||
origin = sender,
|
origin = sender,
|
||||||
gasPrice = tx.gasPrice,
|
gasPrice = tx.gasPrice,
|
||||||
forkOverride = some(fork)
|
forkOverride = forkOverride,
|
||||||
)
|
)
|
||||||
|
|
||||||
let contractAddress = generateAddress(sender, tx.accountNonce)
|
let contractAddress = generateAddress(sender, tx.accountNonce)
|
||||||
|
@ -241,7 +234,8 @@ proc asmSetupComputation(tx: Transaction, sender: EthAddress, vmState: BaseVMSta
|
||||||
|
|
||||||
return newComputation(vmState, msg)
|
return newComputation(vmState, msg)
|
||||||
|
|
||||||
proc asmSetupComputation(blockNumber: Uint256, chainDB: BaseChainDB, code, data: seq[byte], fork: Fork): Computation =
|
proc asmSetupComputation(blockNumber: Uint256, chainDB: BaseChainDB, code,
|
||||||
|
data: seq[byte], forkOverride = none(Fork)): Computation =
|
||||||
let
|
let
|
||||||
parentNumber = blockNumber - 1
|
parentNumber = blockNumber - 1
|
||||||
parent = chainDB.getBlockHeader(parentNumber)
|
parent = chainDB.getBlockHeader(parentNumber)
|
||||||
|
@ -256,7 +250,7 @@ proc asmSetupComputation(blockNumber: Uint256, chainDB: BaseChainDB, code, data:
|
||||||
|
|
||||||
tx.payload = code
|
tx.payload = code
|
||||||
tx.gasLimit = 500000000
|
tx.gasLimit = 500000000
|
||||||
return asmSetupComputation(tx, sender, vmState, data, some(fork))
|
return asmSetupComputation(tx, sender, vmState, data, forkOverride)
|
||||||
|
|
||||||
type
|
type
|
||||||
AsmResult* = object
|
AsmResult* = object
|
||||||
|
@ -269,7 +263,7 @@ type
|
||||||
contractAddress*: EthAddress
|
contractAddress*: EthAddress
|
||||||
|
|
||||||
proc asmCallEvm*(blockNumber: Uint256, chainDB: BaseChainDB, code, data: seq[byte], fork: Fork): AsmResult =
|
proc asmCallEvm*(blockNumber: Uint256, chainDB: BaseChainDB, code, data: seq[byte], fork: Fork): AsmResult =
|
||||||
var c = asmSetupComputation(blockNumber, chainDB, code, data, fork)
|
var c = asmSetupComputation(blockNumber, chainDB, code, data, some(fork))
|
||||||
let gas = c.gasMeter.gasRemaining
|
let gas = c.gasMeter.gasRemaining
|
||||||
c.execComputation()
|
c.execComputation()
|
||||||
|
|
||||||
|
@ -283,11 +277,12 @@ proc asmCallEvm*(blockNumber: Uint256, chainDB: BaseChainDB, code, data: seq[byt
|
||||||
result.vmState = c.vmState
|
result.vmState = c.vmState
|
||||||
result.contractAddress = c.msg.contractAddress
|
result.contractAddress = c.msg.contractAddress
|
||||||
|
|
||||||
proc fixtureSetupComputation(vmState: BaseVMState, call: RpcCallData, origin: EthAddress): Computation =
|
proc fixtureSetupComputation(vmState: BaseVMState, call: RpcCallData,
|
||||||
|
origin: EthAddress, forkOverride = none(Fork)): Computation =
|
||||||
vmState.setupTxContext(
|
vmState.setupTxContext(
|
||||||
origin = origin, # Differs from `rpcSetupComputation`
|
origin = origin, # Differs from `rpcSetupComputation`
|
||||||
gasPrice = call.gasPrice,
|
gasPrice = call.gasPrice,
|
||||||
# fork is not set.
|
forkOverride = forkOverride,
|
||||||
)
|
)
|
||||||
|
|
||||||
var msg = Message(
|
var msg = Message(
|
||||||
|
@ -312,8 +307,9 @@ type
|
||||||
vmState*: BaseVMState
|
vmState*: BaseVMState
|
||||||
logEntries*: seq[Log]
|
logEntries*: seq[Log]
|
||||||
|
|
||||||
proc fixtureCallEvm*(vmState: BaseVMState, call: RpcCallData, origin: EthAddress): FixtureResult =
|
proc fixtureCallEvm*(vmState: BaseVMState, call: RpcCallData,
|
||||||
var c = fixtureSetupComputation(vmState, call, origin)
|
origin: EthAddress, forkOverride = none(Fork)): FixtureResult =
|
||||||
|
var c = fixtureSetupComputation(vmState, call, origin, forkOverride)
|
||||||
|
|
||||||
# Next line differs from all the other EVM calls. With `execComputation`,
|
# Next line differs from all the other EVM calls. With `execComputation`,
|
||||||
# most "vm json tests" fail with either `balanceDiff` or `nonceDiff` errors.
|
# most "vm json tests" fail with either `balanceDiff` or `nonceDiff` errors.
|
||||||
|
|
Loading…
Reference in New Issue