diff --git a/test/t8n/t8n.cpp b/test/t8n/t8n.cpp index dba2f578ca..091e5475f6 100644 --- a/test/t8n/t8n.cpp +++ b/test/t8n/t8n.cpp @@ -103,11 +103,24 @@ int main(int argc, const char* argv[]) tx.chain_id = chain_id; auto res = state::transition(state, block, tx, rev, vm); + + const auto tx_computed_hash = keccak256(rlp::encode(tx)); + + if (j_txs[i].contains("hash") && j_txs[i]["hash"].is_string()) + { + const auto tx_loaded_hash_opt = + evmc::from_hex(j_txs[i]["hash"].get()); + + if (tx_loaded_hash_opt.has_value() && + tx_loaded_hash_opt.value() != tx_computed_hash) + throw std::logic_error("hash mismatch"); + } + if (holds_alternative(res)) { const auto ec = std::get(res); json::json j_rejected_tx; - j_rejected_tx["hash"] = j_txs[i]["hash"]; + j_rejected_tx["hash"] = hex0x(tx_computed_hash); j_rejected_tx["index"] = i; j_rejected_tx["error"] = ec.message(); j_result["rejected"].push_back(j_rejected_tx); @@ -120,7 +133,8 @@ int main(int argc, const char* argv[]) txs_logs.insert(txs_logs.end(), tx_logs.begin(), tx_logs.end()); auto& j_receipt = j_result["receipts"][j_result["receipts"].size()]; - j_receipt["transactionHash"] = j_txs[i]["hash"]; + + j_receipt["transactionHash"] = hex0x(tx_computed_hash); j_receipt["gasUsed"] = hex0x(static_cast(receipt.gas_used)); j_receipt["cumulativeGasUsed"] = j_receipt["gasUsed"]; @@ -165,9 +179,10 @@ int main(int argc, const char* argv[]) std::ofstream{output_dir / output_alloc_file} << j_alloc; } - catch (...) + catch (const std::exception& e) { - std::cerr << "Unhandled exception" << std::endl; + std::cerr << e.what() << std::endl; + return 1; } return 0;