【问题标题】: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 类型的项目。我假设以某种方式可以在键级别进行过滤,而不必一直遍历所有值,但这是我知识的边缘,所以我不确定它是如何工作的。

【讨论】:

    猜你喜欢
    • 2016-08-06
    • 1970-01-01
    • 2019-12-11
    • 2022-01-20
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2018-03-15
    • 2016-02-28
    相关资源
    最近更新 更多