Как фильтровать событие 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