debug_traceBlockByHash
方法返回由其哈希标识的指定区块中所有交易执行的所有操作码的完整跟踪。此方法提供对指定区块内每个交易的全面操作码级执行信息,用于分析和调试,使其成为深入研究区块链状态转换的理想工具。
此方法在操作码级别跟踪区块中所有交易的执行,通过区块哈希识别区块。
要跟踪的区块哈希
跟踪选项,用于配置调试输出
设置为true禁用存储捕获
设置为true禁用内存捕获
设置为true禁用堆栈捕获
使用自定义跟踪器(可用:callTracer、prestateTracer、4byteTracer等)
覆盖基于JavaScript跟踪的默认5秒超时
区块内交易跟踪的数组
交易使用的燃气
交易是否失败
交易的返回值
结构化的EVM操作日志数组
程序计数器位置
执行的操作码
剩余燃气
此操作的燃气成本
调用深度
EVM内存内容(如果未禁用)
EVM堆栈内容(如果未禁用)
存储变更(如果未禁用)
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"gas": 21000,
"failed": false,
"returnValue": "",
"structLogs": [
{
"pc": 0,
"op": "PUSH1",
"gas": 68232,
"gasCost": 3,
"depth": 1,
"stack": [],
"memory": [],
"storage": {}
},
{
"pc": 2,
"op": "MSTORE",
"gas": 68229,
"gasCost": 12,
"depth": 1,
"stack": ["0x60", "0x40"],
"memory": [
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000"
],
"storage": {}
}
// ... 更多操作
]
}
// 其他交易跟踪...
]
}
当使用callTracer
选项时,响应会格式化为每个交易的调用图:
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"type": "CALL",
"from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0x0",
"gas": "0x13458",
"gasUsed": "0x8fc",
"input": "0xa9059cbb0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000002b5e3af16b1880000",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
"calls": [
{
"type": "STATICCALL",
"from": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"to": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"gas": "0x8fc",
"gasUsed": "0x54b",
"input": "0x70a08231000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7",
"output": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
]
}
// 额外的调用跟踪...
]
}
Geth提供了几个内置跟踪器:
您还可以使用基于JavaScript的自定义跟踪器进行专业分析。
虽然所有三种区块跟踪方法都提供类似的信息:
debug_traceBlockByHash
接受区块哈希以精确识别区块debug_traceBlockByNumber
使用区块号或标签(例如"latest")debug_traceBlock
需要RLP编码的区块作为输入disableMemory
、disableStack
或disableStorage
选项callTracer
效率更高