一个挂起的以太坊交易的日志在确认后消失



当我使用"eth_getLogs";要查询挂起事务的日志,日志信息如下所示,但在确认tx后,这些日志在etherescan上不可用。此tx使用了代理调用。有人能告诉我为什么这些原木消失了吗?

通过查询"日志信息"eth_getLogs"当tx挂起时:

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";作用两个tx在同一块中,但是由于较高的汽油价格,第二个呼叫者的tx在第一个呼叫器的tx前面。如果节点还没有听说第二个调用方的tx,则挂起的日志将显示事件日志。这就是你的意思吗?