Vyper
Vyper — это язык программирования для создания смарт-контрактов на блокчейне Ethereum, ориентированный на простоту, безопасность и аудируемость кода. Относится к классу языков, компилируемых в байт-код виртуальной машины Ethereum (EVM). Разработан как альтернатива языку Solidity, с акцентом на минимализм синтаксиса и снижение риска ошибок, характерных для более сложных языков.
История
Vyper был создан в 2017 году разработчиком Виталиком Бутериным (сооснователем Ethereum) и другими участниками сообщества Ethereum. Первоначально проект назывался Viper, но позже был переименован в Vyper из-за конфликта имён с другим проектом. Основной мотивацией для создания Vyper стала критика Solidity за излишнюю сложность, наличие множества неочевидных функций (например, динамической диспетчеризации, модификаторов, наследования с переопределением), которые, по мнению авторов, увеличивают вероятность появления уязвимостей в смарт-контрактах.
Первая стабильная версия Vyper (0.1.0) была выпущена в 2018 году. В 2020 году вышла версия 0.2.0, которая включала значительные изменения в синтаксисе и системе типов. В 2023 году была анонсирована работа над версией 0.4.0, которая должна была улучшить поддержку новых стандартов Ethereum (например, EIP-1559) и повысить производительность компилятора. По состоянию на 2024 год Vyper остаётся нишевым, но уважаемым языком в сообществе разработчиков Ethereum, особенно в проектах, где безопасность критична (например, в децентрализованных финансах, DeFi).
Философия и принципы
Vyper построен на трёх ключевых принципах, которые отличают его от Solidity:
- Простота и минимализм. Язык намеренно лишён многих функций, присутствующих в Solidity, таких как:
- Модификаторы функций (function modifiers).
- Наследование с переопределением (classical inheritance).
- Перегрузка функций (function overloading).
- Динамическая диспетчеризация (dynamic dispatch).
- Неявные преобразования типов (implicit type conversions).
- Условные операторы
ifиelseв теле функций (вместо них используетсяassertиrequire). - Циклы с неограниченным числом итераций (например,
whileс неизвестным количеством шагов) — допускаются только циклы с фиксированным числом итераций (forпо статическому массиву или диапазону).
- Безопасность и аудируемость. Ограниченный набор конструкций делает код более предсказуемым и лёгким для проверки. Разработчики и аудиторы могут быстрее выявить логические ошибки, так как отсутствуют сложные механизмы, способные скрыть неочевидное поведение.
- Прозрачность. Код на Vyper, как правило, более читаем, чем эквивалентный код на Solidity, особенно для проектов с высокой степенью доверия (например, для смарт-контрактов, управляющих большими объёмами средств).
Синтаксис и особенности
Синтаксис Vyper напоминает Python, что делает его доступным для разработчиков, знакомых с этим языком. Однако, в отличие от Python, Vyper является строго типизированным и компилируемым языком.
Основные типы данных
- Целочисленные:
int128(знаковое 128-битное),uint256(беззнаковое 256-битное),bool(логический). - Адреса:
address(20-байтовый адрес Ethereum). - Байтовые массивы:
bytes32(32 байта),Bytes[N](динамический массив байтов фиксированной длины N). - Массивы: статические массивы фиксированной длины (например,
int128[10]). Динамические массивы (DynArray) поддерживаются, но с ограничениями. - Структуры:
structдля группировки данных. - Отображения:
HashMap[K, V](аналогmappingв Solidity).
Управление состоянием
Vyper поддерживает стандартные для Ethereum функции:
@external— функция, вызываемая извне контракта.@internal— функция, вызываемая только внутри контракта.@payable— функция, которая может принимать эфир.@view— функция, которая не изменяет состояние блокчейна.@pure— функция, которая не читает и не изменяет состояние.
Обработка ошибок
Вместо require и revert в Solidity, Vyper использует встроенные функции:
assert(condition)— проверяет условие и откатывает транзакцию, если оно ложно. Используется для проверки внутренних инвариантов.require(condition, message)— проверяет условие и откатывает транзакцию с указанным сообщением об ошибке. Используется для проверки входных данных и условий вызова.
Пример простого контракта
```vyper
@version 0.3.10
""" @title Простой контракт-кошелёк @notice Позволяет владельцу выводить средства """
owner: address
@external def __init__(): self.owner = msg.sender
@external @payable def deposit(): pass
@external def withdraw(amount: uint256): require(msg.sender == self.owner, "Только владелец может выводить") require(amount <= self.balance, "Недостаточно средств") send(self.owner, amount) ```
Преимущества и недостатки
Преимущества
- Высокая безопасность. Благодаря ограниченному набору функций, вероятность ошибок, связанных с неочевидным поведением (например, reentrancy, переполнение стека), значительно ниже, чем в Solidity.
- Лёгкость аудита. Код на Vyper проще анализировать, что снижает стоимость и время аудита безопасности.
- Читаемость. Синтаксис, близкий к Python, делает код интуитивно понятным.
- Поддержка формальной верификации. Благодаря простоте языка, некоторые инструменты формальной верификации (например, Certora) могут работать с Vyper эффективнее, чем с Solidity.
Недостатки
- Ограниченная функциональность. Отсутствие наследования, модификаторов и динамической диспетчеризации усложняет реализацию сложных архитектур (например, шаблонов проектирования, таких как Proxy или Upgradeable contracts).
- Меньшее сообщество и экосистема. По сравнению с Solidity, у Vyper меньше библиотек, инструментов, учебных материалов и примеров. По состоянию на 2024 год, большинство смарт-контрактов на Ethereum написано на Solidity.
- Меньшая производительность в некоторых сценариях. Из-за отсутствия некоторых оптимизаций (например, встроенных ассемблерных вставок) код на Vyper может быть менее эффективным по газу в сложных вычислениях.
- Ограниченная поддержка новых стандартов. Иногда Vyper отстаёт от Solidity в поддержке новых EIP (Ethereum Improvement Proposals) и функций EVM.
Применение
Vyper используется в проектах, где безопасность и прозрачность являются приоритетом. Наиболее известные примеры:
- Децентрализованные финансы (DeFi): Протоколы, управляющие большими объёмами средств, такие как Curve Finance (один из крупнейших DeFi-протоколов, использующий Vyper для своих основных контрактов), Yearn Finance (частично), и некоторые другие.
- Токены: Создание простых токенов стандарта ERC-20 или ERC-721, где не требуется сложная логика.
- Аукционы и голосования: Простые смарт-контракты для проведения аукционов или голосований с минимальными требованиями к функциональности.
- Учебные проекты: Благодаря простоте, Vyper часто используется в образовательных целях для изучения основ разработки смарт-контрактов.
Инструменты и экосистема
- Компилятор:
vyper(доступен через pip). Компилирует код в байт-код EVM и ABI (Application Binary Interface). - Среда разработки: Поддерживается в Remix IDE (веб-среда для разработки смарт-контрактов), а также в более продвинутых средах, таких как Brownie (Python-фреймворк) и Hardhat (JavaScript-фреймворк, с ограниченной поддержкой).
- Тестирование: Для тестирования контрактов на Vyper часто используется pytest (Python) с библиотеками
web3.pyиbrownie. - Анализ безопасности: Инструменты, такие как Slither (от Trail of Bits), поддерживают анализ кода на Vyper, хотя и с меньшей глубиной, чем для Solidity.
Сравнение с Solidity
| Характеристика | Vyper | Solidity |
|---|---|---|
| Синтаксис | Python-подобный | C-подобный (JavaScript, Java) |
| Сложность | Низкая | Высокая |
| Безопасность | Высокая (за счёт ограничений) | Средняя (требует осторожности) |
| Функциональность | Ограниченная | Широкая |
| Сообщество | Маленькое | Огромное |
| Экосистема | Ограниченная | Развитая |
| Производительность | Средняя | Высокая (с оптимизациями) |
| Аудируемость | Высокая | Средняя |
| Поддержка наследования | Нет | Да |
| Поддержка модификаторов | Нет | Да |
| Поддержка циклов | Только с фиксированным числом итераций | Полная |
| Поддержка ассемблера | Нет | Да (Yul) |
Критика
Основная критика Vyper связана с его ограниченностью. Разработчики, привыкшие к гибкости Solidity, часто считают Vyper слишком жёстким и неудобным для реализации сложных проектов. Отсутствие наследования и модификаторов вынуждает писать больше повторяющегося кода, что может увеличить риск ошибок, несмотря на общую простоту языка. Также отмечается, что Vyper медленнее адаптируется к изменениям в Ethereum, что может быть критично для проектов, требующих последних функций EVM.
Будущее
Несмотря на нишевый статус, Vyper продолжает развиваться. В версии 0.4.0 ожидается улучшение поддержки динамических массивов, введение новых типов данных и оптимизация компилятора. Сообщество Vyper активно работает над улучшением документации и инструментов. Вероятно, Vyper останется важным языком для проектов, где безопасность и прозрачность являются абсолютным приоритетом, но вряд ли сможет конкурировать с Solidity по популярности в обозримом будущем.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →