Где в архитектуре Ethereum хранятся журналы событий контрактов?

История событий: https://github.com/ethereum/wiki/wiki/Solidity-Features

События позволяют удобно использовать средства регистрации EVM. События являются наследуемыми членами контрактов. При их вызове аргументы сохраняются в журнале транзакций. До трех параметров могут получить индексированный атрибут, что приведет к тому, что соответствующие аргументы будут рассматриваться как разделы журнала, а не как данные. Хэш подписи события всегда является одной из тем. Все неиндексированные аргументы будут храниться в части данных журнала.

Если не внутри контейнера смарт-контракта, где находятся данные журнала?

Ответы (3)

Журналы являются частью квитанций транзакций. Они генерируются клиентами при выполнении транзакций и сохраняются вместе с блокчейном, чтобы их можно было получить.

Логи сами по себе не являются частью блокчейна, поскольку они не требуются для консенсуса (это просто исторические данные), однако они проверяются блокчейном, поскольку хеши квитанций транзакций хранятся внутри блоков.

Логи хранятся в одном узле? или все узлы?, только клиентская сторона?
Все узлы в настоящее время (легкие узлы, вероятно, не будут их хранить, но у них определенно будет способ их получить). Нет понятий сервер/клиент. Все узлы равны.
Если вы получаете журналы событий с одного узла, ими могут манипулировать. Как убедиться, что журналы событий верны?
Хэш журналов событий записывается в заголовке блока. Если у вас есть заголовок, вы можете просто собрать все журналы из этого блока, хэшировать их и сравнить со значением, хранящимся в заголовке. Если они совпадают, никаких манипуляций не было.
На практике, где я могу найти журналы?

Чтобы помочь с ответом @Peter, это помогает понять, что такое события и журналы. События, журналы и журналы событий обычно являются взаимозаменяемыми терминами Ethereum (в некоторых контекстах предпочтение отдается определенному термину, например, событиям в Solidity и web3.js, а также журналам, как в EVM и Yellow Paper).

События/журналы являются результатом выполнения кодов операций LOG в EVM. Они являются частью «внутренних транзакций» , которые создаются путем выполнения транзакционных данных через EVM.

Таким образом, пока у вас есть блокчейн, у вас есть все события/журналы. Для эффективности они хранятся, как описывает @Peter, но концептуально их не нужно хранить, поскольку они могут быть пересчитаны из блокчейна (который по определению состоит из всех блоков и данных транзакций).

Наконец, сокращение не влияет на события/журналы, потому что сокращение выполняется для дерева состояний, и никакие блоки не теряются.

Из официальной документации: https://solidity.readthedocs.io/en/v0.4.24/contracts.html#events

События являются наследуемыми членами контрактов. При их вызове аргументы сохраняются в журнале транзакций — специальной структуре данных в блокчейне. Эти журналы связаны с адресом контракта и будут включены в блокчейн и оставаться там до тех пор, пока доступен блок (навсегда, как в Frontier и Homestead, но это может измениться с Serenity). Данные журнала и событий недоступны из контрактов (даже из контракта, который их создал).