Привет, Хабр! Начиная знакомиться с Web3, было сложно найти в одном месте понятные примеры базовых операций на Web3Py. Например: просмотр баланса, отправка транзакций, минтинг NFT, взаимодействие с контрактами и тд. В этой статье я попытался собрать примеры, которые покрывают > 90% потребностей для разработки бэкенда для web3 приложений. Кстати, все примеры будут применимы и для Web3.js с поправкой на название методов и синтаксис.  Анонс второй части статьи, в которой речь пойдет о более продвинутых примерах с оптимизацией запросов к нодам и сокращении числа этих самых запросов, будет у меня в канале.  А здесь же рассмотрим следующие темы: Подключение к блокчейну Просмотр баланса для адреса Транзакции с нативной валютой сети Создание и отправка транзакции Статус транзакции Взаимодействие с контрактами ERC20 токены Просмотр баланса, allowance, название токена Отправка токена, выдача allowance NFT Получение цены и названия NFT Minting/покупка/выпуск NFT Все эти примеры удобно воспроизводить в jupyter-notebook. Предварительно нужно установить Web3Py и завести себе кошелёк, например, MetaMask, чтоб у вас был ваш адрес.  Подключиться к блокчейну не значит, что нужно локально выкачивать себе все данные с него, нужно всего лишь подключиться к одной из его нод (копий). Можно сделать это 3 способами с помощью специального URL к ноде: HTTP WebSocket RPC Существует отличный сервис, который собрал все бесплатные ссылки на бесплатные ноды в одном месте — chainlink.  Очевидный минус этих нод, что их используют все кому не лень. Из-за этого они не всегда выдерживают нагрузку и могут отвечать дольше нужного или не отвечать вовсе.   Если хотите свою приватную ноду за $, то стоит посмотреть на сервисы Infura и Ankr, во втором намного больше сетей.  Будем испытывать Web3 на сети Testnet Binance Smart Chain (BSC). Подключившись к ноде, можно посмотреть некоторые ее параметры: Цена газа в сети Номер текущего блока Номер сети (chain_id) В Web3 все числа измеряются в минимально возможной единице измерения, т.е. Wei. Это как если бы у нас все измерялось не в рублях, а в копейках, т.е, . Также еще распространена единица измерения Gwei, . Можно поиграться вот тут.  Код выше выбросит ошибку, т.к. адрес не является checksum адресом.  Checksum адрес отличается от не checksum только тем, что некоторые буквы в адресе будут в верхнем регистре. Checksum address нужен для того, чтобы убедиться, что адрес валиден и не содержит опечаток. Поэтому все функции в Web3Py принимают только его.  А вот уже правильный способ посмотреть баланс. В этом случае мы используем функцию Web3.toChecksumAddress для перевода адреса в checksum адрес.   Для каждой сети есть специальный сервис, называемый faucet (кран), который с определенным лимитом может пополнять ваш баланс. Вот, например, для Testnet BSC https://testnet.binance.org/faucet-smart Балансы также отдаются в Wei. Чтобы посмотреть в более привычном нам формате (ether), можно использовать встроенные в Web3Py функции перевода из одной единицы измерения в другую.  Вторым параметром в функции Web3.fromWei является система измерений, в какую нужно перевести. Не пугайтесь, что она называется ether в сети BSC, это универсальное название, не зависящее от сети. А в функции Web3.toWei второй параметр — это система измерений, из которой нужно переводить. Исполним транзакцию, которая отправляет нативную валюту сети (в нашем случае BNB) на другой адрес. Отправка транзакции состоит из 3 шагов: Создание (build) транзакции. Подпись с помощью приватного ключа. Отправка. Тут важно правильно указать параметр gas. Если поставить слишком маленький gas, то для транзакции его может просто не хватить, и она сфейлиться. В другую сторону можно ошибаться, т.к. лишний газ, не используемый в транзакции, просто не будет потрачен.  А сейчас поймём, как же посмотреть статус только что отправленной нами транзакции.  В Web3Py есть два метода получить транзакцию по txn_hash, немного отличающиеся выходными данными: get_transaction get_transaction_receipt get_transaction Возвращается много полезных параметров: в какой блок попала транзакция (blockNumber), откуда и кому отправляли, сколько отправляли, сколько газа было указано в транзакции.  Если мы попытаемся получить транзакцию в тот момент, когда она еще не смайнилась, то получим ошибку web3.exceptions.TransactionNotFound.  get_transaction_receipt Тут многие параметры повторяются, но есть и отличные от пункта 1. Например, gasUsed — сколько газа было фактически использовано в транзакции. Status является очень важным параметром. Если у него значение 1, то транзакция прошла успешно. Если 0, то транзакция была отклонена EVM.   Можно воспринимать контракт как некую программу, которая есть внутри блокчейна и которая может с ним взаимодействовать. Интерфейс взаимодействия задаётся с помощью ABI —  списка словарей, описывающих каждую функцию контракта. Функции контракта можно разделить на 2 категории: Read operations Write operations Первая категория содержит в себе функции, которые не изменяют состояния блокчейна и которые являются бесплатными для нас. Можно воспринимать их как GET запросы. Вторая категория изменяет состояние блокчейна и требует исполнения транзакций с затратами нативной валюты на газ. По аналогии это POST запросы.  "ERC" расшифровывается как “Ethereum Request for Comments”, т.е. по факту пулл реквест для улучшения сети Ethereum. А "20" — просто id этого реквеста.  ERC20 токены, например, USDT, USDC, BUSD и тд тоже являются смарт-контрактами. Все эти токены имеют единый ABI. Начнем с инициализации контракта.  Все функции можно посмотреть и в сканере.   А ниже примеры вызова Read operations (бесплатных функций) из этого контракта.  Интерфейс для вызова функций следующий:  contract.functions.<function_name>(*params).call() Остановимся тут на двух моментах.  Во-первых, нужно заметить, что в отличие от нативной валюты (BNB  в BSC, ETH  в Ethereum, MATIC в Polygon), у которых decimals=18, токены могут иметь другое значение decimals. В нашем случае у USDT это 6. Более того, decimals в разных сетях у одного и того же токена может быть разным. Например, USDC в BSC имеет decimals=18, а в Ethereum decimals=6. Во-вторых, очень важно сказать про allowance. Allowance — сколько другой контракт (some_contract_address) может потратить ваших (user_address) USDT. Например, это понадобится, когда вы захотите обменять свои токены на обменнике. Контракт, который будет совершать обмен, как раз и запросит у вас approve (разрешение), чтобы потратить ваши токены. Просят approve либо на точное количество обмениваемых вами токенов, либо на так называемый бесконечный allowance, т.е. 2^256 - 1 токенов.  Посмотрим, как же отправлять свои токены на другой адрес и как давать allowance другому контракту, т.е. сделаем Write operations. Отправка 1 USDT Даём approve другому контракту на "бесконечный" allowance. Контракт с адресом some_contract_address сможет сколько угодно (почти) тратить ваших USDT. Зачем это нужно, объяснил чуть выше.  Наконец-то добрались до темы NFT. Я вас обрадую: вы уже умеете взаимодействовать с NFT, если освоили предыдущие два пункта с read operations и write operations для токенов. Потому что NFT это те же смарт-контракты. Единственное "но" — для NFT нет единого ABI стандарта вроде ERC20_ABI, поэтому у каждой коллекции будет собственный интерфейс для взаимодействия.  В примерах с NFT переключимся на сеть Testnet Polygon и рассмотрим Battle Shroom NFT.  ABI можно найти тут, внизу страницы.   Посмотрим название NFT из контракта и сколько же она стоит.  И наконец-то сминтим/купим/выпустим себе NFT.  После завершения транзакции ваш адрес должен быть в списке владельцев.  Надеюсь, что эти примеры будут полезны новичкам в web3, а тем, кто уже крутится в этой теме, послужит шпаргалкой для copy/paste. Больше постов ищите тут.  А в комментариях напишите, что я упустил и что стоило бы добавить. Возможно, что-то из этого войдет во вторую часть 👇 UPD: а вот и она https://habr.com/ru/post/699560/ Backend разработчик