作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 debug_traceCall 时,我得到了执行期间所有操作码和状态变化的低级 EVM 跟踪。这个太详细了。当我使用默认的 callTracer
时,我可以获得更好的调用树。但是,无论哪种方式,我似乎都无法从跟踪中提取发出的事件。我可以在跟踪中看到它们(LOG*
操作码)但是没有简单的方法将它们实际解析为“可读”的东西(连同值和原始地址)必须有一种方法来获取日志 - 有什么想法吗?
例如。这是 Etherscan 显示的 https://etherscan.io/tx-decoder?tx=0x3e3ad35fda1fddd9e154b3860b50371a1acd2fdb4f27f897e234846522bde732 (参见发出的事件部分)
最佳答案
所以我自己想到了这个 - 我为 geth 创建了一个自定义 JavaScript 跟踪器,它在第三个参数中传递给 geth 到 debug_traceCall (请参阅链接提供的 API 引用):
{
data: [],
fault: function (log) {
},
step: function (log) {
var topicCount = (log.op.toString().match(/LOG(\d)/) || [])[1];
if (topicCount) {
var res = {
address: log.contract.getAddress(),
data: log.memory.slice(parseInt(log.stack.peek(0)), parseInt(log.stack.peek(0)) + parseInt(log.stack.peek(1))),
};
for (var i = 0; i < topicCount; i++)
res['topic' + i.toString()] = log.stack.peek(i + 2);
this.data.push(res);
}
},
result: function () {
return this.data;
}
}
此跟踪器由 geth 为跟踪中的每个操作执行。它的主要作用是:
LOG0
、LOG1
、LOG2
、LOG3
或 LOG4< 之一
EVM 操作码topic0
和后续主题(如果有)将跟踪器传递给 geth 看起来像这样:
res = await ethersProvider.send('debug_traceCall', [{
from: tx.from,
to: tx.to,
gas: BigNumber.from(tx.gas)._hex.replace('0x0', '0x'),
gasPrice: BigNumber.from(tx.gasPrice)._hex.replace('0x0', '0x'),
value: BigNumber.from(tx.value)._hex.replace('0x0', '0x'),
data: tx.input
}, "latest", {
tracer: "{\n" +
" data: [],\n" +
" fault: function (log) {\n" +
" },\n" +
" step: function (log) {\n" +
" var topicCount = (log.op.toString().match(/LOG(\\d)/) || [])[1];\n" +
" if (topicCount) {\n" +
" var res = {\n" +
" address: log.contract.getAddress(),\n" +
" data: log.memory.slice(parseInt(log.stack.peek(0)), parseInt(log.stack.peek(0)) + parseInt(log.stack.peek(1))),\n" +
" };\n" +
" for (var i = 0; i < topicCount; i++)\n" +
" res['topic' + i.toString()] = log.stack.peek(i + 2);\n" +
" this.data.push(res);\n" +
" }\n" +
" },\n" +
" result: function () {\n" +
" return this.data;\n" +
" }\n" +
"}",
enableMemory: true,
enableReturnData: true,
disableStorage: true
}])
关于ethereum - 从 geth 事务跟踪 (debug_traceCall) 中提取发出的事件(日志),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72064656/
使用 debug_traceCall 时,我得到了执行期间所有操作码和状态变化的低级 EVM 跟踪。这个太详细了。当我使用默认的 callTracer 时,我可以获得更好的调用树。但是,无论哪种方式,
我是一名优秀的程序员,十分优秀!