Смарт-контракты Ethereum прекрасны и позволяют создавать настоящие DApps (распределенные приложения). Неизбежно вашему приложению потребуется взаимодействовать с API «реального мира». Это может быть отправка электронного письма, запрос дополнительных данных или сигнал для начала дополнительной обработки. Давайте посмотрим, как заставить смарт-контракты Ethereum взаимодействовать с офчейн-сервисами.

Обзор

DApp для Ethereum, скорее всего, будет написан на Solidity. Если вам нужно больше усилий при разработке, вы можете использовать экспериментальный язык Vyper. Короче говоря, вы заставляете смарт-контракты генерировать События во время обработки вашей транзакции. Как только транзакция добыта, данные события становятся доступными для чтения. На изображении ниже вы можете видеть, что ваш DApp генерирует события, которые можно получить из любой службы, также известной как ваш API.

Есть два способа получить данные о событии.

Вариант 1. Используйте getTransactionReceipt

Вариант 2. Зарегистрируйте слушателя для события

Вы можете использовать вариант 1 для получения данных о событии, но, к сожалению, это становится проблематичным, поскольку квитанция пуста, пока блок не будет добыт. Вы можете опросить, но это становится трудным. Кроме того, в зависимости от сетевого трафика и установленного gasPrice, транзакция может не добываться в течение некоторого времени.

Я думаю, что лучшим решением является вариант 2, когда вы регистрируете прослушиватель событий для определенного события. Этим легче управлять, потому что если вы не используете много событий Solidity. Который использует газ, поэтому старайтесь, чтобы его не было слишком много.

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

События Solidity

Создание событий в твердом состоянии требует двух шагов: определение события, создание события.

Обратите внимание, как событие Transfer было создано в строке 5, а затем использовано внутри функции transfer, где оно испускает событие Transfer (строка 10). Пример немного надуманный, но показывает, как использовать событие. Если бы мы вызывали функцию transfer с помощью 0x123 и отправляли 1 эфир с нашего адреса 0x4444, событие запускало событие Transfer и должно было вернуть [0x4444, 0x123, BigNumber (1 эфир)].

Большой! Теперь вы можете отправлять события из Solidity!

Прослушивание событий

Ethereum реализует их спецификацию JSON RPC, но любой может реализовать свою собственную библиотеку на своем языке по своему выбору. Мы собираемся использовать Truffle и необработанный web3 Javascript API. Общий процесс прослушивания событий выглядит следующим образом:

  1. Загрузить артефакт контракта
  2. Настройте web3 и / или трюфель с провайдером
  3. Определить networkId
  4. Получите правильный адрес контракта из артефакта контракта
  5. Получите экземпляр контракта javascript
  6. вызов contractInstace.NAME_OF_EVENT с необязательными конфигами
  7. Слушайте события!

Ниже у нас есть 3 образца, которые используют Truffle, Web3 до 1.0 beta и Web3 после 1.0 beta.

Truffle API

Truffle - это хорошая оболочка для web3, которая предоставляет несколько удобных функций, облегчающих жизнь. Взгляните на следующий пример кода:

Первые 9 строк требуют нескольких модулей и настройки трюфеля и web3 для взаимодействия с правильной сетью. Строки 12–19 предназначены для того, чтобы заставить его работать с web3, и их можно игнорировать. Работа начинается в строке 21 с contract.deployed(). Это прекрасная вспомогательная функция трюфеля, которая выбирает правильный адрес контракта из артефакта, который создается и сохраняется в ./build/contracts. Когда возвращается contractInstance (строка 23), мы создаем событие, вызывая contractInstance.NAME_OF_EVENT. Существуют и другие варианты, которые можно найти здесь. Я выбрал из блока 0, потому что это наш собственный testrpc. Для ваших контрактов было бы лучше выбрать номер блока ближе к тому моменту, когда контракт был создан.

Raw Web3 (0.20.4 и ниже)

Для этого второго примера мы будем напрямую использовать Web3. За исключением взлома в предыдущем примере, поток кода аналогичен.

Большая разница в строках 9–12, где мы вручную получаем правильную сеть из артефакта. У нас нет красивой функции трюфеля .deployed, чтобы сделать этот шаг. Теперь мы делаем то же самое, что и раньше в примере с трюфелем, и создаем событие, вызывая contract.NAME_OF_EVENT. В этой версии я не ставил номер блока, но вы можете передать то же самое, что и версия с трюфелем.

Raw Web3 1.0.0 бета

Web3 действительно вносит большое количество изменений в API. Одно большое изменение заключается в том, что мы должны использовать webSockProvider для регистрации событий вместо httpProvider.

Кроме того, обновлено получение networkId. Но процесс тот же. Мы берем networkId с web3.eth.net.getId(), а затем выбираем правильный адрес контракта из Артефакта. Инициализация контракта теперь представляет собой конструктор класса с заглавной C в web3.eth.Contract. Затем, наконец, мы создаем прослушиватель событий. Теперь мы должны сами обработать события «данные», «изменено» и «ошибка». Раньше он был обернут функцией watch из предыдущих двух примеров.

Руководство

Просмотр приведенных выше примеров кода должен помочь вам начать работу с собственными сервисами. Если нет, то я также создал репо, где вы можете протестировать код самостоятельно! Просто нажмите здесь и следуйте примерам. Это производная от примеров обучающего токена.

Заключение

Вы должны понимать, как подключить свои офчейн-сервисы к ончейн-событиям. Это означает, что теперь вы можете интегрировать блокчейн в существующую инфраструктуру. Если у вас есть вопросы или комментарии, оставьте их! Вы также можете связаться со мной в твиттере https://twitter.com/angellopozo

Чтобы быть в курсе последних новостей HelloSugoi, мы приглашаем вас присоединиться к нашему списку рассылки, написать нам в Discord, подписаться на нас в Twitter @HelloSugoi и посетить наш сайт hellosugoi.com .