debug_traceBlock
方法返回指定区块中所有交易执行的所有操作码的完整跟踪。此方法提供全面的低级执行信息,对于调试、安全分析和优化单个区块上下文中多个合约间的交易行为至关重要。
此方法在操作码级别跟踪区块中所有交易的执行。
要跟踪的RLP编码区块
跟踪选项,用于配置调试输出
设置为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的自定义跟踪器进行专业分析。
此方法需要RLP编码的区块作为输入:
虽然这三种方法都提供区块级交易跟踪:
debug_traceBlock
接受RLP编码的区块作为输入debug_traceBlockByNumber
接受区块号或标签(例如"latest")debug_traceBlockByHash
接受区块哈希disableMemory
、disableStack
或disableStorage
选项以获得更好的性能callTracer
效率更高