Привет друзья! Итак, вы, наконец, решили использовать возможности Solidity Events, но, вероятно, вам трудно сделать это правильно. Я знаю это, потому что сам прошел через эту борьбу. Solidity предоставляет отличный способ следить за тем, что происходит внутри смарт-контрактов с помощью событий. Ловить эти события — отдельная история, и довольно утомительная. Web3js предоставляет в своей документации различные функции, касающиеся прослушивания событий через модуль web3.eth.Contract. Оно включает:

  • один раз
  • события
  • события.allEvents
  • события.getPastEvents

Проблема

Если вы уже использовали их, вы, возможно, знаете, что невозможно прослушивать события в реальном времени с помощью предоставленных методов. Первый метод, один раз, не может использоваться для прослушивания в реальном времени по очевидным причинам. events.Myevent и events.allEvents вызовут у вас кошмар, если вы попытаетесь использовать их для прослушивания событий в реальном времени. Если вы еще не пробовали, но ознакомились с документацией, у вас может возникнуть вопрос, о котором в документации ясно сказано: просто установите для свойства fromBlock значение "latest". Вы можете подумать, что это решит вашу проблему прослушивания событий в реальном времени; по крайней мере, так я думал до того, как ломал голову над этим более двух недель. Не то чтобы это не работало; это не надежно. Иногда он прослушивает любые новые события и отвечает, а иногда они пропускаются, и никто не знает, почему? «events.getPastEvents» отлично работает, но не предназначен для прослушивания в режиме реального времени. Метод запускается один раз и извлекает все события между fromBlock и toBlock. Ладно, хватит болтовни, давайте углубимся в решение.

Решение

Решение простое. Вы можете создать таймер с фиксированным интервалом времени, который использует "events.getPastEvents" для получения новых блоков в течение каждого интервала. Хорошо, дорогой кодер, теперь иди и кодируй сам. Но ты здесь не поэтому, верно? Вы, должно быть, сами придумали это решение, но вы слишком ленивы, как я, и ищете что-то более удобное. Вот почему я здесь, чтобы направить вас к более подходящему решению.

Я искал такое решение и наткнулся на отличный модуль NPM под названием ethereum-event-processor. https://www.npmjs.com/package/ethereum-event-processor

Этот модуль решает проблему прослушивания событий Solidity в реальном времени. Спасибо его разработчикам. От разработчиков:

"По сути, он опрашивает события из предоставленных контрактов каждые X миллисекунд и выполняет соответствующий обратный вызов для этого события, передавая ему информацию о событии".

Теперь вы должны изучить его. Разработчики уже предоставили примеры для начала работы. Вскоре я сделаю учебник по настройке полного проекта NPM и прослушаю некоторые примеры событий Solidity через этот модуль с помощью web3js. До следующего раза, Adios Amigos.

Часть 2:https://dearzubi.medium.com/real-time-solidity-event-listening-with-web3js-part-2-4bcb7e5a1566

Вы ищете услуги по разработке смарт-контрактов? Свяжитесь с нами на Fiver в twityfruity или свяжитесь со мной в LinkedIn.