Русский
Русский
English
Статистика
Реклама

Из песочницы 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 --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


Создание проекта с помощью 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
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 и способен удовлетворить практически все возникающие в её процессе потребности. Питонистам и не только однозначно стоит попробовать сделать на нём свой следующий проект.

Источник: habr.com
К списку статей
Опубликовано: 05.07.2020 12:20:18
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Solidity

Brownie

Ethereum

Блокчейн

Умные контракты

Категории

Последние комментарии

© 2006-2020, personeltest.ru