Открыть сервис

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:

  1. Простота и минимализм. Язык намеренно лишён многих функций, присутствующих в Solidity, таких как:
  • Модификаторы функций (function modifiers).
  • Наследование с переопределением (classical inheritance).
  • Перегрузка функций (function overloading).
  • Динамическая диспетчеризация (dynamic dispatch).
  • Неявные преобразования типов (implicit type conversions).
  • Условные операторы if и else в теле функций (вместо них используется assert и require).
  • Циклы с неограниченным числом итераций (например, while с неизвестным количеством шагов) — допускаются только циклы с фиксированным числом итераций (for по статическому массиву или диапазону).
  1. Безопасность и аудируемость. Ограниченный набор конструкций делает код более предсказуемым и лёгким для проверки. Разработчики и аудиторы могут быстрее выявить логические ошибки, так как отсутствуют сложные механизмы, способные скрыть неочевидное поведение.
  1. Прозрачность. Код на 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

ХарактеристикаVyperSolidity
СинтаксисPython-подобныйC-подобный (JavaScript, Java)
СложностьНизкаяВысокая
БезопасностьВысокая (за счёт ограничений)Средняя (требует осторожности)
ФункциональностьОграниченнаяШирокая
СообществоМаленькоеОгромное
ЭкосистемаОграниченнаяРазвитая
ПроизводительностьСредняяВысокая (с оптимизациями)
АудируемостьВысокаяСредняя
Поддержка наследованияНетДа
Поддержка модификаторовНетДа
Поддержка цикловТолько с фиксированным числом итерацийПолная
Поддержка ассемблераНетДа (Yul)

Критика

Основная критика Vyper связана с его ограниченностью. Разработчики, привыкшие к гибкости Solidity, часто считают Vyper слишком жёстким и неудобным для реализации сложных проектов. Отсутствие наследования и модификаторов вынуждает писать больше повторяющегося кода, что может увеличить риск ошибок, несмотря на общую простоту языка. Также отмечается, что Vyper медленнее адаптируется к изменениям в Ethereum, что может быть критично для проектов, требующих последних функций EVM.

Будущее

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

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →