Технический анализ релиза 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