mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-10 20:36:31 +00:00
baf508f6ae
previously, every time the VMState was created, it will also create new stateDB, and this action will nullify the advantages of cached accounts. the new changes will conserve the accounts cache if the executed blocks are contiguous. if not the stateDB need to be reinited. this changes also allow rpcCallEvm and rpcEstimateGas executed properly using current stateDB instead of creating new one each time they are called.
65 lines
1.9 KiB
Nim
65 lines
1.9 KiB
Nim
import
|
|
json, os, stint, eth/trie/db, stew/byteutils, eth/common,
|
|
../nimbus/db/[db_chain], chronicles, ../nimbus/vm_state,
|
|
../nimbus/p2p/executor, premixcore, prestate, ../nimbus/tracer
|
|
|
|
proc prepareBlockEnv(node: JsonNode, memoryDB: TrieDatabaseRef) =
|
|
let state = node["state"]
|
|
|
|
for k, v in state:
|
|
let key = hexToSeqByte(k)
|
|
let value = hexToSeqByte(v.getStr())
|
|
memoryDB.put(key, value)
|
|
|
|
proc executeBlock(blockEnv: JsonNode, memoryDB: TrieDatabaseRef, blockNumber: Uint256) =
|
|
let
|
|
parentNumber = blockNumber - 1
|
|
chainDB = newBaseChainDB(memoryDB, false)
|
|
parent = chainDB.getBlockHeader(parentNumber)
|
|
header = chainDB.getBlockHeader(blockNumber)
|
|
body = chainDB.getBlockBody(header.blockHash)
|
|
|
|
let transaction = memoryDB.beginTransaction()
|
|
defer: transaction.dispose()
|
|
|
|
chainDB.initStateDB(parent.stateRoot)
|
|
let
|
|
vmState = newBaseVMState(chainDB.stateDB, header, chainDB)
|
|
validationResult = vmState.processBlockNotPoA(header, body)
|
|
|
|
if validationResult != ValidationResult.OK:
|
|
error "block validation error", validationResult
|
|
else:
|
|
info "block validation success", validationResult, blockNumber
|
|
|
|
transaction.rollback()
|
|
dumpDebuggingMetaData(chainDB, header, body, vmState, false)
|
|
let
|
|
fileName = "debug" & $blockNumber & ".json"
|
|
nimbus = json.parseFile(fileName)
|
|
geth = blockEnv["geth"]
|
|
|
|
processNimbusData(nimbus)
|
|
|
|
# premix data goes to report page
|
|
generatePremixData(nimbus, geth)
|
|
|
|
# prestate data goes to debug tool and contains data
|
|
# needed to execute single block
|
|
generatePrestate(nimbus, geth, blockNumber, parent, header, body)
|
|
|
|
proc main() =
|
|
if paramCount() == 0:
|
|
echo "usage: debug blockxxx.json"
|
|
quit(QuitFailure)
|
|
|
|
let
|
|
blockEnv = json.parseFile(paramStr(1))
|
|
memoryDB = newMemoryDB()
|
|
blockNumber = UInt256.fromHex(blockEnv["blockNumber"].getStr())
|
|
|
|
prepareBlockEnv(blockEnv, memoryDB)
|
|
executeBlock(blockEnv, memoryDB, blockNumber)
|
|
|
|
main()
|