You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取待处理交易的收据或模拟交易的日志?

获取模拟待处理交易的日志及影响的合约

直接用provider.call()拿不到日志——这个方法仅返回合约调用的返回值,不会输出执行过程中产生的日志事件。要获取模拟交易的日志,得调用以太坊节点的debug_traceCall RPC方法,通过追踪执行过程来捕获日志,进而提取受影响的合约地址。

修改后的实现代码

const init = async () => {
    wsProvider.on("pending", async (tx_hash) => {
        const getTxResponse = await provider.getTransaction(tx_hash);
        if (!getTxResponse) return;

        // 构建traceCall所需的参数
        const traceParams = {
            from: getTxResponse.from,
            to: getTxResponse.to,
            gas: getTxResponse.gasLimit?.toHexString(),
            gasPrice: getTxResponse.gasPrice?.toHexString(),
            value: getTxResponse.value?.toHexString(),
            data: getTxResponse.data,
            blockNumber: "pending" // 指定在待处理区块环境下模拟执行
        };

        try {
            // 调用debug_traceCall,用loggerTracer捕获所有日志操作
            const traceResult = await provider.send("debug_traceCall", [
                traceParams,
                { tracer: "loggerTracer" }
            ]);

            // 提取并去重受影响的合约地址
            const affectedContracts = new Set();
            traceResult?.structLogs?.forEach(log => {
                // 匹配所有日志操作指令(LOG0~LOG4)
                if (log.op.startsWith("LOG")) {
                    affectedContracts.add(log.address);
                }
            });

            console.log("受影响的合约地址:", Array.from(affectedContracts));
            console.log("模拟交易日志详情:", traceResult.structLogs);
        } catch (e) {
            // 忽略模拟失败的情况(如gas不足、合约执行报错等)
            console.log("模拟失败:", e.message);
        }
    });
};

关键说明

  • debug_traceCall依赖:需要你的以太坊节点开启Debug API(比如Geth启动时加--debug参数,或使用Alchemy/Infura等服务商的高级计划),否则无法调用该方法。
  • loggerTracer作用:这个追踪器会捕获交易执行过程中所有的日志触发操作,每条日志条目里的address字段就是触发日志的合约地址。
  • 去重处理:用Set存储合约地址,避免同一合约多次触发日志导致重复记录。

内容的提问来源于stack exchange,提问作者graygt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:52:07