diff --git a/nimbus/p2p/chain.nim b/nimbus/p2p/chain.nim index dadc916d9..a837f1106 100644 --- a/nimbus/p2p/chain.nim +++ b/nimbus/p2p/chain.nim @@ -45,11 +45,13 @@ method persistBlocks*(c: Chain, headers: openarray[BlockHeader], bodies: openarr let vmState = newBaseVMState(head, c.db) let validationResult = processBlock(c.db, head, headers[i], bodies[i], vmState) - when not defined(release): + when not defined(release) and not defined(debugging_tool): if validationResult == ValidationResult.Error: dumpDebuggingMetaData(c.db, headers[i], bodies[i], vmState.receipts) - assert(validationResult == ValidationResult.OK) + if validationResult != ValidationResult.OK: + result = validationResult + return discard c.db.persistHeaderToDb(headers[i]) if c.db.getCanonicalHead().blockHash != headers[i].blockHash: diff --git a/premix/debug.nim b/premix/debug.nim new file mode 100644 index 000000000..45cd16565 --- /dev/null +++ b/premix/debug.nim @@ -0,0 +1,46 @@ +import + json, os, stint, eth_trie/db, byteutils, eth_common, + ../nimbus/db/[db_chain], ../nimbus/p2p/chain, + chronicles + +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(memoryDB: TrieDatabaseRef, blockNumber: Uint256) = + let + chainDB = newBaseChainDB(memoryDB, false) + parentNumber = blockNumber - 1 + parent = chainDB.getBlockHeader(parentNumber) + header = chainDB.getBlockHeader(blockNumber) + headerHash = header.blockHash + body = chainDB.getBlockBody(headerHash) + chain = newChain(chainDB) + headers = @[header] + bodies = @[body] + + chainDB.setHead(parent, true) + let validationResult = chain.persistBlocks(headers, bodies) + if validationResult != ValidationResult.OK: + error "block validation error", validationResult + else: + info "block validation success", validationResult, blockNumber + +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(memoryDB, blockNumber) + +main() diff --git a/premix/debug.nim.cfg b/premix/debug.nim.cfg new file mode 100644 index 000000000..a31f7504a --- /dev/null +++ b/premix/debug.nim.cfg @@ -0,0 +1 @@ +-d:debugging_tool \ No newline at end of file