待确认的以太坊交易日志在确认后消失

问题描述

当我使用“eth_getLogs”查询待处理事务的日志时,日志信息显示如下,但在确认交易后,etherescan 上没有日志。这个 tx 使用了委托调用。谁能告诉我为什么日志消失了?

在 tx 挂起时通过查询 ""eth_getLogs"" 记录信息:

  topics: [
    '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef','0x0000000000000000000000006463bd6026a2e7bfab5851b62969a92f7cca0eb6','0x000000000000000000000000860bd2dba9cd475a61e6d1b45e16c365f6d78f66'
  ],data: '0x00000000000000000000000000000000000000000000058677bb9e53cb507ddd',blockNumber: '0xb117d6',transactionHash: '0x9b51d7093c4507fa96af3fd4418c508700cb9f69f3cea9d7f5a192afa30cd1bf',transactionIndex: '0x41',blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000',logIndex: '0x4f',removed: false
}

确认后在etherscan上的交易:https://etherscan.io/tx/0x9b51d7093c4507fa96af3fd4418c508700cb9f69f3cea9d7f5a192afa30cd1bf

解决方法

由于交易执行的结果,包括生成的事件,取决于执行时的合约和账户状态,那么,显然,如果交易被包含在区块中,则显示的日志对应于状态0xb117d6,但是在0xb117d8的上下文中真正执行的时候,状态块/账户已经不同,导致了不同的结果。

另外,对未决交易执行的预测是基于您特定节点的数据,在分叉的情况下,该数据可能与主链的数据不同。

,

@Mad Jacal 感谢您的回答!我的理解正确吗?

假设有这样的合同:

contract test {
    bool isTrue = true;
    function foo() public {
        if (isTrue) {
            emit Event(..)
        } else {
            return;
        }
    }
    function changeToFalse() public {
        isTrue = false;
    }
}

第一个调用者调用了“foo”函数,第二个调用者调用了“changeToFalse”函数。两个交易在同一个区块中,但由于 gas 价格较高,第二个调用者的交易在第一个调用者的交易之前。如果节点还没有听到第二个调用者的 tx,挂起的日志将显示事件日志。这是你的意思吗?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...