May 12

Технический анализ релиза Solidity 0.8.30

Команда Ethereum выпустила версию 0.8.30 компилятора Solidity — это прежде всего технический релиз для поддержки предстоящего обновления сети Ethereum Pectra (Prague/Electra), запланированного на 7 мая 2025 года.

Технические изменения в компиляторе

1. Изменение целевой версии EVM

// Теперь по умолчанию используется EVM Prague вместо Cancun
pragma solidity 0.8.30; // Неявно использует EVM Prague

// Для явного указания на старую версию EVM
pragma solidity 0.8.30;
pragma evm cancun;

Ключевой момент: при деплое контрактов, скомпилированных с Solidity 0.8.30, в сети, которая ещё не поддерживает EVM Prague (например, некоторые L2), необходимо явно указывать совместимую версию EVM.

2. Улучшения NatSpec документации

Расширена поддержка NatSpec — теперь документация для значений перечислений (enum values) включается в AST и отображается в генерируемой документации:

/// @notice Различные статусы платежа
enum PaymentStatus {
    /// @notice Платеж ожидает обработки
    Pending,
    /// @notice Платеж был успешно обработан
    Completed,
    /// @notice Платеж был отклонен
    Rejected
}

В предыдущих версиях документация для отдельных значений перечислений не была включена в AST и игнорировалась при генерации документации.

3. Исправления в модуле статического анализа SMTChecker

3.1 Обработка условий циклов

// В предыдущих версиях SMTChecker мог некорректно анализировать
// такие циклы, особенно с инвариантами
function example(uint[] memory arr) public {
    for (uint i = 0; i < arr.length; i++) {
        // Условие цикла (i < arr.length) больше не рассматривается
        // как постоянное условие, что устраняет ложные предупреждения
    }
}

3.2 Выборочный анализ контрактов

Исправлена работа флага --model-checker-contracts при статическом анализе. Если ранее при указании анализировать только определенные контракты, SMTChecker мог выдавать некорректные результаты, то теперь анализ работает корректно:

solc --model-checker-engine all --model-checker-contracts MyContract myfile.sol

3.3 Работа с пользовательскими типами

Исправлена внутренняя ошибка, которая возникала при использовании строковых литералов для инициализации пользовательских типов на основе фиксированных байтов. Теперь следующий код компилируется без ошибок:

 CustomId is bytes32;

function createId() public pure returns (CustomId) {
    // Раньше здесь возникала внутренняя ошибка компилятора
    return CustomId.wrap(bytes32("example-id"));
}

Технические последствия для разработчиков

1. Совместимость с EVM Prague

Новая версия EVM Prague добавляет поддержку для EIP, включенных в обновление Pectra. C технической точки зрения это влияет на:

  • Набор доступных опкодов: Prague включает новые опкоды, однако для большинства кода на Solidity это прозрачно
  • Оптимизацию байткода: Компилятор может теперь использовать новые возможности EVM Prague для оптимизации байткода
  • Газовые затраты: Некоторые операции могут иметь другую стоимость в газе по сравнению с предыдущими версиями EVM

2. Инструменты проверки инвариантов

Улучшения в SMTChecker делают анализ кода более точным, что важно при верификации смарт-контрактов. Если вы используете SMTChecker в своем рабочем процессе разработки, рекомендуется перепроверить результаты анализа после обновления.

Совместимость с предыдущими версиями

Solidity 0.8.30 сохраняет обратную совместимость с кодом, написанным для 0.8.x. Единственным исключением является изменение EVM по умолчанию, которое может повлиять на деплой в сетях, ещё не перешедших на Prague.

Как использовать новые возможности

# Установка через npm
npm install -g solc@0.8.30

# Компиляция с явным указанием EVM версии
solc --evm-version cancun yourcontract.sol

# Использование SMTChecker с исправленными возможностями
solc --model-checker-engine all yourcontract.sol

Дополнительные ресурсы

Подписывайтесь на канал @one_eyes!