Initial commit for eth_estimateGas

This commit is contained in:
coffeepots 2018-11-27 18:21:28 +00:00 committed by Ștefan Talpalaru
parent ac9fb37465
commit 3f1122702e
No known key found for this signature in database
GPG Key ID: CBF7934204F1B6F9
1 changed files with 47 additions and 1 deletions

View File

@ -14,7 +14,7 @@ import
../utils/header, ../transaction, ../config, ../vm_state, ../constants, ../vm_types,
../vm_state_transactions, ../utils/addresses,
../vm/[interpreter_dispatch, computation],
rpc_types, rpc_utils, ../vm/[message, computation]
rpc_types, rpc_utils, ../vm/[message, computation, interpreter_dispatch]
#[
Note:
@ -79,6 +79,52 @@ proc binarySearchGas(vmState: var BaseVMState, transaction: Transaction, sender:
maxVal = midPoint
result = minVal
proc binarySearchGas(vmState: var BaseVMState, transaction: Transaction, sender: EthAddress, gasPrice: GasInt, tolerance = 1): GasInt =
proc dummyComputation(vmState: var BaseVMState, transaction: Transaction, sender: EthAddress): BaseComputation =
# Note that vmState may be altered
setupComputation(
vmState.blockHeader,
vmState,
transaction,
sender)
proc dummyTransaction(gasLimit, gasPrice: GasInt, destination: EthAddress, value: UInt256): Transaction =
Transaction(
accountNonce: 0.AccountNonce,
gasPrice: gasPrice,
gasLimit: gasLimit,
to: destination,
value: value
)
var
hiGas = vmState.gasLimit
loGas = transaction.intrinsicGas
gasPrice = transaction.gasPrice # TODO: Or zero?
proc tryTransaction(vmState: var BaseVMState, gasLimit: GasInt): bool =
var
spoofTransaction = dummyTransaction(gasLimit, gasPrice, transaction.to, transaction.value)
computation = vmState.dummyComputation(spoofTransaction, sender)
computation.executeOpcodes
if not computation.isError:
return true
if vmState.tryTransaction(loGas):
return loGas
if not vmState.tryTransaction(hiGas):
return 0.GasInt # TODO: Reraise error from computation
var
minVal = vmState.gasLimit
maxVal = transaction.intrinsicGas
while loGas - hiGas > tolerance:
let midPoint = (loGas + hiGas) div 2
if vmState.tryTransaction(midPoint):
minVal = midPoint
else:
maxVal = midPoint
result = minVal
proc setupEthRpc*(node: EthereumNode, chain: BaseChainDB, rpcsrv: RpcServer) =
func getAccountDb(header: BlockHeader): ReadOnlyStateDB =