75 lines
2.2 KiB
Nim
75 lines
2.2 KiB
Nim
# 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.
|
|
|
|
import
|
|
std/[json, strutils, os],
|
|
downloader,
|
|
../nimbus/tracer, prestate,
|
|
eth/common, premixcore
|
|
|
|
proc generateGethData(thisBlock: Block, blockNumber: BlockNumber, accounts: JsonNode): JsonNode =
|
|
let
|
|
receipts = toJson(thisBlock.receipts)
|
|
|
|
let geth = %{
|
|
"blockNumber": %blockNumber.toHex,
|
|
"txTraces": thisBlock.traces,
|
|
"receipts": receipts,
|
|
"block": thisBlock.jsonData,
|
|
"accounts": accounts
|
|
}
|
|
|
|
result = geth
|
|
|
|
proc printDebugInstruction(blockNumber: BlockNumber) =
|
|
var text = """
|
|
|
|
Successfully created debugging environment for block $1.
|
|
You can continue to find nimbus EVM bug by viewing premix report page `./index.html`.
|
|
After that you can try to debug that single block using `nim c -r debug block$1.json` command.
|
|
|
|
Happy bug hunting
|
|
""" % [$blockNumber]
|
|
|
|
echo text
|
|
|
|
proc main() =
|
|
if paramCount() == 0:
|
|
echo "usage: premix debugxxx.json"
|
|
quit(QuitFailure)
|
|
|
|
try:
|
|
let
|
|
nimbus = json.parseFile(paramStr(1))
|
|
blockNumberHex = nimbus["blockNumber"].getStr()
|
|
blockNumber = parseHexInt(blockNumberHex).uint64
|
|
thisBlock = requestBlock(blockNumber, {DownloadReceipts, DownloadTxTrace})
|
|
accounts = requestPostState(thisBlock)
|
|
geth = generateGethData(thisBlock, blockNumber, accounts)
|
|
parentNumber = blockNumber - 1
|
|
parentBlock = requestBlock(parentNumber)
|
|
|
|
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, parentBlock.header,
|
|
EthBlock.init(thisBlock.header, thisBlock.body))
|
|
|
|
printDebugInstruction(blockNumber)
|
|
except CatchableError:
|
|
echo getCurrentExceptionMsg()
|
|
|
|
main()
|