Салют, дорогой криптоэнтузиаст!
Сегодня речь пойдёт о 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 доступен как консольная утилита.
brownie --helpBrownie v1.6.9 - Python development framework for EthereumUsage: 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 APIOptions: --help -h Display this messageType 'brownie <command> --help' for specific options and more information abouteach command.
Проект brownie
Проект brownie представляет из себя определённую структуру
директорий и конфигурационный файл
brownie-config.yaml
. Создать проект можно либо с
помощью команды brownie init
brownie init salut_habrBrownie v1.6.9 - Python development framework for EthereumSUCCESS: Brownie environment has been initiated at salut_habr
либо можно создать проект на основе шаблона с помощью команды
brownie bake template_name
brownie bake tokenBrownie v1.6.9 - Python development framework for EthereumDownloading 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 --allBrownie v1.6.9 - Python development framework for EthereumCompiling contracts... Solc version: 0.5.17+commit.d19bba13.Windows.msvc Optimizer: Enabled Runs: 200 EVM Version: IstanbulGenerating 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 testBrownie 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.1rootdir: C:\Users\Default\Documents\tokenplugins: eth-brownie-1.6.9, hypothesis-5.5.4, forked-1.1.3, xdist-1.31.0, web3-5.5.1collecting ... Launching 'ganache-cli.cmd --port 8545 --gasLimit 6721975 --accounts 10 --hardfork istanbul --mnemonic brownie'...collected 7 itemstests\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 tokenBrownie v1.6.9 - Python development framework for EthereumTokenProject 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: 0x3194cBDC3dbcd3E11a07892e7bA5c3394048Cc87Terminating local RPC client...
brownie console
Запускает интерактивный режим brownie: по сути он является интерпретатором установленной версии питона, но с заранее импортированными пространствами имён для проекта. Например для проекта токена мы имеем следующие переменные сразу после запуска:
brownie consoleBrownie v1.6.9 - Python development framework for EthereumTokenProject 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 и способен удовлетворить практически все возникающие в её процессе потребности. Питонистам и не только однозначно стоит попробовать сделать на нём свой следующий проект.