Event argument indexing
event Transfer(address from, address to, uint256 amount);
События в Solidity являются своего рода абстракцией над системой логирования для Ethereum Virtual Machine. DApps могут подписываться и слушать события через RPC-интерфейс клиента Ethereum. При отправке события, параметры сохраняются в специальный журнал транзакций.
Для чего нужны Events?
1. Прослушивание событий. Необходимо для оперативного реагирования на изменения во внешнем интерфейсе.
2. Для тестирования. В тестах можно получать события со смарт-контрактов с данными транзакции и проверять их.
3. Для восстановления состояния хранилища. Все события хранятся в журнале EVM и могут быть прочитаны.
4. Создание сабграфов. Для агрегации, конвертации и упрощения чтения данных из блокчейна.
Возможны и другие области применения событий.
Чуть глубже в события
Сама запись в журнале EVM может состоять из двух частей:
- topic
- data
Topic – это 32-байтные слова, которые используются для описания того, что происходит в событии. Например, трансфер от одного адреса к другому.
Data – это закодированные данные. Например, количество токенов переданных при трансфере.
EVM предоставляет 5 opcodes для логирования событий в журнал.
LOG0, LOG1, LOG2, LOG3, LOG4
Каждый код операции (LOG0 … LOG4) служит для указания количества тем, которые необходимо включить в запись журнала. Например, LOG1 включает один topic, а LOG4 включает четыре topics. Таким образом, максимальное количество topics, которые могут быть включены в одну запись журнала, равно четырем.
Первый topic всегда является signature события с типами. Другими словами он представлен, как hash keccak(Transfer(address,address,uint256)). Таким образом для своих событий остается возможность добавить еще 3 параметра в topics.
В Solidity для того, чтобы указать, какой параметр необходимо добавить в topic используется ключевое слово indexed перед названием параметра. Например,
Transfer(address indexed from, address indexed to, uint256 value)
Получается, параметры параметры событий бывают двух типов:
1. indexed
2. non-indexed
Параметры с атрибутом indexed будут записаны в topic записи журнала EVM. Все остальные параметры автоматически становятся non-indexed и будут добавлены в специальную структуру данных(data) записи журнала EVM.
Для чего нужны indexed параметры?
Каждый indexed параметр создает topic. Этот параметр исключается из данных и не кодируется. По этому параметру можно обеспечить эффективный поиск. Для этого используются фильтры Блума.
P.S. Из цикла для приглашенных авторов.
Полную версию статьи можно почитать в репо команды MetaLamp. Добавляйте их wiki к себе в избранное и не пропускайте новые материалы.
#indexed #bloom #events
Post #901
1.04K
- 🔥 4
- ❤ 1
- 👏 1