【问题标题】:How Ethereum logs feature indexes the event topics?以太坊日志功能如何索引事件主题?
【发布时间】:2022-05-11 21:43:42
【问题描述】:
当我在发出的事件中有两个索引输入时,以太坊日志会分别索引这对还是每个单独的?
我的意思是,如果我想使用两个主题过滤事件日志,那么直接从该对的索引中获取信息,或者首先计算两个主题结果的交集?
例子:
event MyEvent(address indexed account, uint256 indexed selectedNumber);
当我想按 account 和 selectedNumber 过滤时,那么该对的事件已经被索引并直接返回,或者节点必须首先获取 account 的索引事件,第二个是 selectedNumber 的事件,然后与结果相交?
我很想知道他们是否在优化存储或查询速度。
【问题讨论】:
标签:
logging
indexing
ethereum
solidity
evm
【解决方案1】:
索引主题的数量“仅”指定将在结果数组中存储多少项目。
- 第一项始终是事件签名。扁平事件声明字符串的 keccak256 哈希,在您的情况下为
MyEvent(address,uint256)。
- 最多可跟踪 3 个索引主题(ABI 编码),每个主题都是数组的一项。
- 最后一项连接所有未索引的主题(再次 ABI 编码)。
结果数组的存储、过滤和检索的具体方式取决于每个节点客户端软件。
This answer 描述了它们是如何存储在go-ethereum(目前最常用的客户端软件)中的。据我了解,节点可用的所有事件日志都存储在某种哈希图中,其中键是事件日志主题,值是 Log 类型的项目。我假设以某种方式可以在键级别进行过滤,而不必一直遍历所有值,但这是我知识的边缘,所以我不确定它是如何工作的。