2024-03-21 10:45:57 +00:00
|
|
|
# Nimbus
|
|
|
|
# Copyright (c) 2020-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.
|
|
|
|
|
2019-01-09 08:35:02 +00:00
|
|
|
import
|
2022-12-02 04:39:12 +00:00
|
|
|
std/[json, os],
|
|
|
|
stew/byteutils,
|
|
|
|
chronicles,
|
|
|
|
../nimbus/[vm_state, vm_types],
|
|
|
|
../nimbus/core/executor,
|
|
|
|
./premixcore, ./prestate,
|
|
|
|
../nimbus/tracer,
|
|
|
|
../nimbus/common/common
|
2019-01-09 08:35:02 +00:00
|
|
|
|
2023-08-04 11:10:09 +00:00
|
|
|
proc prepareBlockEnv(node: JsonNode, memoryDB: CoreDbRef) =
|
2019-01-09 08:35:02 +00:00
|
|
|
let state = node["state"]
|
|
|
|
|
|
|
|
for k, v in state:
|
|
|
|
let key = hexToSeqByte(k)
|
|
|
|
let value = hexToSeqByte(v.getStr())
|
2023-08-04 11:10:09 +00:00
|
|
|
memoryDB.kvt.put(key, value)
|
2019-01-09 08:35:02 +00:00
|
|
|
|
2023-08-04 11:10:09 +00:00
|
|
|
proc executeBlock(blockEnv: JsonNode, memoryDB: CoreDbRef, blockNumber: UInt256) =
|
2019-01-09 08:35:02 +00:00
|
|
|
let
|
|
|
|
parentNumber = blockNumber - 1
|
2022-12-02 04:39:12 +00:00
|
|
|
com = CommonRef.new(memoryDB)
|
|
|
|
parent = com.db.getBlockHeader(parentNumber)
|
|
|
|
header = com.db.getBlockHeader(blockNumber)
|
|
|
|
body = com.db.getBlockBody(header.blockHash)
|
2019-01-12 12:49:08 +00:00
|
|
|
|
2019-02-07 10:10:04 +00:00
|
|
|
let transaction = memoryDB.beginTransaction()
|
|
|
|
defer: transaction.dispose()
|
2021-10-28 09:42:39 +00:00
|
|
|
|
2019-01-12 12:49:08 +00:00
|
|
|
let
|
2022-12-02 04:39:12 +00:00
|
|
|
vmState = BaseVMState.new(parent, header, com)
|
2023-10-05 03:04:12 +00:00
|
|
|
validationResult = vmState.processBlock(header, body)
|
2019-01-12 12:49:08 +00:00
|
|
|
|
2019-02-07 10:10:04 +00:00
|
|
|
if validationResult != ValidationResult.OK:
|
2019-01-09 08:35:02 +00:00
|
|
|
error "block validation error", validationResult
|
|
|
|
else:
|
|
|
|
info "block validation success", validationResult, blockNumber
|
|
|
|
|
2019-02-22 08:22:20 +00:00
|
|
|
transaction.rollback()
|
2024-03-21 10:45:57 +00:00
|
|
|
vmState.dumpDebuggingMetaData(header, body, false)
|
2019-01-14 11:49:18 +00:00
|
|
|
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)
|
|
|
|
|
2019-01-09 08:35:02 +00:00
|
|
|
proc main() =
|
|
|
|
if paramCount() == 0:
|
|
|
|
echo "usage: debug blockxxx.json"
|
|
|
|
quit(QuitFailure)
|
|
|
|
|
|
|
|
let
|
|
|
|
blockEnv = json.parseFile(paramStr(1))
|
2024-05-13 08:00:13 +00:00
|
|
|
chainId = blockEnv["chainId"].getInt().ChainId
|
|
|
|
memoryDB = newCoreDbRef(LegacyDbMemory, chainId)
|
2019-01-09 08:35:02 +00:00
|
|
|
blockNumber = UInt256.fromHex(blockEnv["blockNumber"].getStr())
|
|
|
|
|
|
|
|
prepareBlockEnv(blockEnv, memoryDB)
|
2019-01-14 11:49:18 +00:00
|
|
|
executeBlock(blockEnv, memoryDB, blockNumber)
|
2019-01-09 08:35:02 +00:00
|
|
|
|
|
|
|
main()
|