contract creation and contract call cleanup
This commit is contained in:
parent
fc613b33df
commit
0518802690
|
@ -9,19 +9,18 @@ import options,
|
|||
proc contractCall*(tx: Transaction, vmState: BaseVMState, sender: EthAddress, forkOverride=none(Fork)): GasInt =
|
||||
var db = vmState.accountDb
|
||||
var computation = setupComputation(vmState, tx, sender, forkOverride)
|
||||
result = tx.gasLimit
|
||||
|
||||
if execComputation(computation):
|
||||
let
|
||||
gasRemaining = computation.gasMeter.gasRemaining
|
||||
gasRefunded = computation.getGasRefund()
|
||||
gasUsed = tx.gasLimit - gasRemaining
|
||||
gasRefund = min(gasRefunded, gasUsed div 2)
|
||||
gasRefundAmount = (gasRefund + gasRemaining).u256 * tx.gasPrice.u256
|
||||
gasRefundAmount = (gasRemaining + gasRefund).u256 * tx.gasPrice.u256
|
||||
|
||||
db.addBalance(sender, gasRefundAmount)
|
||||
return (tx.gasLimit - gasRemaining - gasRefund)
|
||||
else:
|
||||
if computation.tracingEnabled: computation.traceError()
|
||||
return tx.gasLimit
|
||||
return (gasUsed - gasRefund)
|
||||
|
||||
proc processTransaction*(tx: Transaction, sender: EthAddress, vmState: BaseVMState): GasInt =
|
||||
## Process the transaction, write the results to db.
|
||||
|
@ -53,9 +52,9 @@ proc processTransaction*(tx: Transaction, sender: EthAddress, vmState: BaseVMSta
|
|||
|
||||
# TODO: Run the vm with proper fork
|
||||
if tx.isContractCreation:
|
||||
result = applyCreateTransaction(tx, vmState, sender)
|
||||
result = tx.contractCreate(vmState, sender)
|
||||
else:
|
||||
result = contractCall(tx, vmState, sender)
|
||||
result = tx.contractCall(vmState, sender)
|
||||
|
||||
type
|
||||
# TODO: these types need to be removed
|
||||
|
|
|
@ -85,28 +85,22 @@ proc execComputation*(computation: var BaseComputation): bool =
|
|||
computation.vmState.addLogs(computation.logEntries)
|
||||
else:
|
||||
snapshot.revert()
|
||||
if computation.tracingEnabled: computation.traceError()
|
||||
|
||||
proc applyCreateTransaction*(tx: Transaction, vmState: BaseVMState, sender: EthAddress, forkOverride=none(Fork)): GasInt =
|
||||
proc contractCreate*(tx: Transaction, vmState: BaseVMState, sender: EthAddress, forkOverride=none(Fork)): GasInt =
|
||||
doAssert tx.isContractCreation
|
||||
# TODO: clean up params
|
||||
trace "Contract creation"
|
||||
|
||||
var c = setupComputation(vmState, tx, sender, forkOverride)
|
||||
result = tx.gasLimit
|
||||
|
||||
if execComputation(c):
|
||||
var db = vmState.accountDb
|
||||
|
||||
# XXX: copy/pasted from GST fixture
|
||||
# TODO: more merging/refactoring/etc
|
||||
# also a couple lines can collapse because variable used once
|
||||
# once verified in GST fixture
|
||||
let
|
||||
gasRemaining = c.gasMeter.gasRemaining
|
||||
gasRefunded = c.getGasRefund()
|
||||
gasUsed = tx.gasLimit - gasRemaining
|
||||
gasRefund = min(gasRefunded, gasUsed div 2)
|
||||
|
||||
var codeCost = 200 * c.output.len
|
||||
var codeCost = c.gasCosts[Create].m_handler(0, 0, c.output.len)
|
||||
|
||||
# This apparently is not supposed to actually consume the gas, just be able to,
|
||||
# for purposes of accounting. Py-EVM apparently does consume the gas, but it is
|
||||
|
@ -123,11 +117,8 @@ proc applyCreateTransaction*(tx: Transaction, vmState: BaseVMState, sender: EthA
|
|||
codeCost = 0
|
||||
db.setCode(contractAddress, ByteRange())
|
||||
|
||||
db.addBalance(sender, (tx.gasLimit - gasUsed - codeCost + gasRefund).u256 * tx.gasPrice.u256)
|
||||
return (gasUsed + codeCost - gasRefund)
|
||||
else:
|
||||
if c.tracingEnabled: c.traceError()
|
||||
return tx.gasLimit
|
||||
db.addBalance(sender, (gasRemaining + gasRefund - codeCost).u256 * tx.gasPrice.u256)
|
||||
return (gasUsed - gasRefund + codeCost)
|
||||
|
||||
#[
|
||||
method executeTransaction(vmState: BaseVMState, transaction: Transaction): (BaseComputation, BlockHeader) {.base.}=
|
||||
|
|
|
@ -45,15 +45,10 @@ proc testFixtureIndexes(prevStateRoot: Hash256, header: BlockHeader, pre: JsonNo
|
|||
vmState.mutateStateDB:
|
||||
db.incNonce(sender)
|
||||
db.subBalance(sender, gasCost)
|
||||
|
||||
if tx.isContractCreation and tx.payload.len > 0:
|
||||
vmState.mutateStateDB:
|
||||
let createGasUsed = applyCreateTransaction(tx, vmState, sender, some(fork))
|
||||
db.addBalance(header.coinbase, createGasUsed.u256 * tx.gasPrice.u256)
|
||||
return
|
||||
|
||||
vmState.mutateStateDB:
|
||||
let gasUsed = contractCall(tx, vmState, sender, some(fork))
|
||||
let gasUsed = if tx.isContractCreation and tx.payload.len > 0:
|
||||
tx.contractCreate(vmState, sender, some(fork))
|
||||
else:
|
||||
tx.contractCall(vmState, sender, some(fork))
|
||||
db.addBalance(header.coinbase, gasUsed.u256 * tx.gasPrice.u256)
|
||||
|
||||
proc testFixture(fixtures: JsonNode, testStatusIMPL: var TestStatus) =
|
||||
|
|
Loading…
Reference in New Issue