Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

contract call and contract creation refactor #252

Merged
merged 12 commits into from
Feb 27, 2019
Prev Previous commit
Next Next commit
refactor sender transfer
  • Loading branch information
jangko committed Feb 27, 2019
commit ff25a3d8644bbde548a4e999cbd890ed178cc0fe
24 changes: 4 additions & 20 deletions nimbus/p2p/executor.nim
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,7 @@ import options,
../vm/interpreter/vm_forks

proc contractCall(tx: Transaction, vmState: BaseVMState, sender: EthAddress, forkOverride=none(Fork)): GasInt =
# TODO: this function body was copied from GST with it's comments and TODOs.
# Right now it's main purpose is to produce VM tracing when syncing block with
# contract call. At later stage, this proc together with applyCreateTransaction
# and processTransaction need to be restructured.

# TODO: replace with cachingDb or similar approach; necessary
# when calls/subcalls/etc come in, too.
var db = vmState.accountDb
let storageRoot = db.getStorageRoot(tx.to)

var computation = setupComputation(vmState, tx, sender, forkOverride)
if execComputation(computation):
let
Expand All @@ -27,11 +18,8 @@ proc contractCall(tx: Transaction, vmState: BaseVMState, sender: EthAddress, for
gasRefundAmount = (gasRefund + gasRemaining).u256 * tx.gasPrice.u256

db.addBalance(sender, gasRefundAmount)

return (tx.gasLimit - gasRemaining - gasRefund)
else:
db.addBalance(sender, tx.value)
db.setStorageRoot(tx.to, storageRoot)
if computation.tracingEnabled: computation.traceError()
vmState.clearLogs()
return tx.gasLimit
Expand Down Expand Up @@ -68,7 +56,7 @@ proc processTransaction*(t: Transaction, sender: EthAddress, vmState: BaseVMStat
balance -= upfrontGasCost
transactionFailed = true
else:
balance -= upfrontCost
balance -= upfrontGasCost

db.setBalance(sender, balance)
if transactionFailed:
Expand All @@ -89,7 +77,7 @@ proc processTransaction*(t: Transaction, sender: EthAddress, vmState: BaseVMStat
if code.len == 0 and not isPrecompiles(t.to):
# Value transfer
trace "Transfer", value = t.value, sender, to = t.to

db.subBalance(sender, t.value)
db.addBalance(t.to, t.value)
else:
# Contract call
Expand All @@ -99,13 +87,9 @@ proc processTransaction*(t: Transaction, sender: EthAddress, vmState: BaseVMStat
# TODO: Run the vm with proper fork
return contractCall(t, vmState, sender)

if gasUsed > t.gasLimit:
gasUsed = t.gasLimit

if gasUsed > t.gasLimit: gasUsed = t.gasLimit
var refund = (t.gasLimit - gasUsed).u256 * t.gasPrice.u256
if transactionFailed:
refund += t.value

if transactionFailed: refund += t.value
db.addBalance(sender, refund)
return gasUsed

Expand Down
9 changes: 2 additions & 7 deletions nimbus/vm_state_transactions.nim
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ proc execComputation*(computation: var BaseComputation): bool =
defer: snapshot.dispose()

computation.vmState.mutateStateDB:
db.subBalance(computation.msg.origin, computation.msg.value)
db.addBalance(computation.msg.storageAddress, computation.msg.value)

try:
Expand Down Expand Up @@ -124,13 +125,7 @@ proc applyCreateTransaction*(tx: Transaction, vmState: BaseVMState, sender: EthA
db.addBalance(sender, (tx.gasLimit - gasUsed - codeCost + gasRefund).u256 * tx.gasPrice.u256)
return (gasUsed + codeCost - gasRefund)
else:
# FIXME: don't do this revert, but rather only subBalance correctly
# the if transactionfailed at end is what is supposed to pick it up
# especially when it's cross-function, it's ugly/fragile
var db = vmState.accountDb
db.addBalance(sender, tx.value)
if c.tracingEnabled:
c.traceError()
if c.tracingEnabled: c.traceError()
vmState.clearLogs()
return tx.gasLimit

Expand Down
5 changes: 1 addition & 4 deletions tests/test_generalstate_json.nim
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ proc testFixtureIndexes(prevStateRoot: Hash256, header: BlockHeader, pre: JsonNo
let gasCost = transaction.gasLimit.u256 * transaction.gasPrice.u256
vmState.mutateStateDB:
db.incNonce(sender)
db.subBalance(sender, transaction.value + gasCost)
db.subBalance(sender, gasCost)

if transaction.isContractCreation and transaction.payload.len > 0:
vmState.mutateStateDB:
Expand Down Expand Up @@ -83,9 +83,6 @@ proc testFixtureIndexes(prevStateRoot: Hash256, header: BlockHeader, pre: JsonNo
# TODO: only here does one commit, with some nuance/caveat
else:
vmState.mutateStateDB:
# XXX: the coinbase has to be committed; the rest are basically reverts
db.addBalance(sender, transaction.value)
db.setStorageRoot(transaction.to, storageRoot)
db.addBalance(header.coinbase, gasCost)

proc testFixture(fixtures: JsonNode, testStatusIMPL: var TestStatus) =
Expand Down