Создание простого бэкэнда Web 3 с использованием блокчейна Ethereum и Python

Примечание: полный код этой статьи можно найти на GitHub.

Ранее я рассказывал, как получить доступ к данным блокчейна для проектов DeFi с помощью различных централизованных API, таких как DeFi Llama, и децентрализованных API, таких как The Graph. На этот раз мы собираемся запросить блокчейн напрямую, используя библиотеку Python Web3.py.

Почему?

Web3.py - это библиотека Python, созданная для взаимодействия с блокчейном Ethereum. С его помощью мы можем создавать все виды основных функций для децентрализованных приложений. Мы можем напрямую взаимодействовать со смарт-контрактами, собирать данные о блокчейне и отправлять транзакции. Если вы не являетесь пользователем Python, существуют библиотеки для других языков, например популярные библиотеки web3.js.

В нашем терминале давайте начнем с установки нашей библиотеки Python.

pip install web3

Web3.py функционирует путем подключения к узлам в сети Ethereum как для получения данных, так и для широковещательной передачи данных в сеть. Узлы хранят данные блокчейна, поэтому мы можем запрашивать состояние блокчейна Ethereum для сбора необходимых нам данных. Получение данных - это фактически бесплатная операция для нас, поскольку единственная реальная стоимость - это хранение и вычисления, выполняемые узлами, сохраняющими эти данные.

С помощью этой библиотеки мы можем подключиться к нашему собственному узлу или существующему узлу в сети, чтобы построить то, что мы хотим. Мы могли бы развернуть локальный узел на нашей машине, но затраты на это довольно высоки; полный узел по состоянию на 21 апреля составляет около 7 ТБ данных. Вместо того, чтобы управлять собственным узлом каждый раз, когда мы хотим получить доступ к данным, мы выберемся и пойдем разумным путем, используя такую ​​службу, как Infura.

Infura - это продукт Consensys, который мы будем использовать в качестве нашего узла для подключения к блокчейну Ethereum. Многие из лучших проектов являются пользователями Infura. Позже вы сможете изучить, является ли управление собственным узлом или использование другой службы правильным вариантом для вашего варианта использования.

Для начала найдите путь в Infura и создайте новый проект. Там вы найдете идентификатор проекта.

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

Теперь, когда у вас есть подключение к сети, как насчет того, чтобы сделать несколько простых запросов?

Это было аккуратно, но очень просто. Как насчет того, чтобы копнуть глубже? Как насчет попытки имитировать функциональность такого продукта, как Zapper, который отслеживает стоимость наших токенов?

Во-первых, нам нужно проверить, какие токены хранятся в нашем адресе. Для этого мы будем взаимодействовать со смарт-контрактами для отдельных токенов. Эти контракты живут по адресам, которые выглядят как адреса нашего кошелька (внешние аккаунты), за исключением того, что это адреса контрактов. По этому адресу живет код смарт-контракта. Токены будут соответствовать стандарту ERC-20, который упрощает нашу жизнь при взаимодействии с этими контрактами.

Контракт ERC-20 по умолчанию будет иметь следующие функции ...

balanceOf - это функция, которая позволяет нам видеть, сколько токенов хранится в адресе кошелька, который мы запрашиваем.

Начнем с определения ABI. ABI или двоичный интерфейс приложения - это формат, который мы определяем для взаимодействия с контрактами. Это то, что мы используем, чтобы определить, как данные должны кодироваться / декодироваться в EVM. Помимо технических деталей, важно понимать, что это формат, который мы определяем для того, как мы будем взаимодействовать с нашим желаемым смарт-контрактом.

Затем мы предпринимаем ряд шагов, чтобы ввести адрес и вернуть количество токенов, содержащихся в выбранном нами адресе кошелька. Наш примерный адрес был для Synthetix (SNX), вы можете ввести любой адрес контракта, который вам нравится. Вы можете представить, что можете создать главный список адресов контрактов ERC-20 и перебирать его, чтобы найти, какие токены хранятся в конкретном кошельке.

Мы используем функцию Web3 toChecksumAddress (), чтобы убедиться, что наш адрес находится в формате контрольной суммы. Мы используем fromWei () для преобразования нашего значения Wei в эфир. 1 ETH - это 1E18 Wei.

Наконец, мы воспользуемся графиком, чтобы получить некоторые данные о ценах. Поскольку мы хотим, чтобы все было в цепочке для этого варианта использования, нам нужно получить ценность нашего желаемого токена в DAI, стейблкоине, которая остается относительно привязанной к доллару США.

Мы делаем пару запросов к The Graph, чтобы получить значение DAI (стабильная монета, мягко привязанная к доллару США) SNX.

Мы начинаем с получения доли ETH на SNX и умножаем ее на количество DAI на ETH, чтобы получить окончательное значение DAI на SNX.

Затем мы можем умножить наше окончательное значение DAI на количество SNX, хранящихся в нашем кошельке, чтобы найти (примерно) общую стоимость позиции в долларах США. Если это звучит сбивающе с толку, попробуйте прочитать код, и он станет более понятным. Нам пришлось проделать все эти дополнительные шаги, потому что в Uniswap нет активного пула для прямого обмена DAI на SNX. Итак, мы переходим от SNX к ETH к DAI.

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

Продолжим разговор в Твиттере.

Полный код доступен на GitHub.

Чтобы поддержать мое письмо и получить полный доступ ко всем статьям на Medium, посетите https://posey.medium.com/membership