问题描述
当我使用“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,挂起的日志将显示事件日志。这是你的意思吗?