mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-28 04:55:33 +00:00
6dc2773957
* Normalised storage tree addressing in function prototypes detail: Argument list is always `<db> <account-path> <slot-path> ..` with both path arguments as `openArray[]` * Remove cruft * CoreDb internally Use full account paths rather than addresses * Update API logging * Use hashed account address only in prototypes why: This avoids unnecessary repeated hashing of the same account address. The burden of doing that is upon the application. In the case here, the ledger caches all kinds of stuff anyway so it is common sense to exploit that for account address hashes. caveat: Using `openArray[byte]` argument types for hashed accounts is inherently fragile. In non-release mode, a length verification `doAssert` is enabled by default. * No accPath in data record (use `AristoAccount` as `CoreDbAccount`) * Remove now unused `eAddr` field from ledger `AccountRef` type why: Is duplicate of lookup key * Avoid merging the account record/statement in the ledger twice.
60 lines
1.6 KiB
Nim
60 lines
1.6 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2018-2024 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed except
|
|
# according to those terms.
|
|
|
|
import
|
|
eth/common/eth_types,
|
|
../constants,
|
|
../db/ledger,
|
|
../transaction,
|
|
./computation,
|
|
./interpreter_dispatch,
|
|
./interpreter/gas_costs,
|
|
./message,
|
|
./state,
|
|
./types
|
|
|
|
{.push raises: [].}
|
|
|
|
proc setupTxContext*(vmState: BaseVMState,
|
|
txCtx: sink TxContext,
|
|
forkOverride=Opt.none(EVMFork)) =
|
|
## this proc will be called each time a new transaction
|
|
## is going to be executed
|
|
vmState.txCtx = system.move(txCtx)
|
|
vmState.fork =
|
|
if forkOverride.isSome:
|
|
forkOverride.get
|
|
else:
|
|
vmState.determineFork
|
|
vmState.gasCosts = vmState.fork.forkToSchedule
|
|
|
|
# Using `proc` as `incNonce()` might be `proc` in logging mode
|
|
proc preExecComputation(c: Computation) =
|
|
if not c.msg.isCreate:
|
|
c.vmState.mutateStateDB:
|
|
db.incNonce(c.msg.sender)
|
|
|
|
proc postExecComputation(c: Computation) =
|
|
if c.isSuccess:
|
|
if c.fork < FkLondon:
|
|
# EIP-3529: Reduction in refunds
|
|
c.refundSelfDestruct()
|
|
c.vmState.status = c.isSuccess
|
|
|
|
proc execComputation*(c: Computation) =
|
|
c.preExecComputation()
|
|
c.execCallOrCreate()
|
|
c.postExecComputation()
|
|
|
|
template execSysCall*(c: Computation) =
|
|
# A syscall to EVM doesn't require
|
|
# a pre or post ceremony
|
|
c.execCallOrCreate()
|