contract creation and contract call cleanup

This commit is contained in:
andri lim 2019-02-28 11:31:25 +07:00 committed by zah
parent fc613b33df
commit 0518802690
3 changed files with 16 additions and 31 deletions

View File

@ -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

View File

@ -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.}=

View File

@ -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) =