Обзор библиотеки Web3.py

27 июля 2023

Знакомство

web3.py — это библиотека Python для взаимодействия с блокчейн-сетями, построенными на базе Ethereum.

Библиотека web3.py используется для взаимодействия с децентрализованными приложениями (dapps), чтобы помочь с отправкой транзакций, взаимодействием со смарт-контрактами, чтением блочных данных и другого.

Первоначальный API был получен из Javascript API Web3.js, но с тех пор эволюционировал в соответствии с потребностями и удобствами разработчиков Python.

Установки библиотеки

Web3.py можно установить (желательно с использованием модуля virtualenv), с помощью следующей команды:

$ pip install web3

Использование библиотеки Web3

Использование библиотеки Web3.py зависит от типа подключения к узлу Ethereum. Тип подключения также называют провайдером подключения. Существует несколько способов настройки подключения. 

Провайдеры тестовых сетей

Если вы только изучаете блокчейн или делаете быстрое прототипирование, вы можете использовать провайдера тестовых сетей, eth-tester. Этот провайдер включает несколько учетных записей, предварительно заполненных тестовым эфиром, и мгновенно включает каждую транзакцию в блок. web3.py делает этот тестовый провайдер доступным через EthereumTesterProvider.

Примечание

EthereumTesterProvider требует установки дополнительных зависимостей. Установите их с помощью pip install "web3[tester]", затем импортируйте и создайте экземпляр провайдера.

Локальный провайдер

Несмотря на то, что требования к оборудованию высоки, самый безопасный способ взаимодействия с Ethereum — запустить клиент Ethereum на собственном оборудовании. Для локально запускаемых узлов соединение IPC является наиболее безопасным вариантом, но также доступны конфигурации HTTP и веб-сокетов.

Удаленные провайдеры

Самый быстрый способ взаимодействовать с блокчейном Ethereum — использовать поставщика удаленных узлов. Вы можете подключиться к удаленному узлу, указав конечную точку.

Библиоека Web3.py может помочь вам:
- читать данные блоков,
- подписывать и отправлять транзакции,
- развертывать контракты,
- взаимодействовать с контрактами,
- а также ряд других функций.

Конфигурация

После установки web3.py (через pip install web3) вам потребуется настроить конечную точку провайдера и любое промежуточное ПО, которое вы хотите использовать помимо значений по умолчанию.

Провайдеры

Провайдеры — это то, как web3.py подключается к блокчейну. Библиотека поставляется со следующими встроенными поставщиками:

  • IPCProvider для подключения к серверам JSON-RPC на основе сокетов ipc.
  • HTTPProvider для подключения к серверам JSON-RPC на основе http и https.
  • WebsocketProvider для подключения к серверам JSON-RPC на основе веб-сокетов ws и wss.
  • AsyncHTTPProviderдля подключения к серверам JSON-RPC на основе http и https.

 

ПО промежуточного слоя

Ваш экземпляр web3.py можно дополнительно настроить с помощью промежуточного программного обеспечения.

Промежуточное ПО web3.py описывается с использованием луковичной метафоры, где каждый уровень промежуточного ПО может влиять как на входящий запрос, так и на исходящий ответ от вашего провайдера.

Несколько промежуточных программ включены по умолчанию. Вы можете добавить (add, inject, replace) или отключить (remove, clear) любое из этих промежуточных программ.

Учетные записи и закрытые ключи

Закрытые ключи необходимы для подтверждения любой транзакции, совершенной от вашего имени. Способ защиты вашего ключа будет определять, как вы будете создавать и отправлять транзакции в web3.py.

Локальный узел, такой как Geth, может управлять вашими ключами вместо вас. Вы можете ссылаться на эти ключи, используя свойство web3.eth.accounts .

Размещенный узел, такой как Infura, не будет знать ваши ключи. В этом случае вам необходимо иметь свой закрытый ключ локально для подписания транзакций.

Базовый API

Класс Web3 включает ряд удобных служебных функций:

Помощники кодирования и декодирования

  • Web3.is_encodable()
  • Web3.to_bytes()
  • Web3.to_hex()
  • Web3.to_int()
  • Web3.to_json()
  • Web3.to_text()

Адресные помощники

  • Web3.is_address()
  • Web3.is_checksum_address()
  • Web3.to_checksum_address()

Преобразование валюты

  • Web3.from_wei()
  • Web3.to_wei()

Криптографическое хеширование

  • Web3.keccak()
  • Web3.solidity_keccak()

API web3.eth

Наиболее часто используемые API для взаимодействия с Ethereum можно найти в пространстве имен web3.eth

Получение данных

Просмотр остатков на счетах (get_balance), транзакций (get_transaction) и данных блоков (get_block) — одни из наиболее распространенных отправных точек в web3.py.

API

  • web3.eth.get_balance()
  • web3.eth.get_block()
  • web3.eth.get_block_transaction_count()
  • web3.eth.get_code()
  • web3.eth.get_proof()
  • web3.eth.get_storage_at()
  • web3.eth.get_transaction()
  • web3.eth.get_transaction_by_block()
  • web3.eth.get_transaction_count()
  • web3.eth.get_uncle_by_block()
  • web3.eth.get_uncle_count()

 

Отправка транзакций

Наиболее распространенные варианты использования будут удовлетворены send_transaction() или комбинацией sign_transaction() и send_raw_transaction().

Примечание

При взаимодействии со смарт-контрактом существует специальный API.

API

  • web3.eth.send_transaction()
  • web3.eth.sign_transaction()
  • web3.eth.send_raw_transaction()
  • web3.eth.replace_transaction()
  • web3.eth.modify_transaction()
  • web3.eth.wait_for_transaction_receipt()
  • web3.eth.get_transaction_receipt()
  • web3.eth.sign()
  • web3.eth.sign_typed_data()
  • web3.eth.estimate_gas()
  • web3.eth.generate_gas_price()
  • web3.eth.set_gas_price_strategy()

 

Контракты

web3.py может помочь вам развернуть, прочитать или выполнить функции развернутого контракта.

Для развертывания требуется, чтобы контракт уже был скомпилирован, а его байт-код и ABI были доступны. Этот этап компиляции можно выполнить в Remix или в одной из многих сред разработки контрактов, таких как Ape.

После создания экземпляра объекта контракта вызов метода transact() конструктор развернет экземпляр контракта:

Как только развернутый контракт загружается в объект Contract, функции этого контракта становятся доступными в пространстве functions имен:

Если вы хотите прочитать данные из контракта (или увидеть результат транзакции локально, не выполняя ее в сети), вы можете использовать метод ContractFunction.call или более лаконичный синтаксис ContractCaller

API

  • web3.eth.contract()
  • Contract.address
  • Contract.abi
  • Contract.bytecode
  • Contract.bytecode_runtime
  • Contract.functions
  • Contract.events
  • Contract.fallback
  • Contract.constructor()
  • Contract.encodeABI()
  • web3.contract.ContractFunction
  • web3.contract.ContractEvents

Журналы и фильтры

Если вы хотите реагировать на новые блоки, которые добываются, или на определенные события, генерируемые контрактом, вы можете использовать фильтры web3.py.

API

  • web3.eth.filter()
  • web3.eth.get_filter_changes()
  • web3.eth.get_filter_logs()
  • web3.eth.uninstall_filter()
  • web3.eth.get_logs()
  • Contract.events.your_event_name.create_filter()
  • Contract.events.your_event_name.build_filter()
  • Filter.get_new_entries()
  • Filter.get_all_entries()
  • Filter.format_entry()
  • Filter.is_valid_entry()

Сетевой API

Для объекта доступны некоторые основные сетевые свойства web3.net:

  • web3.net.listening
  • web3.net.peer_count
  • web3.net.version

ethPM

ethPM позволяет упаковать ваши контракты для повторного использования или использовать контракты из другого доверенного реестра.

Служба имен Ethereum (ENS)

Служба имен Ethereum (ENS) предоставляет инфраструктуру для удобочитаемых адресов. Если адрес зарегистрирован в реестре ENS, доменное имя можно использовать вместо самого адреса. Например, зарегистрированное доменное имя ethereum.eth будет преобразовано в адрес 0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe.