Как фильтровать событие Solidity по индексированной строке

У динамической индексированной строки в topic хранится хеш. Это позволяет найти заранее известное значение и влияет на декодирование результата.

Соберите фильтр по известной метке

Возьмём неанонимное событие Tagged(string indexed label,uint256 value). Первый topic — хеш сигнатуры. Для строки верхнего уровня blue второй topic равен Keccak-256 от четырёх байтов UTF-8 ниже.

blue → 0x626c7565

Передайте оба topic и адрес контракта в eth_getLogs. Поле value декодируйте из данных события как uint256. Хеширование обычной ABI-кодировки строки с длиной даст другой topic.

Учитывайте потерю исходной строки

Имея только хеш, декодер не может восстановить произвольный исходный текст. Если нужны и поиск, и отображение, контракт может записывать вторую копию строки как неиндексированное поле. Для массивов и структур существуют дополнительные правила кодирования при индексировании. docs.soliditylang.org Solidity ABI