debug_traceCall
方法执行对合约的调用并返回操作码级别的详细执行跟踪,而不在区块链上创建交易。这提供了对以太坊虚拟机(EVM)如何处理合约调用的最深层次的可视性,使其成为调试和详细分析的重要工具。
此方法模拟合约调用并在操作码级别提供详细的执行信息。
交易调用对象
交易发送地址
交易接收地址
为交易执行提供的燃气(十六进制)
以wei为单位的燃气价格(十六进制)
以wei为单位的转账值(十六进制)
合约方法调用数据(函数选择器和编码参数)
区块号(十六进制格式)或标签('latest', 'earliest', 'pending', 'safe', 'finalized')或区块哈希
跟踪选项,用于配置调试输出
设置为true禁用存储捕获
设置为true禁用内存捕获
设置为true禁用堆栈捕获
使用自定义跟踪器(可用:callTracer、prestateTracer等)
覆盖基于JavaScript跟踪的默认超时
包含详细执行信息的跟踪对象
调用期间使用的燃气
调用是否失败
调用返回的数据
结构化的EVM操作日志数组
程序计数器位置
执行的操作码
剩余燃气
此操作码的燃气成本
调用深度
EVM内存内容(如果未禁用)
EVM堆栈内容(如果未禁用)
存储变更(如果未禁用)
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"gas": 26848,
"failed": false,
"returnValue": "0x000000000000000000000000000000000000000000000000000000000001e240",
"structLogs": [
{
"pc": 0,
"op": "PUSH1",
"gas": 190129,
"gasCost": 3,
"depth": 1,
"stack": [],
"memory": [],
"storage": {}
},
{
"pc": 2,
"op": "MSTORE",
"gas": 190126,
"gasCost": 12,
"depth": 1,
"stack": ["0x60", "0x40"],
"memory": [
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000"
],
"storage": {}
}
// ... 更多操作
]
}
}
callTracer生成执行期间所有调用的层次表示:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"type": "CALL",
"from": "0xd7dad5d1413e8c08f2d92d5bd905bed62d9e2400",
"to": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"value": "0x0",
"gas": "0x2cb9e",
"gasUsed": "0x68c5",
"input": "0x70a08231000000000000000000000000d7dad5d1413e8c08f2d92d5bd905bed62d9e2400",
"output": "0x000000000000000000000000000000000000000000000000000000000001e240",
"calls": [
{
"type": "STATICCALL",
"from": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"to": "0x000000000000000000000000000000000000000a",
"gas": "0x26b2f",
"gasUsed": "0xd5",
"input": "0x1c0e9c09",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001"
}
]
}
}
Geth提供了几个内置跟踪器:
此外,您还可以使用基于JavaScript的自定义跟踪器进行专业分析。
options
参数允许您配置跟踪:
默认跟踪器返回VM中的每个操作码执行。常见的操作码包括:
structLogs
数组包含每个执行的操作码的一个条目:
disableMemory
、disableStack
或disableStorage
选项callTracer
提供更紧凑的输出,仅专注于调用结构to
地址并在data
中提供初始化字节码