Ethereum + Python = Brownie

от автора

Салют, дорогой криптоэнтузиаст!

Сегодня речь пойдёт о Brownie — аналоге фреймворка Truffle, который часто используется для разработки умных контрактов на Solidity, их тестирования и развёртывания (о чём можно почитать в цикле соответствующих статей здесь).

Так зачем же нужен ещё один фреймворк и в чём его ключевое отличие от Truffle?

  • Во-первых, в них используются разные языки — в то время, как Truffle опирается на JS, не все знают этот язык и не всем его комфортно использовать; в brownie же в используется Python 3.
  • Во-вторых, brownie за счёт интеграций различного софта делает разработку удобнее: тут и менеджер пакетов ethpm для умных контрактов, и ganache для развёртывания локальной тестовой цепочки, и тесты через pytest, и все версии компиляторов solc, и даже биндинги к MythX — инструменту для автоматического поиска ошибок в умных контрактах,- иначе говоря brownie предлагает инструменты для всего цикла разработки. Конечно Truffle тоже позволяет использовать все эти инструменты, однако они не встроены во фреймворк и их приходится устанавливать дополнительно.
  • В-третьих, brownie позволяет работать не только с умными контрактами на Solidity, но и на vyper — типизированном python-based для разработки умных контрактов.

Таким образом, если вы предпочитаете работать с пайтоном и хотите упростить себе разработку умных контрактов, то однозначно стоит попробовать brownie.

Что же ещё умеет brownie?
Как сказано в самом репозитории brownie — это фреймворк разработки полного цикла умных контрактов для Ethereum-based платформ, поддерживающий:

  • Несколько языков программирования умных контрактов: Solidity и Vyper.
  • Сборку контрактов.
  • Интерактивное взаимодействие с контрактами.
  • Тестирование умных контрактов с помощью pytest.
  • Скрипты для взаимодействия с умными контрактами.
  • Работу с шаблонами умных контрактов.

Рассмотрим все эти возможности и организацию проекта на brownie подробнее, для чего установим brownie себе на машину. Сделать это проще всего можно с помощью pip:

pip install eth-brownie

Теперь brownie доступен как консольная утилита.

help для brownie

brownie --help Brownie v1.6.9 - Python development framework for Ethereum  Usage:  brownie <command> [<args>...] [options <args>]  Commands:   init               Initialize a new brownie project   bake               Initialize from a brownie-mix template   ethpm              Commands related to the ethPM package manager   compile            Compiles the contract source files   console            Load the console   test               Run test cases in the tests/ folder   run                Run a script in the scripts/ folder   accounts           Manage local accounts   gui                Load the GUI to view opcodes and test coverage   analyze            Find security vulnerabilities using the MythX API  Options:   --help -h          Display this message  Type 'brownie <command> --help' for specific options and more information about each command.

Проект brownie

Проект brownie представляет из себя определённую структуру директорий и конфигурационный файл brownie-config.yaml. Создать проект можно либо с помощью команды brownie init

Создание проекта с помощью init

brownie init salut_habr Brownie v1.6.9 - Python development framework for Ethereum  SUCCESS: Brownie environment has been initiated at salut_habr

либо можно создать проект на основе шаблона с помощью команды brownie bake template_name

Создание проекта из шаблона

brownie bake token Brownie v1.6.9 - Python development framework for Ethereum  Downloading from https://github.com/brownie-mix/token-mix/archive/master.zip... 5.62kiB [00:00, 2.82MiB/s] SUCCESS: Brownie mix 'token' has been initiated at token

Далее я рассмотрю второй вариант на основе шаблона для ERC-20 токена (шаблон token).
Рассмотрим структуру проекта:

├───build # Здесь хранится информация, полученная в результате сборки и деплоя. │   ├───contracts # Здесь хранятся скомпилированные контракты, их ABI и метаданные. │   └───deployments # Здесь хранятся данные о раздеплоенных в сети умных контрактах. ├───contracts # Сами контракты (код и библиотеки). ├───interfaces # Интерфейсы умных контрактов. ├───reports # Отчёты анализаторов. ├───scripts # Python скрипты с доступом к окружению проекта и возможностью вызова через run. └───tests # Тесты на базе pytest для умных контрактов.

Стоит отметить, что помимо перечисленных директорий brownie имеет конфигурационный файл, который находится в корне проекта и называется brownie-config.yaml — в нём можно указать опции компилятора, данные для подключения к ноде или параметры тестирования.

Команды brownie

brownie даже в базовой комплектации имеет множество команд, но я рассмотрю четыре из них, которые значительно чаще прочих используются в производственном цикле: compile, console, test и run.

brownie compile

Данная команда используется для компиляции умных контрактов, которые расположены в директории проекта contracts или её поддиректориях. Если необходимо, чтобы часть контрактов не компилировалась как самостоятельные единицы, то к названию файла или директории стоит приписать слева символ нижнего подчёркивания "_",- в таком случае компилятор brownie будет их игнорировать (это полезно при подключении библиотек к проекту).

Собранные контракты помещаются в ./build/contracts/ в виде одноимённых json-файлов, которые содержат ABI контрактов, их байт-код и дополнительную мета-информацию.

При компиляции brownie запоминает, какие контракты были скомпилированы, а какие ещё нет и компилирует только их. Но если нужно перекомпилировать все контракты, то можно сделать это добавив флаг -all.

Пример компиляции контрактов

brownie compile --all Brownie v1.6.9 - Python development framework for Ethereum  Compiling contracts...   Solc version: 0.5.17+commit.d19bba13.Windows.msvc   Optimizer: Enabled  Runs: 200   EVM Version: Istanbul Generating build data...  - Token...  - SafeMath...  Brownie project has been compiled at C:\Users\Default\Documents\token\build\contracts

Параметры компиляции, такие как версия компилятора или оптимизация кода, задаются в файле brownie-config.yaml

brownie test

Этой командой запускаются тесты в проекте с использованием pytest, однако стоит заметить, что команда не возвращает никакое значение, поэтому есть трудности с интеграцией тестов в CI/CD.

Пример тестирования контрактов

brownie test Brownie v1.6.9 - Python development framework for Ethereum  ==================================================================================================== test session starts ===================================================================================================== platform win32 -- Python 3.8.3, pytest-5.4.1, py-1.8.1, pluggy-0.13.1 rootdir: C:\Users\Default\Documents\token plugins: eth-brownie-1.6.9, hypothesis-5.5.4, forked-1.1.3, xdist-1.31.0, web3-5.5.1 collecting ... Launching 'ganache-cli.cmd --port 8545 --gasLimit 6721975 --accounts 10 --hardfork istanbul --mnemonic brownie'... collected 7 items  tests\test_approve_transferFrom.py ......                                                                                                                                                                               [ 85%] tests\test_transfer.py .                                                                                                                                                                                                [100%]  ===================================================================================================== 7 passed in 9.35s ======================================================================================================  Terminating local RPC client...

Тесты в проекте хранятся в директории tests/

brownie run

С помощью данной команды осуществляется запуск скриптов из директории scripts. Однако передача параметров в них поддерживается только с версии brownie 2.x, но даже без них удобно использовать данный функционал для интеграции с CI/CD (например для деплоя контрактов).

Деплой контрактов с помощью brownie run

brownie run token Brownie v1.6.9 - Python development framework for Ethereum  TokenProject is the active project. Launching 'ganache-cli.cmd --port 8545 --gasLimit 6721975 --accounts 10 --hardfork istanbul --mnemonic brownie'...  Running 'scripts.token.main'... Transaction sent: 0xe36fbf7d93c1c91bde5e9290128999ed06ea54eb68352fb477fa91ce8072f472   Gas price: 0.0 gwei   Gas limit: 549953   Token.constructor confirmed - Block: 1   Gas used: 549953 (100.00%)   Token deployed at: 0x3194cBDC3dbcd3E11a07892e7bA5c3394048Cc87  Terminating local RPC client...

brownie console

Запускает интерактивный режим brownie: по сути он является интерпретатором установленной версии питона, но с заранее импортированными пространствами имён для проекта. Например для проекта токена мы имеем следующие переменные сразу после запуска:

brownie console Brownie v1.6.9 - Python development framework for Ethereum  TokenProject is the active project. Launching 'ganache-cli.cmd --port 8545 --gasLimit 6721975 --accounts 10 --hardfork istanbul --mnemonic brownie'... Brownie environment is ready. >>> dir() [Fixed, Gui, SafeMath, Token, Wei, a, accounts, alert, compile_source, config, dir, history, network, project, rpc, run, web3]

Информацию о их назначении можно найти в документации brownie, однако подавляющая часть имён имеет то же предназначение, что и в web3py.

Работа с майнетом/тестнетами

Во всех примерах выше brownie поднимал ganache (локальное тестовое окружение Ethereum) и работал с ним, однако есть возможность работы с произвольной выбранной сетью (в том числе с приватным тестнетом и даже с Quorum!). Для этого используется параметр --network network_name при выполнении команд console и run, где network_name должна быть описана в brownie-config.yaml. По умолчанию там уже заданы майнеты ETH и ETC, а также локальный и публичные тестнеты. Однако можно добавлять свои сети в том числе добавляя в их свойства свои собственные параметры, если yaml позволяет это сделать. Обычно я при работе создаю дополнительно сети develop, test и master (по названиям веток в гите), а их блокчейны разворачиваю в Azure с помощью специальной службы.

Подводя итог можно сказать, что brownie на текущий момент уже достаточно зрелое Enterpise-ready решение для разработки под Ethereum и способен удовлетворить практически все возникающие в её процессе потребности. Питонистам и не только однозначно стоит попробовать сделать на нём свой следующий проект.

ссылка на оригинал статьи https://habr.com/ru/post/509618/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *