Solidity

Pause

Solidity — объектно-ориентированный статически типизированный высокоуровневый язык программирования, созданный для написания и реализации смарт-контрактов на виртуальной машине Ethereum (EVM)[3] и других блокчейн-платформах, совместимых с ней[4].

Идея языка была предложена в августе 2014 года одним из сооснователей Ethereum Гэвином Вудом[5]. Дальнейшая разработка велась командой проекта Ethereum под руководством Кристиана Райтвизнера (Christian Reitwiessner)[5]. Синтаксис Solidity был намеренно сделан похожим на JavaScript, C++ и Python для облегчения его освоения веб-разработчиками[3][6]. Solidity является одним из основных языков для создания децентрализованных приложений (DApps), проектов в сфере DeFi, NFT и DAO[7].

Общие сведения

История

Идея создания Solidity была предложена в августе 2014 года одним из сооснователей Ethereum Гэвином Вудом. Дальнейшая разработка велась командой проекта Ethereum под руководством Кристиана Райтвизнера (Christian Reitwiessner). В команду также входили Алекс Беркман, Либойс Лавльянд, Якоб Хаун и Пипп Макк. При создании языка разработчики черпали вдохновение в синтаксисе C++, Python и JavaScript, чтобы облегчить его освоение веб-разработчиками. Язык был специально спроектирован для компиляции в байт-код, исполняемый на виртуальной машине Ethereum (EVM)[8]. Первая стабильная версия Solidity была выпущена в 2015 году.

Развитие языка следует принципу семантического версионирования, однако до версии 1.0.0 минорные релизы (например, 0.5.0, 0.6.0) вносили обратно несовместимые изменения[9].

Версия 0.5.0 (ноябрь, 2018)

Этот релиз стал важной вехой, представив множество «ломающих» изменений, направленных на повышение строгости и явности кода[10]. Ключевые нововведения включали:

  • Обязательное явное указание видимости функций (public, external, internal, private) и местоположения данных (memory, storage, calldata) для переменных сложных типов.
  • Разделение типа address на address и address payable для более безопасной отправки средств.
  • Запрет небезопасных или вводящих в заблуждение конструкций, таких как ключевое слово var и псевдоним suicide (заменён на selfdestruct).

Версия 0.8.0 (декабрь, 2020)

Следующим значительным шагом в повышении безопасности стала версия 0.8.0[8]. Основные изменения:

  • Встроенная защита от целочисленных переполнений и опустошений. Арифметические операции по умолчанию стали вызывать ошибку при выходе за пределы диапазона типа, что сделало необязательным использование внешних библиотек, таких как SafeMath[8][11]. Для намеренного использования «оборачивающейся» арифметики был введён блок unchecked { … }[12].
  • Активация кодировщика ABI Coder v2 по умолчанию, который поддерживает больше типов данных и проводит дополнительные проверки[12].
  • Замена invalid opcode на операцию revert для внутренних ошибок (например, деление на ноль), что позволяет экономить газ при сбое транзакции[12].

Последующие релизы в ветке 0.8.x продолжили совершенствовать язык, добавляя поддержку новых возможностей сети Ethereum (например, обновления Shanghai и Cancun), пользовательские ошибки (custom errors) для более эффективной обработки исключений[13] и поддержку «переходного» хранилища (transient storage, EIP-1153)[14].

Основные характеристики

Solidity — это высокоуровневый, объектно-ориентированный язык со статической типизацией, созданный для разработки смарт-контрактов, исполняемых на виртуальной машине Ethereum (EVM). Ключевые характеристики языка включают:

  • Статическая типизация: В отличие от языков с динамической типизацией (например, JavaScript), в Solidity тип каждой переменной должен быть явно указан на этапе разработки. Проверка типов происходит во время компиляции, что помогает выявлять ошибки на ранней стадии и повышает надёжность кода.
  • Объектно-ориентированность: Язык поддерживает ключевые принципы ООП, включая наследование (в том числе множественное), что позволяет создавать модульные и повторно используемые компоненты. Основной структурной единицей в Solidity является contract (контракт), который можно рассматривать как класс в других языках ООП.
  • Исполнение на EVM: Код на Solidity компилируется в байт-код, который исполняется на виртуальной машине Ethereum. EVM представляет собой изолированную «песочницу», обеспечивающую детерминированное и безопасное выполнение смарт-контрактов на всех узлах сети.
  • Ориентированность на контракты: Язык включает встроенные типы и функции для взаимодействия с блокчейном. К ним относятся тип address для адресов кошельков, специальные глобальные переменные (например, msg.sender для определения отправителя транзакции) и единицы измерения криптовалюты (ether, gwei).

Структура контракта

Смарт-контракт на Solidity обычно состоит из следующих компонентов:

  • Переменные состояния (State Variables) — переменные, значения которых постоянно хранятся в хранилище блокчейна.
  • Функции (Functions) — исполняемые блоки кода, которые определяют логику контракта и могут изменять его состояние.
  • Модификаторы (Modifiers) — многократно используемые блоки кода для проверки условий перед выполнением функции (например, проверка, что вызов делает только владелец контракта).
  • События (Events) — механизм для логирования действий в блокчейне, который позволяет внешним приложениям отслеживать изменения в состоянии контракта.

Газ и стоимость выполнения

Каждая операция в EVM, от простого сложения до сохранения данных, имеет свою стоимость в «газе» (gas) — единице измерения вычислительных затрат. За выполнение транзакции или вызов функции контракта пользователь платит комиссию, размер которой зависит от общего количества потреблённого газа. Эта особенность делает оптимизацию кода критически важной для снижения затрат пользователей.

Безопасность и уязвимости

Безопасность смарт-контрактов является первостепенной задачей, поскольку их код после развёртывания в блокчейне становится неизменяемым, а уязвимости могут привести к необратимым финансовым потерям[15]. Существует несколько распространённых типов атак на смарт-контракты, написанные на Solidity, для которых разработаны стандартные методы защиты[15].

Атаки повторного входа (Reentrancy) Одна из самых известных и разрушительных уязвимостей, ставшая причиной взлома проекта The DAO[15]. Атака происходит, когда контракт совершает внешний вызов другого контракта, который, в свою очередь, получает возможность повторно вызвать функцию исходного контракта до того, как его состояние (например, баланс пользователя) будет обновлено[16]. Это позволяет злоумышленнику многократно выводить средства. Методы предотвращения:

  • Паттерн «Checks-Effects-Interactions» (Проверки-Эффекты-Взаимодействия): Наиболее рекомендуемый способ защиты. Логика функции должна сначала выполнять все проверки (например, с помощью require), затем изменять состояние контракта (например, обновлять баланс) и только после этого взаимодействовать с другими контрактами[16].
  • Блокировка мьютексом (Reentrancy Guard): Применение специального модификатора, который блокирует контракт на время выполнения функции, не позволяя повторно войти в неё до завершения первого вызова. Стандартным решением является использование библиотеки ReentrancyGuard от OpenZeppelin[16][17].
  • Система выплат «Pull over Push»: Вместо того чтобы контракт автоматически отправлял («push») средства пользователям, внедряется механизм, при котором пользователи сами запрашивают («pull») вывод своих средств.

Целочисленное переполнение и опустошение (Integer Overflow & Underflow) Уязвимость возникает, когда результат арифметической операции выходит за пределы диапазона типа данных переменной (например, для uint8, который хранит значения от 0 до 255)[18]. При переполнении (255 + 1) значение «оборачивается» и становится 0, а при опустошении (0 - 1) — 255. Это может привести к неверным расчётам и непредсказуемому поведению контракта[19]. Методы предотвращения:

  • Использование Solidity версии 0.8.0 и выше: Начиная с этой версии, компилятор по умолчанию включает встроенные проверки на переполнение и опустошение, автоматически отменяя транзакцию в случае их возникновения[19].
  • Библиотеки SafeMath: Для версий Solidity старше 0.8.0 настоятельно рекомендуется использовать библиотеку SafeMath от OpenZeppelin, которая предоставляет безопасные функции для арифметических операций[19].

Нарушение контроля доступа (Access Control) Уязвимости контроля доступа возникают, когда ограничения на выполнение определённых функций реализованы неверно или отсутствуют[20]. Поскольку функции в Solidity по умолчанию являются общедоступными (public), разработчики должны вручную ограничивать доступ к критически важным операциям, таким как смена владельца или вывод средств[21]. Методы предотвращения:

  • Шаблоны владения и ролевой модели: Использование модификаторов (например, onlyOwner) для ограничения доступа к функциям только для определённых адресов. Для более сложных систем применяется ролевая модель доступа (Role-Based Access Control, RBAC), где разным ролям предоставляются разные права. Стандартными решениями являются контракты Ownable и AccessControl от OpenZeppelin[20].
  • Принцип наименьших привилегий: Предоставление каждому адресу или роли только минимально необходимого набора разрешений[22].
  • Явное указание видимости: Функции, которые не должны вызываться извне, следует помечать как private или internal[21].

Другие распространённые уязвимости

  • Зависимость от временной метки (Timestamp Dependence): Майнеры могут в определённых пределах манипулировать временными метками блоков (block.timestamp), поэтому их использование для критически важной логики (например, генерации случайных чисел) небезопасно[23].
  • Слабая случайность (Weak Randomness): Получение истинно случайного числа в детерминированной среде блокчейна является сложной задачей. Использование хеша блока или других переменных для генерации случайности небезопасно, так как они могут быть предсказаны или подвержены влиянию майнеров[24].
  • Использование tx.origin для аутентификации: Проверка глобальной переменной tx.origin для аутентификации пользователя уязвима для фишинговых атак. Вместо этого всегда следует использовать msg.sender[15].

Для обеспечения надёжной защиты смарт-контрактов рекомендуется сочетать безопасные практики кодирования, тщательное тестирование и проведение независимых аудитов безопасности[15].

Дальнейшее развитие и перспективы

В 2025 году развитие языка Solidity сосредоточено на его стабилизации, улучшении инструментов для разработчиков и подготовке к выпуску версии 1.0. Основная работа ведётся некоммерческой ассоциацией Argot Collective[25].

Переход к «Core Solidity»: Ключевой стратегической задачей является постепенный переход к концепции «Core Solidity» — минималистичному ядру языка с базовой функциональностью. Более сложные возможности планируется выносить в стандартные библиотеки. Такой подход преследует несколько целей[25]:

  • Гибкость и стабильность: Упрощение ядра позволит быстрее внедрять новые функции, не затрагивая стабильность основной платформы.
  • Безопасность и верификация: Минималистичное ядро облегчает процесс формальной верификации корректности кода.
  • Понятность: Разделение на ядро и библиотеки сделает язык более простым для освоения.

Прототип «Core Solidity», способный поддерживать функциональность токенов стандарта ERC-20, запланирован на четвёртый квартал 2025 года[25].

Обновления компилятора: В течение 2025 года продолжился выпуск версий в линейке 0.8.x, которые включали как новые функции, так и подготовку к будущим изменениям:

  • Версия 0.8.29 (март 2025): Представлена начальная экспериментальная поддержка стандарта отладки ethdebug[25].
  • Версия 0.8.30: Добавлена поддержка пользовательских схем хранения данных (custom storage layouts)[25].

Современные версии ветки 0.8.x по умолчанию включают встроенную защиту от арифметических переполнений и поддерживают пользовательские ошибки (Custom Errors) в функции require для более эффективного расхода газа[26].

Дорожная карта на конец 2025 года: Команда разработчиков наметила следующие цели на конец года[25]:

  • Оптимизация: Внедрение новых проходов оптимизатора и разработка дизайна для оптимизации использования памяти на уровне языка.
  • Отладка и ошибки: Расширение поддержки ethdebug и улучшение системы отчётности об ошибках.
  • Подготовка к обновлениям сети: Обеспечение готовности компилятора к предстоящему обновлению сети Ethereum (кодовое название Fusaka).

Несмотря на активное развитие, Solidity сохраняет свою позицию как один из самых востребованных языков для блокчейн-разработки в 2025 году[26].

Примечания

  1. ↑ Release 0.8.19 — 2023.
  2. ↑ https://github.com/ethereum/solidity/blob/develop/LICENSE.txt
  3. ↑ 1 2 Что такое Solidity. Gate.io. Дата обращения: 29 июля 2025.
  4. ↑ What Is Solidity? Binance Academy. Дата обращения: 29 июля 2025.
  5. ↑ 1 2 Solidity v0.5.0 Breaking Changes. Solidity Programming Language. Дата обращения: 29 июля 2025.
  6. ↑ What is Solidity. Solidity University. Дата обращения: 29 июля 2025.
  7. ↑ Что такое Solidity и на чем еще пишут блокчейн-проекты: краткий обзор. vc.ru. Дата обращения: 29 июля 2025.
  8. ↑ 1 2 3 Solidity v0.8.0 Release Announcement. Solidity Language Blog (16 декабря 2020). Дата обращения: 29 июля 2025.
  9. ↑ Среда разработки Solidity. Книга Ethereum. Дата обращения: 29 июля 2025.
  10. ↑ Solidity 0.5.0 Release Announcement. daily.dev. Дата обращения: 29 июля 2025.
  11. ↑ Solidity 0.8.0 is here! Here's what's new. Solidity Developer. Дата обращения: 29 июля 2025.
  12. ↑ 1 2 3 Solidity v0.8.0 Breaking Changes. Solidity Programming Language. Дата обращения: 29 июля 2025.
  13. ↑ Releases. Solidity Language Blog. Дата обращения: 29 июля 2025.
  14. ↑ Releases · ethereum/solidity. GitHub. Дата обращения: 29 июля 2025.
  15. ↑ 1 2 3 4 5 Распространенные уязвимости смарт-контрактов. monoaudit. Дата обращения: 29 июля 2025.
  16. ↑ 1 2 3 How to protect against a reentrancy attack in Solidity. Educative. Дата обращения: 29 июля 2025.
  17. ↑ Preventing Re-entrancy Attacks in Solidity. Infuy. Дата обращения: 29 июля 2025.
  18. ↑ Integer Overflow and Underflow in Solidity Explained. metaschool. Дата обращения: 29 июля 2025.
  19. ↑ 1 2 3 Underflow and Overflow Vulnerabilities in Smart Contracts. 101 Blockchains. Дата обращения: 29 июля 2025.
  20. ↑ 1 2 How to manage Access Control in Solidity Smart Contract. DEV Community. Дата обращения: 29 июля 2025.
  21. ↑ 1 2 Топ уязвимостей безопасности в смарт-контрактах Solidity. AuditFirst. Дата обращения: 29 июля 2025.
  22. ↑ Smart Contract Access Control Best Practices. Krayon Digital. Дата обращения: 29 июля 2025.
  23. ↑ Аналитический обзор списка OWASP Smart Contract Top 10. РЕЗБЕЗ. Дата обращения: 29 июля 2025.
  24. ↑ Уязвимости смарт-контрактов и способы их устранения. Меридиан. Дата обращения: 29 июля 2025.
  25. ↑ 1 2 3 4 5 6 2025 Roadmap Update. www.argot.org. Дата обращения: 29 июля 2025.
  26. ↑ 1 2 Обзор обновлений Solidity и их влияние на безопасность. Habr. Дата обращения: 29 июля 2025.

Дополнительно по теме

Pause