0.8.27 (невыпущенная версия)
Особенности языка:
- Поддержка объявления переменных состояния с временным расположением данных (поддержка парсера, генерация кода пока не реализована).
Функции компилятора:
-
Отчёт об ошибках: Нереализованные функции теперь корректно отображаются как ошибки, а не обрабатываются как баги.
-
EVM: Поддержка версии EVM «Прага».
-
SMTChecker: Добавление проверки CHC для переполнения и потери значимости в операции унарного минуса.
-
SMTChecker: Замена CVC4 на cvc5 в качестве возможного бэкенда BMC.
Исправления ошибок:
-
SMTChecker: Исправлена ошибка, сообщающая о неверном количестве проверенных проверок для механизмов BMC и CHC.
-
SMTChecker: Исправлено форматирование выражений унарного минуса в инвариантах.
-
SMTChecker: Исправлен внутренний сбой компилятора при сообщении о доказанных целях для механизма BMC.
-
TypeChecker: Исправлен сбой сегментации при назначении вложенного кортежа кортежу.
-
Yul Optimizer: Упрощение имени может привести к запрещённым идентификаторам с ведущей и/или завершающей точкой, например, «x._» будет упрощено до «x.».
0.8.26 (21 мая 2024 года)
Особенности языка:
- Введение новой перегрузки require(bool, Error), которая позволяет использовать функции require с пользовательскими ошибками. Эта функция доступна только в конвейере via-ir.
Функции компилятора:
-
SMTChecker: Создание цели проверки баланса для механизма CHC.
-
Генерация Yul IR-кода: Более дешёвый код для возврата с ошибками небольшого статического размера кодирования.
-
Оптимизатор Yul: Новая, более быстрая последовательность шагов оптимизатора по умолчанию.
Исправления ошибок:
-
Интерфейс командной строки: Исправлен ICE, когда оптимизатор отключён и пустая строка используется для последовательности —yul-optimizations.
-
SMTChecker: Исправлено ложное срабатывание при сравнении хэшей одинаковых массивов или строковых литералов.
-
SMTChecker: Исправлена внутренняя ошибка при доступе к карте, вызванная слишком строгими требованиями к совместимости сортировки индекса и домена сопоставления.
-
SMTChecker: Исправлена внутренняя ошибка при использовании пустого кортежа в условном операторе.
-
SMTChecker: Исправлена внутренняя ошибка при использовании битовых операторов с элементом массива в качестве аргумента.
-
Стандартный интерфейс JSON: Исправлен ICE, когда оптимизатор отключен и пустая строка используется для последовательности optimizerSteps.
-
StaticAnalyzer: Только выдавать ошибку времени компиляции для деления и по модулю на ноль, когда это происходит между литералами.
-
TypeChecker: Исправлен сбой компилятора, когда левая часть присваивания была заключённым в скобки выражением некортежного типа кортежного типа.
-
Оптимизатор Yul: Исправлен оптимизатор, выполняющий каждую повторяющуюся часть последовательности шагов хотя бы дважды, даже если размер кода уже стал стабильным после первой итерации.
-
Оптимизатор Yul: Исправлен порядок назначений, генерируемых SSATransform, зависящий от идентификаторов AST, что иногда приводит к разному (но эквивалентному) байт-коду при добавлении несвязанных файлов в конвейер компиляции.
Система сборки:
- Замена внутренней библиотеки JSON jsoncpp на nlohmann::json.
0.8.25 (14 марта 2024 года)
Функции компилятора:
-
Генератор кода: Использование MCOPY вместо цикла MLOAD/MSTORE при копировании байтовых массивов.
-
EVM: Установка версии EVM по умолчанию на cancun.
-
Анализатор Yul: Выдача предупреждения о временном хранилище только при первом появлении tstore.
Исправления ошибок:
-
Ассемблер: Предотвращение неправильного расчёта размеров тегов.
-
Интерфейс командной строки: Не запускать IR-конвейер при использовании —via-ir, но не запрашивается вывод, который зависит от IR.
-
Импорт сборки EVM: Исправление обработки отсутствующих исходных местоположений во время импорта.
-
SMTChecker: Обеспечение правильного сброса запроса в файл перед вызовом решателя при использовании интерфейса SMT-LIB.
-
SMTChecker: Исправлена внутренняя ошибка, вызванная неуважением знака целочисленного типа при построении нулевых выражений SMT.
-
SMTChecker: Запускать Eldarica только тогда, когда явно запрошено с помощью —model-checker-solvers eld, даже когда он присутствует в системе.
0.8.24 (25 января 2024 года)
Особенности языка:
- Ввести глобальный block.blobbasefee для получения базовой платы за блоб текущего блока.
- Ввести глобальную функцию. В запросе представлен текст, описывающий обновления и изменения в компиляторе Solidity.
0.8.20 (2023-05-10)
-
Особенности компилятора:
- Ассемблер: использование
push0
для размещения 0
в стеке для версий EVM, начиная с «Shanghai», что снижает затраты на развёртывание и время выполнения.
- EVM: установка версии EVM по умолчанию на «Shanghai».
- Поддержка версии EVM «Shanghai».
- NatSpec: добавлена поддержка документации NatSpec в определениях
enum
.
- NatSpec: добавлена поддержка документации NatSpec в определениях
struct
.
- NatSpec: включение NatSpec из событий, которые генерируются контрактом, но определены вне его, в выводе userdoc и devdoc.
- Оптимизатор: переработана упрощённая версия
UnusedAssignEliminator
и UnusedStoreEliminator
. Она может корректно удалять некоторые неиспользуемые присваивания в глубоко вложенных циклах, которые игнорировались старой версией.
- Парсер: унарный плюс больше не распознаётся как унарный оператор в AST и вызывает ошибку на этапе парсинга (а не позже во время анализа).
- SMTChecker: добавлен параметр CLI
--model-checker-bmc-loop-iterations
и параметр JSON settings.modelChecker.bmcLoopIterations
, которые определяют, сколько итераций цикла должен развернуть движок BMC. Обратите внимание, что возможны ложные срабатывания при разворачивании циклов. Это связано с тем, что значение параметра bmc loop iteration может быть меньше фактического количества итераций, необходимого для завершения цикла.
- SMTChecker: все сообщения о неподдерживаемых языковых функциях сгруппированы в одно предупреждение. Параметр CLI
--model-checker-show-unsupported
и параметр JSON settings.modelChecker.showUnsupported
можно включить, чтобы показать полный список.
- SMTChecker: свойства, которые признаны безопасными, теперь явно сообщаются в конце анализа. По умолчанию отображается только количество безопасных свойств. Параметр CLI
--model-checker-show-proved-safe
и параметр JSON settings.modelChecker.showProvedSafe
можно включить, чтобы отобразить полный список безопасных свойств.
- Стандартный интерфейс JSON: добавлена экспериментальная поддержка импорта AST через стандартный JSON.
- Преобразование Yul EVM-кода: если доступно, используйте
push0
, а не codesize
, чтобы создать произвольное значение в стеке и обеспечить одинаковую высоту стека между ветвями.
-
Исправления ошибок:
- ABI: включение событий в ABI, которые генерируются контрактом, но определены вне него.
- Неизменяемые значения: запрет инициализации неизменяемых значений в операторах try/catch.
- SMTChecker: исправление ложных срабатываний в тернарных операторах, содержащих цели проверки, прямо или косвенно.
-
Изменения в AST:
- AST: добавлено поле
internalFunctionIDs
к узлам AST контрактов, содержащее идентификаторы функций, которые могут быть вызваны через внутренний диспетчер. Поле представляет собой карту от идентификаторов функций AST к идентификаторам функций внутреннего диспетчера. Эти идентификаторы всегда генерируются, но используются только при генерации кода через IR.
- AST: добавлено поле
usedEvents
к ContractDefinition
, которое содержит идентификаторы AST всех событий, генерируемых контрактом, а также всех событий, определённых и унаследованных контрактом.
0.8.19 (2023-02-22)
-
Языковые функции:
- Разрешено определение пользовательских операторов для пользовательских типов значений с помощью синтаксиса
using {f as +} for T global
.
-
Функции компилятора:
- SMTChecker: новый доверенный режим, который предполагает, что любой код, доступный во время компиляции, является фактически используемым кодом даже во внешних вызовах. Его можно использовать с помощью параметра CLI
--model-checker-ext-calls trusted
или поля JSON settings.modelChecker.extCalls: "trusted"
.
-
Исправление ошибок:
- Ассемблер: избегание дублирования байт-кода подсборки, где это возможно.
- Генератор кода: избегание включения ссылок на размещённую метку ссылочных функций, если они вызываются сразу же.
- Checker на уровне контракта: правильное различение случая отсутствия аргументов базового конструктора и наличия нереализованной базовой функции.
- SMTChecker: устранение внутренней ошибки, вызванной необработанными выражениями
z3
, поступающими от решателя при использовании битовых операторов. Упростите начальное смещение операций нулевой длины до нуля.
Исправления ошибок:
- Проверка типов: исправление внутренней ошибки компилятора при назначениях кортежей с недопустимой левой частью.
- Генерация кода Yul IR: исправление внутренней ошибки компилятора при доступе к члену
.slot
сопоставления через ссылку на хранилище во встроенной сборке.
Система сборки:
- Разрешить отключение педантичных предупреждений и не рассматривать предупреждения как ошибки во время компиляции при передаче флага
-DPEDANTIC=OFF
в CMake.
- Обновите Emscripten до версии 3.1.19.
0.8.16 (2022-08-08)
Важные исправления ошибок:
- Генерация кода: исправление повреждения данных, которое влияло на ABI-кодирование значений calldata, представленных кортежами: структуры на любом уровне вложенности; списки аргументов внешних функций, событий и ошибок; списки возвращаемых значений внешних функций. 32 ведущих байта первого динамически закодированного значения в кортеже обнулялись, когда последний компонент содержал статически закодированный массив.
Функции компилятора:
- Генератор кода: более эффективный код для проверенного сложения и вычитания.
- Проверка типа: поддержка использования констант библиотеки в инициализаторах других констант.
- Генерация Yul IR-кода: улучшенные процедуры копирования для массивов с упакованным макетом хранения.
- Оптимизатор Yul: добавьте правило для преобразования
mod(add(X, Y), A)
в addmod(X, Y, A)
, если A
является степенью двойки.
- Оптимизатор Yul: добавьте правило для преобразования
mod(mul(X, Y), A)
в mulmod(X, Y, A)
, если A
является степенью двойки.
Исправления ошибок:
- Интерфейс командной строки: запретить следующие параметры вне режима компилятора:
--via-ir
, --metadata-literal
, --metadata-hash
, --model-checker-show-unproved
, --model-checker-div-mod-no-slacks
, --model-checker-engine
, --model-checker-invariants
, --model-checker-solvers
, --model-checker-timeout
, --model-checker-contracts
, --model-checker-targets
.
- Проверка типов: исправить сбой компилятора при назначении кортежа с участием определённых шаблонов с унарными кортежами в левой части.
- Проверка типов: исправить сбой компилятора, когда
abi.encodeCall
получил выражение кортежа вместо встроенного кортежа.
- Проверка типов: исправить разыменование нулевого указателя в проверке типов
abi.encodeCall
свободной функции.
0.8.15 (2022-06-15)
Важное исправление ошибок:
- Генерация кода: избегайте записи грязных байтов в хранилище при копировании массивов
bytes
.
- Оптимизатор Yul: сохраните все побочные эффекты памяти блоков встроенной сборки.
Особенности языка:
- Добавьте
E.selector
для неанонимного события E
, чтобы получить доступ к 32-байтовому селектору темы.
Функции компилятора:
- Языковой сервер: добавьте базовую поддержку семантического выделения.
- Языковой сервер: добавлена поддержка настройки объекта настроек JSON
include-paths
, который можно передать на этапе конфигурации LSP.
- Языковой сервер: всегда добавляйте
{project_root}/node_modules
к путям поиска включений.
- Проверка типов: предупреждение о назначениях, включающих несколько записей в хранилище
bytes
, которые могут сделать ссылки недействительными.
- Оптимизатор Yul: улучшение эвристик встраивания для генерации кода через IR и чистой компиляции Yul.
Исправление ошибок:
- Кодер ABI: при кодировании пустой строки из хранилища не добавляйте лишний пустой слот для данных.
- Устранение общих подвыражений: обрабатывайте элементы сборки порциями максимального размера 2000. Это помогает избежать чрезвычайно трудоёмких поисков во время оптимизации кода.
- Парсер DocString: исправьте ICE, вызванный неизменяемой структурой с сопоставлением.
- Генерация IR-кода Yul: более надёжная очистка в крайних случаях во время копирования памяти в хранилище.
- Оптимизатор Yul: не удаляйте
returndatacopy
в случаях, когда он может выполнять чтения за пределами границ, которые безоговорочно возвращаются как вне газа. Ранее любой returndatacopy
, записывающий в память, которая никогда не считывалась, удалялся без учёта условия выхода за границы. Только при переопределении внешних функций
Возможности компилятора:
- Экспортёр Assembly-Json: включение списка источников в поле sourceList.
- Интерфейс командной строки: опция «--pretty-json» работает также с опциями «--abi», «--asm-json», «--ast-compact-json», «--devdoc», «--storage-layout», «--userdoc».
- Сервер языка: разрешить полный доступ к файловой системе для сервера языка.
- Оптимизатор Peephole: удаление операций без побочных эффектов перед простым завершением.
- SMTChecker: поддержка abi.encodeCall с учётом вызываемого селектора.
Исправления ошибок:
- Экспортёр Assembly-Json: исправление экспорта assembly json для хранения типов переходов операций в поле jumpType вместо value.
- SMTChecker: исправление совместимости ABI с z3 >=4.8.16.
- SMTChecker: исправление ошибки, когда z3 выбран, но недоступен во время выполнения.
- Проверка типов: правильная проверка ограничений using ... global в сочетании с библиотеками.
- Проверка типов: преобразование параметров типа функции в то, как они будут вызываться для abi.encodeCall.
0.8.13 (2022-03-16)
Важные исправления ошибок:
- Генератор кода: правильное кодирование литералов, используемых в abi.encodeCall, вместо аргументов фиксированных байтов.
Особенности языка:
- Общие: разрешено аннотирование встроенного ассемблера как безопасного для памяти, чтобы разрешить оптимизации и уклонение от ограничения стека, которые полагаются на соблюдение модели памяти Solidity.
- Общие: использование M для типа; разрешено на уровне файла, и M теперь также может быть списком свободных функций или функций библиотеки, заключённым в фигурные скобки.
- Общие: использование ... для T global; разрешено на уровне файлов, где пользовательский тип T был определён, что приводит к тому, что эффект оператора становится доступным везде, где доступен T.
Возможности компилятора:
- Интерфейс командной строки: разрешение использования --via-ir вместо --experimental-via-ir.
- Компиляция через Yul IR больше не помечена как экспериментальная.
- JSON-AST: добавлено поле селектора для ошибок и событий.
- Сервер языка: реализует goto-определение.
- Оптимизатор Peephole: оптимизация сравнений перед условными переходами и условных переходов через один безусловный переход.
- Преобразование кода Yul EVM: избегание ненужных pop при завершении потока управления.
- Генерация кода Yul IR: когда результат внешнего вызова статически определён по размеру, игнорировать любые данные возврата после размера, ожидаемого компилятором.
- Yul Optimizer: удаление sstore и mstore операций, которые никогда не считываются.
Исправление ошибок:
- Общее: исправление внутренней ошибки для локалей с необычными правилами капитализации. Локаль, установленная в среде, теперь полностью игнорируется.
- Проверка типов: исправление неправильных ошибок проверки типов при импорте перегруженных функций.
- Генерация кода Yul IR: оптимизация встроенного кода создания с правильными настройками. Это устраняет потенциальные несоответствия между кодом конструктора контракта, скомпилированного изолированно, и байт-кодом в type(C).creationCode, соответственно, байт-код, используемый для new C(...).
0.8.12 (2022-02-16)
Особенности языка:
- Общие: добавление операторов сравнения равенства для внешних типов функций.
- Общие: поддержка ContractName.functionName для abi.encodeCall в дополнение к указателям внешних функций.
Возможности компилятора:
- Интерфейс командной строки: сигнатуры событий и ошибок также возвращаются при использовании --hashes.
- Yul Optimizer: удаление mstore и sstore операций, если слот уже содержит то же значение.
- Yul: испускание неизменяемых ссылок для чистого кода yul при запросе.
Исправление ошибок:
-
Грамматика Antlr: разрешить встроенные имена в yulPath для поддержки .address в указателях функций.
-
Генератор кода: исправить внутреннюю ошибку при доступе к членам внешних функций, занимающих более двух слотов стека.
-
Генератор кода: исправить внутреннюю ошибку при явном преобразовании из string calldata в bytes.
-
Граф потока управления: выполнить правильный виртуальный поиск модификаторов для неинициализированного анализа переменных и недоступного кода.
-
Общее: string.concat теперь правильно принимает строки в качестве аргументов и возвращает string memory. Он был случайно представлен как... Не возвращайте нулевой код выхода при сбое записи связанных файлов на диск.
-
Интерфейс командной строки: исправьте дополнительный символ новой строки, добавляемый к источникам, передаваемым через стандартный ввод, что влияет на их хэши.
-
Интерфейс командной строки: сообщайте о параметрах выбора вывода вместо того, чтобы игнорировать их.
-
Интерфейс командной строки: при связывании принимайте только точные совпадения для имён библиотек, переданных в параметр «--libraries». Имена библиотек, не начинающиеся с имени файла, используются для сопоставления любой библиотеки с таким именем.
-
SMTChecker: исправьте внутреннюю ошибку доступа к магическому типу (block, msg, tx).
-
SMTChecker: исправьте внутреннюю ошибку в механизме CHC при передаче газа в параметрах функции.
-
TypeChecker: исправьте внутреннюю ошибку при использовании массивов и структур с пользовательскими типами значений перед объявлением.
-
TypeChecker: исправьте внутреннюю ошибку при использовании пользовательских типов значений в функциях публичных библиотек.
-
TypeChecker: улучшенное сообщение об ошибке для константных переменных с (вложенными) типами отображения.
-
Yul Assembler: исправьте внутреннюю ошибку, когда имена функций не уникальны.
-
Генератор Yul IR: не выводите пустые переключатели/тела if для пустых контрактов.
Важные исправления ошибок в экспериментальных функциях:
- Генератор Yul IR: изменения в переменных возврата функций, на которые ссылаются аргументы вызова модификатора, не были правильно переданы, если было более одной переменной возврата.
Система сборки:
- Передавайте параметры компоновщика emscripten только при компоновке.
- Удалите устаревший обходной путь совместимости для сборок emscripten.
- Обновите emscripten до версии 2.0.33.
0.8.9 (2021-09-29)
Важное исправление ошибок:
- Неизменяемые объекты: правильно выполняйте расширение знака для знаковых неизменяемых объектов.
- Пользовательский тип значения: исправьте макет хранения пользовательских типов значений для базовых типов короче 32 байтов.
Исправления ошибок:
- AST: экспортируйте canonicalName для UserDefinedValueTypeDefinition и ContractDefinition.
0.8.8 (2021-09-27)
Языковые функции:
- Наследование: функция, которая переопределяет только одну интерфейсную функцию, не требует спецификатора override.
- Система типов: поддержка type(E).min и type(E).max для перечислений.
- Тип пользователя: позволяет создать нулевую стоимость абстракции над типом значения с более строгими требованиями к типу.
Функции компилятора:
- Интерфейс командной строки: добавьте опцию --include-path для указания дополнительных каталогов, которые могут содержать импортируемый код (например, упакованные сторонние библиотеки).
- Интерфейс командной строки: не запускайте неявное создание байт-кода EVM, если это не требуется для запрошенного вывода.
- Интерфейс командной строки: нормализуйте пути, указанные в командной строке, и сделайте их относительными для файлов, расположенных внутри базового пути и/или включающих пути.
- Иммутабельные переменные можно прочитать во время построения после инициализации.
- SMTChecker: добавьте ограничения, чтобы лучше соотносить address(this).balance и msg.value.
- SMTChecker: поддержка констант через модули.
- SMTChecker: поддержка низкоуровневого вызова как внешних вызовов неизвестного кода.
- SMTChecker: поддержка параметра value для внешних вызовов функций.
- SMTChecker: поддержка пользовательских типов значений.
Исправление ошибок:
-
Генератор кода: исправление ICE при назначении структурам calldata и статически размерным массивам calldata в ассемблерном коде.
-
Генератор кода: используйте стабильный порядок источников для функций ABI.
-
Интерфейс командной строки: запретите опцию --experimental-via-ir в режимах Standard JSON, Assembler и Linker.
-
Интерфейс командной строки: исправление разрешения путей, занесённых в белый список с помощью --allowed-paths или неявно из-за базового пути, переназначений и компилируемых файлов. Правильно обрабатывайте пути, которые не соответствуют импорту точно из-за того, что они относительны, ненормализованы или пусты.
-
Интерфейс командной строки: сообщайте об опциях оптимизатора как о недопустимых в режимах Standard JSON и компоновщик вместо игнорирования.
-
Name Resolver: исправление, при котором при импорте псевдонима символа с использованием import {AliasedName} from "a.sol" будет использоваться исходное имя символа, а не псевдоним.
-
Оптимизатор кодов операций: предотвращение многократного запуска оптимизатора во избежание... Потенциальные различия в байт-коде для упомянутого кода.
-
Парсер: Правильно проверять наличие нескольких идентификаторов лицензий SPDX рядом друг с другом и подтверждать их.
-
SMTChecker: Исправить ограничения BMC в отношении внутренних функций.
-
SMTChecker: Устранить ложное отрицательное срабатывание, вызванное «push» на ссылки массива хранения, возвращаемые внутренними функциями.
-
SMTChecker: Устранить ложноположительное срабатывание во внешних вызовах из конструкторов.
-
SMTChecker: Устранить внутреннюю ошибку при использовании «abi.*», криптографических функций и констант из нескольких источников.
-
Стандартный JSON: Исправлять некритические ошибки в режиме Yul, которые отбрасываются, если за ними следует критическая ошибка.
-
Проверка типов: Исправление неправильного сообщения об ошибке во встроенной сборке, жалующегося на «.slot» или «.offset», которые недействительны, когда фактически используется «.length».
-
Проверка типов: Запретить объявления и определения модификаторов в интерфейсах.
-
Оптимизатор Yul: Исправить сбой в LoadResolver, когда «keccak256» имеет определённые аргументы, не являющиеся идентификаторами.
0.8.7 (2021-08-11)
Особенности языка:
- Введение глобального «block.basefee» для получения базовой платы текущего блока.
- Yul: введение встроенной функции «basefee()» для получения базовой платы текущего блока.
Функции компилятора:
- AssemblyStack: также запускать оптимизатор на основе опкодов при компиляции кода Yul.
- Интерфейс командной строки: опция «--pretty-json» работает также с «--standard-json».
- EVM: установить версию EVM по умолчанию на «London».
- SMTChecker: по умолчанию не проверять переполнение и недополнение.
- SMTChecker: скрытые недоказанные цели по умолчанию, и SMTChecker только сообщает, сколько недоказанных целей существует. Их можно перечислить с помощью параметра командной строки «--model-checker-show-unproved» или параметра JSON «settings.modelChecker.showUnproved».
- SMTChecker: новая настройка для включения/отключения кодирования деления и по модулю со свободными переменными. Параметр командной строки — «--model-checker-div-mod-slacks», а параметр JSON — «settings.modelChecker.divModWithSlacks».
- Преобразование кода Yul EVM: также извлекать неиспользуемые слоты аргументов для функций без переменных возврата (с теми же ограничениями, что и для функций с переменными возврата).
- Преобразование кода Yul EVM: не использовать повторно слоты стека, которые сразу становятся недоступными.
- Оптимизатор Yul: перемещать аргументы функций и переменные возврата в память с экспериментальным ограничителем стека (который по умолчанию не включён).
Исправления ошибок:
- Генератор кода: исправление сбоя при передаче пустой строковой литерал в «bytes.concat()».
- Генератор кода: устранение внутренней ошибки компилятора при вызове функций, связанных со структурами и массивами calldata.
- Генератор кода: устранение внутренней ошибки компилятора при передаче 32-байтового шестнадцатеричного литерала или нулевого литерала в «bytes.concat()», запрещая такие литералы.
- Интерфейс командной строки: применение опции «--optimizer-runs» в режиме сборки / Yul.
- Интерфейс командной строки: устранение сбоя при передаче пути к каталогу в «--standard-json».
- Интерфейс командной строки: чтение JSON из стандартного ввода, когда «--standard-json» получает «-» в качестве имени файла.
- Стандарт JSON: включение местоположения источника для ошибок в файлах с пустым именем.
- Проверка типа: устранение внутренней ошибки и предотвращение статических вызовов к не реализованным модификаторам.
- Генерация кода Yul: устранение внутренней ошибки компилятора при использовании длинного литерала с побитовым отрицанием.
- Генерация кода Yul: исправление ссылок на местоположение источника для вызовов встроенных функций.
- Разбор Yul: исправление ссылок на расположение источника для операторов «if».
0.8.6 (2021-06-22)
Особенности языка:
- Yul: специальное значение «".metadata"» объекта данных в объекте Yul.
Исправление ошибок:
- Граф потока управления: исправление неправильно сообщённого недостижимого кода.
- Solc-Js: при запуске «solcjs» без флага «--optimize» используйте «settings.optimizer.enabled=false» в стандартном JSON вместо пропуска ключа.
- Стандартный JSON: пропуск «settings.optimizer.enabled» не был эквивалентен установке его в «false». Это означало отключение также peephole-оптимизатора и средства удаления jumpdest, которые по умолчанию всё ещё работают с «enabled=false».
0.8.5 (2021-06-10)
Особенности языка:
Возможности компилятора:
-
Генератор кода: Вставлять вспомогательные функции для кодов паники вместо безусловного встраивания. Это может снизить затраты, если вставлено много паник (проверок), но может увеличить затраты там, где используется мало паник.
-
EVM: Установить версию EVM по умолчанию «Berlin».
-
SMTChecker: Определения функций можно аннотировать пользовательским тегом Natspec custom:smtchecker abstract-function-nondet
, чтобы при вызове они абстрагировались недетерминированным значением.
-
Стандартный JSON / комбинированный JSON: Новый артефакт «functionDebugData», который содержит смещения байт-кода точек входа функций и потенциально больше информации в будущем.
-
Оптимизатор Yul: Оценить keccak256(a, c)
, когда значение в ячейке памяти a
известно во время компиляции и c
является константой <= 32
.
Исправления ошибок:
-
AST: Не выводить значение литерала Yul, если это не допустимая строка UTF-8.
-
Генератор кода: Исправить внутреннюю ошибку, когда массивы функций присваиваются переменным хранилища, а типы функций могут быть неявно преобразованы, но не идентичны.
-
Генератор кода: Исправить внутреннюю ошибку, когда супер должен был бы пропустить нереализованную функцию в порядке виртуального разрешения.
-
Граф потока управления: Считать, что нереализованные модификаторы используют заполнитель.
-
Граф потока управления: Учитывать внутренние вызовы функций, которые всегда возвращаются, для сообщения о неиспользуемых или неназначенных переменных.
-
График вызовов функций: Исправить внутреннюю ошибку, связанную с круговыми постоянными ссылками.
-
Разрешитель имён: Не выдавать предупреждение о затенении, если затенённое имя напрямую недоступно.
-
Natspec: Разрешить несколько тегов @return
в документации по общедоступным переменным состояния.
-
SMTChecker: Исправить внутреннюю ошибку при преобразовании из bytes
в fixed bytes
.
-
SMTChecker: Исправить внутреннюю ошибку при внешних вызовах из конструктора.
-
SMTChecker: Исправить внутреннюю ошибку в конструкторе структуры с инициализированным строковым литералом членом fixed bytes
.
-
Расположение источника: Правильно установить расположение источника блоков с областью действия.
-
Стандартный JSON: Правильно разрешить настройку inliner
в разделе settings.optimizer.details
.
-
Проверка типов: Исправить внутреннюю ошибку компилятора, связанную с наличием типов сопоставления в параметре конструктора для абстрактных контрактов.
-
Проверка типов: Исправить внутреннюю ошибку компилятора при попытке использовать недопустимый тип внешней функции на EVM до византии.
-
Проверка типов: Исправить внутреннюю ошибку компилятора при переопределении функции получения эфира с другой функцией при наследовании.
-
Проверка типов: Превратить ошибки о (вложенном) типе сопоставления в параметрах события или ошибки в фатальные ошибки типа.
-
Проверка типов: Исправить внутреннюю ошибку компилятора при переопределении реализованного модификатора не реализованным.
Изменения в AST:
Добавить член hexValue
для строк и шестнадцатеричных литералов Yul.
0.8.4 (2021-04-21)
Важные исправления ошибок:
- Декодер ABI V2: Для двумерных массивов и специально созданных данных в памяти результат
abi.decode
может зависеть от данных в других частях памяти. Декодирование данных не затронуто.
Функции языка:
- Ассемблер / Yul: Разрешены шестнадцатеричные строковые литералы.
Возможность использования bytes.concat
с переменным числом аргументов bytes
и bytesNN
, которая ведёт себя как ограниченная версия abi.encodePacked
с более описательным именем.
Поддержка пользовательских ошибок с помощью ключевого слова error
и введение оператора revert
.
Особенности компилятора:
-
Анализ: Правильно обнаруживать циклические ссылки на байт-код других контрактов во всех вызовах функций.
-
Интерфейс командной строки: Опция проверки модели --model-checker-targets
также принимает outOfBounds
.
-
Интерфейс командной строки: Новая опция проверки модели --model-checker-contracts
позволяет пользователям выбирать, какие контракты следует анализировать как наиболее производные.
-
Низкоуровневый инлайнер: Встраивать обычные переходы к небольшим блокам и переходы к небольшим блокам, которые завершаются.
-
NatSpec: Разрешён тег @notice
для непубличных переменных состояния и объявлений локальных переменных. Документация будет только... Быть частью АСТ, в поле «документация».
-
SMTChecker: Устаревает «pragma experimental SMTChecker» и устанавливает движок модели по умолчанию на «none».
-
SMTChecker: Отчёт о локальных переменных в контрпримерах CHC.
-
SМТChecker: Отчёт об индексе массива и фиксированных байтах вне границ.
-
SМTChecker: Поддержка функций и констант на уровне файлов.
-
Стандартный JSON: Вариант модели проверки «settings.modelChecker.targets» также принимает «outOfBounds».
-
Стандартный JSON: Опция проверки модели «settings.modelChecker.targets» принимает массив строковых целей вместо строки разделённых запятыми целей.
-
Стандартный JSON: Новая опция проверки модели «settings.modelChecker.contracts» позволяет пользователям выбирать, какие контракты должны анализироваться как наиболее производные.
-
Yul EVM Code Transform: Оптимизация стека: повторное использование слотов неиспользуемых аргументов функции и отсрочка выделения слотов стека для возвращаемых переменных до тех пор, пока не будут выполнены выражения и присваивания, которые не ссылаются на них.
-
Оптимизатор Yul: Добавлен новый шаг FunctionSpecializer, который специализирует функцию с её литеральными аргументами.
Исправления ошибок:
-
Antlr Grammar: Исправление разбора путей импорта, включая правильное различение между пустыми и непустыми строковыми литералами в целом.
-
Вывод AST: Исправление поля «kind» для «ModifierInvocation» для вызовов базового конструктора.
-
Интерфейс командной строки: Исправление внутренней ошибки при печати AST и использовании «—base-path» или префикса «file://» в импорте.
-
Интерфейс командной строки: Исправление стандартного ввода, обходящего разрешённые проверки пути.
-
Natspec: Исправление внутренней ошибки, связанной с документацией @returns для публичной переменной состояния, переопределяющей функцию.
-
SMTChecker: Исправление ложных срабатываний и пропусков на «push» как LHS составного присваивания.
-
SMTChecker: Исправление ложного срабатывания в контрактах, которые нельзя развернуть.
-
SMTChecker: Исправление внутренней ошибки в публичных геттерах, возвращающих динамические данные в старых версиях EVM, где они недоступны.
-
SMTChecker: Исправление внутренней ошибки на try-catch с вызовом функции в блоке catch.
-
Проверка типов: Исправление отсутствующей ошибки при использовании событий без оператора emit.
Изменения в АСТ:
- Новое свойство для узлов «ContractDefinition»: «usedErrors» перечисляет все ошибки AST, используемые контрактом (даже если они определены снаружи).
Важные исправления ошибок:
- Оптимизатор: Исправление ошибки неправильного кэширования хешей Keccak-256.
Функции компилятора:
-
Интерфейс командной строки: Отказ от экспериментальной поддержки «—machine evm15».
-
Оптимизатор: Попытка переместить «и» с постоянной внутри «или» для улучшения записи в хранилище небольших типов.
-
Оптимизатор: Замена умножений и делений степенями двойки путём сдвигов.
Исправления ошибок:
-
Импорт AST: Для конструкторов публичная видимость игнорируется во время импорта.
-
Отчёт об ошибках: Исправление обработки возврата каретки.
-
SMTChecker: Исправление внутренней ошибки в BMC при разрешении виртуальных функций внутри ветвей.
-
SMTChecker: Исправление внутренней ошибки на «array.pop», вложенной внутрь 1-кортежа.
-
SMTChecker: Исправление внутренней ошибки на константе «FixedBytes», инициализированной строковым литералом.
-
SMTChecker: Исправление внутренней ошибки на срезах массива.
-
SMTChecker: Исправление внутренней ошибки при вызове публичного геттера для переменной состояния типа массива (возможно, вложенного) структур.
-
SMTChecker: Исправление внутренней ошибки при добавлении в строку, приведённую к байтам.
-
SMTChecker: Исправление ошибки в виртуальных функциях, вызываемых конструкторами.
Изменения в АСТ:
-
ModifierInvocation: Добавление поля «kind», которое может быть «modifierInvocation» или «baseConstructorSpecifier». Когда функции передаются в качестве параметров другим вызываемым объектам, когда типы функций могут быть неявно преобразованы, но не идентичны.
-
Парсер: Правильно анализировать .address
в некоторых ситуациях.
-
SMTChecker: Исправить недостающие ограничения типов для переменных блока и транзакции на этапе развёртывания.
-
Type Checker: Устранить внутреннюю ошибку, когда спецификатор переопределения не является контрактом.
-
Type Checker: Преобразовать ошибки коллизии функций в фатальные ошибки типа.
Изменения AST:
- Добавляет
nameLocation
к объявлениям для представления точного местоположения символического имени.
- Удалена избыточная функция типа «bytearraypush» — заменена на «arraypush».
- Поддержка поля
documentation
для хранения комментариев NatSpec над каждым оператором.
0.8.1 (2021-01-27)
Особенности языка:
- Возможность использовать
catch Panic(uint code)
для перехвата паники из-за внешнего вызова.
Возможности компилятора:
- Генератор кода: Уменьшить стоимость
<address>.code.length
, используя extcodesize
напрямую.
- Интерфейс командной строки: Разрешить
=
в качестве разделителя между именем библиотеки и адресом в опции командной строки --libraries
.
- Интерфейс командной строки: Новая опция
--model-checker-targets
позволяет указать, какие цели должны быть проверены. Допустимые варианты: all
, constantCondition
, underflow
, overflow
, divByZero
, balance
, assert
, popEmptyArray
, где по умолчанию используется all
. Можно выбрать несколько целей одновременно, разделяя их запятой без пробелов: underflow,overflow,assert
.
- Интерфейс командной строки: Принимать только адреса библиотек с префиксом
0x
в опции командной строки --libraries
.
- Оптимизатор: Добавить правило для замены
iszero(sub(x,y))
на eq(x,y)
.
- Парсер: Сообщить значимую ошибку при сбое анализа версии прагмы.
- SMTChecker: Выводить внутренние и доверенные внешние вызовы функций в трассировке транзакций контрпримера.
- SMTChecker: Показывать
msg.value
в трассировках транзакций контрпримеров, если больше 0.
- SMTChecker: Отображать имя контракта в вызовах функций контрпримера.
- SMTChecker: Поддерживать функции ABI как неинтерпретированные функции.
- SMTChecker: Поддерживать операторы try/catch.
- SMTChecker: Синтезировать ненадёжные функции, вызываемые извне.
- SMTChecker: Использовать проверенную арифметику по умолчанию и поддерживать блоки
unchecked
.
- Стандартный JSON: Новая опция
modelCheckerSettings.targets
позволяет указывать, какие цели следует проверять. Допустимые параметры: all
, constantCondition
, underflow
, overflow
, divByZero
, balance
, assert
, popEmptyArray
, по умолчанию — all
. Можно выбирать несколько целей одновременно, разделяя их запятыми без пробелов: underflow, overflow, assert
.
Исправления ошибок:
- Генератор кода: Исправление проверки длины при декодировании искажённых данных об ошибках в предложении catch.
- Граф потока управления: Исправление отсутствующей ошибки, вызванной чтением из/записью в неинициализированные переменные.
- SMTChecker: Исправление ложных отрицаний при переопределении модификаторов и функций.
- SMTChecker: Исправление ложных отрицательных результатов при наличии встроенного ассемблера.
- SMTChecker: Исправление ложных негативных результатов при анализе внешних вызовов функций.
- SMTChecker: Исправление внутренней ошибки на
block.chainid
.
- SMTChecker: Исправление внутренней ошибки при добавлении строкового литерала в массив
bytes
.
- SMTChecker: Исправление недостающих ограничений типов для переменных блоков.
- Тип Checker: Исправление бесконечного цикла при доступе к круговым константам из встроенного ассемблера.
- Тип Checker: Исправление внутренней ошибки, вызванной константными структурами, содержащими сопоставления.
- Система типов: Запретить неявное преобразование из
uintN
в intM
, когда M > N
, и, соответственно, явное преобразование между теми же типами также запрещено.
Система сборки:
- Обновите сборку soljson.js до emscripten 2.0.12 и boost 1.75.0.
0.8.0 (2020-12-16)
Критические изменения:
-
Генератор кода: Вся арифметика проверяется по умолчанию. Эти проверки можно отключить с помощью unchecked { ... }
.
-
Генератор кода: Вызывать панику, если доступ к байтовому массиву в хранилище осуществляется неправильно.
-
Генератор кода: Использовать revert
с сигнатурой ошибки Panic(uint256)
и... Ошибки вместо неверного кода операции при сбое утверждений.
-
Интерфейс командной строки: поля JSON abi
, devdoc
, userdoc
и storage-layout
теперь являются подобъектами, а не строками.
-
Интерфейс командной строки: удалить опцию --old-reporter
.
-
Интерфейс командной строки: удалить устаревшую опцию --ast-json
. Теперь поддерживается только опция --ast-compact-json
.
-
Общие настройки: включить по умолчанию кодер ABI версии 2.
-
Общие настройки: удалить глобальные функции log0
, log1
, log2
, log3
и log4
.
-
Парсер: возведение в степень является правоассоциативным. Выражение a**b**c
анализируется как a**(b**c)
.
-
Сканер: удалить поддержку escape-последовательностей \b
, \f
и \v
.
-
Стандартный JSON: удалить параметр legacyAST
.
-
Проверка типов: параметры вызова функций можно указывать только один раз.
-
Система типов: запретить объявления с именами this
, super
и _
, за исключением публичных функций и событий.
-
Система типов: запретить msg.data
в функции receive()
.
-
Система типов: запретить тип (super)
.
-
Система типов: запретить перечисления с более чем 256 членами.
-
Система типов: запретить явные преобразования из отрицательных литералов и литералов, превышающих type(uint160).max
, в тип address
.
-
Система типов: запретить тип byte
. Он был псевдонимом для bytes1
.
-
Система типов: явное преобразование к типу address
всегда возвращает не подлежащий оплате тип address
. В частности, address(u)
, address(b)
, address(c)
и address(this)
имеют тип address
, а не address payable
(здесь u
, b
и c
— произвольные переменные типа uint160
, bytes20
и контрактного типа соответственно).
-
Система типов: явные преобразования между двумя типами запрещены, если они одновременно изменяют более одного знака, ширины или вида.
-
Система типов: явные преобразования литералов в перечисления разрешены только в том случае, если значение соответствует перечислению.
-
Система типов: явные преобразования литералов в целочисленный тип так же строги, как и неявные преобразования.
-
Система типов: ввести address(...).code
для получения кода как bytes memory
. Размер можно получить через address(...).code.length
, но в настоящее время он всегда включает копирование кода.
-
Система типов: ввести block.chainid
для получения текущего идентификатора цепочки.
-
Система типов: поддержка address(...).codehash
для получения хэш-кода кода учётной записи.
-
Система типов: глобальные переменные tx.origin
и msg.sender
имеют тип address
, а не address payable
.
-
Система типов: унарный минус можно использовать только для целых чисел со знаком, но не для целых чисел без знака.
-
Проверяющий элемент «View Pure Checker»: пометить chainid
как просмотр.
-
Yul: запретить использование зарезервированных идентификаторов, таких как инструкции EVM, даже если они недоступны в данном диалекте / версии EVM.
-
Yul: встроенный assignimmutable
в диалекте «EVM с объектами» принимает базовый адрес модифицируемого кода в качестве дополнительного аргумента.
Особенности языка:
- Суперконструкторы теперь можно вызывать с помощью обозначения члена, например
M.C(123)
.
Исправления ошибок:
- Проверка типов: выполнение правильной усекающей целочисленной арифметики при использовании констант в выражениях длины массива.
Изменения AST:
-
Новый узел AST IdentifierPath
, заменяющий во многих местах UserDefinedTypeName
.
-
Новый узел AST UncheckedBlock
, используемый для unchecked { ... }
.
0.7.6 (2020-12-16)
Особенности языка:
-
Генератор кода: поддержка преобразования фрагментов данных calldata в массивы памяти и хранения.
-
Генератор кода: поддержка копирования динамически закодированных структур из calldata в память.
-
Генератор кода: поддержка копирования вложенных массивов из calldata в память.
-
Сканер: генерация ошибки парсера, когда комментарии или строки Unicode содержат несбалансированный или недостаточный набор маркеров переопределения направления Unicode (LRO, RLO, LRE, RLE, PDF).
-
Функция fallback теперь также может иметь единственный аргумент calldata
(равный msg.data
) и возвращать bytes memory
(который не будет кодироваться ABI, а будет возвращён как есть).
-
Wasm backend: добавить инструкции i32.select
и i64.select
. Система сборки:
-
Дополнительно поддерживать динамическую загрузку Z3 и использовать этот механизм для сборок релизов в Linux.
Генератор кода:
- Избегать выделения памяти для значения по умолчанию, если оно не используется.
SMTChecker:
- Применять постоянную оценку к двоичным арифметическим выражениям.
- Создавать цели проверки на переполнение и недополнение при инкременте/декременте в механизме CHC.
- Сообщать о значениях структур в контрпримерах из механизма CHC.
- Поддерживать досрочное завершение в механизме CHC.
- Поддерживать геттеры.
- Поддерживать именованные аргументы в вызовах функций.
- Поддерживать конструктор структур.
Standard-Json:
- Переместить недавно введённый ключ modelCheckerSettings в settings.modelChecker.
- Правильно фильтровать запрошенные выходные артефакты.
Исправления ошибок:
Генератор кода:
- Не дополнять пустые строковые литералы одним 32-байтным нулевым полем в кодировщике ABI версии 1.
NatSpec:
- Исправить ошибку сегментации при наследовании документации параметров возврата для модификаторов без параметров.
SMTChecker:
- Исправлять приведение строковых литералов к байтовым массивам.
- Исправлена внутренняя ошибка компилятора при выполнении побитового составного присваивания со строковыми литералами.
- Исправлена внутренняя ошибка при попытке создания контрпримеров с использованием старого z3.
- Исправлена ошибка сегментации, которая могла возникнуть в определённых источниках с поддержкой SMT, когда SMT-решатель был недоступен.
- Исправлена внутренняя ошибка, возникающая при использовании bytes.push() в качестве LHS присваивания.
Type Checker:
- «super» недоступен в библиотеках.
- Запретить ведущие нули в типах с определённым размером (например, bytes000032), но разрешить их использование в качестве идентификаторов.
Yul Optimizer:
- Устранена ошибка в NameSimplifier, из-за которой новое имя, созданное NameSimplifier, также могло быть создано NameDispenser.
- Удалено NameSimplifier из доступных пользователям шагов оптимизации.
0.7.5 (2020-11-18)
Языковые функции:
- Возможность выбора кодировщика abi с помощью прагм abicoder v1 и abicoder v2.
- Встроенное ассемблерное программирование: использование .offset и .length для переменных calldata типа динамического массива для доступа к их смещению и длине calldata (количество элементов). Оба они также могут быть назначены.
- Константные переменные с числовыми значениями считаются чистыми.
Функции компилятора:
- Ассемблер: выполнение компоновки в режиме ассемблирования при предоставлении адресов библиотек.
- Интерфейс командной строки: новая опция --experimental-via-ir позволяет переключать процесс компиляции на прохождение через промежуточное представление Yul. Это экспериментальная функция, используемая для целей разработки.
- Интерфейс командной строки: новая опция --model-checker-timeout устанавливает тайм-аут в миллисекундах для каждого отдельного запроса, выполняемого SMTChecker.
- Интерфейс командной строки: сообщать об ошибке, если файл не удалось прочитать в режиме --standard-json.
- Интерфейс командной строки: правильно сообщать об ошибках для каждого выходного файла, который не удалось записать. Ранее при первой ошибке генерировалось исключение, и выполнение прерывалось.
SMTChecker:
- Добавить проверку деления на ноль в механизме CHC.
- Более точный анализ внешних вызовов с использованием this.
- Поддержка selector для выражений со значением, известным во время компиляции.
- Standard JSON: новая опция modelCheckerSettings.timeout устанавливает тайм-аут в миллисекундах для каждого отдельного запроса, выполняемого SMTChecker.
- Standard JSON: новая опция settings.viaIR позволяет использовать тот же переключатель, что и --experimental-via-ir в командной строке.
Исправления ошибок:
-
Генератор кода: исправить отсутствие отслеживания зависимостей создания для абстрактных контрактов.
-
Интерфейс командной строки: исправить ошибку записи, когда каталог, переданный в --output-dir, заканчивается косой чертой.
-
Интерфейс командной строки: отклонить повторяющиеся библиотеки в опции --libraries вместо произвольного выбора одной из них.
-
NatSpec: исправить внутреннюю ошибку при наследовании документации параметра возврата, но имена параметров различаются между базовым и унаследованным.
-
SMTChecker: исправить ложные срабатывания CHC при использовании ветвей внутри модификаторов. Модификатор применяется несколько раз.
-
SMTChecker: исправление некорректных контрпримеров, о которых сообщил механизм CHC.
-
SMTChecker: устранение внутренней ошибки в механизме BMC при унаследованном контракте из другого исходного модуля, имеющего частные переменные состояния.
-
SMTChecker: устранение внутренней ошибки при преобразовании из строкового литерала в байт.
-
SMTChecker: устранение внутренней ошибки, когда «array.push()» используется в качестве LHS присваивания.
-
SMTChecker: устранение внутренней ошибки при назначении переменной состояния через имя контракта.
-
SMTChecker: устранение внутренней ошибки при использовании кортежей рациональных литералов внутри условного оператора.
-
SMTChecker: устранение недостатка сообщений о потенциальных нарушениях при использовании только механизма CHC.
-
Стандартный JSON: исправление адресов библиотек, указанных в «libraries», которые используются для связывания, даже если имена файлов не совпадают.
Изменения AST:
- Новый член «суффикс» для идентификаторов встроенной сборки. В настоящее время поддерживаются значения «slot», «offset» и «length» для доступа к компонентам переменной Solidity.
0.7.4 (2020-10-19)
Важные исправления ошибок:
- Генератор кода: исправление ошибки повреждения данных при копировании пустых байтовых массивов из памяти или calldata в хранилище.
Функции языка:
- Можно определять константы на уровне файла.
Возможности компилятора:
- Интерфейс командной строки: новая опция «--model-checker-engine» позволяет выбрать конкретный механизм SMTChecker. Варианты: «all» (по умолчанию), «bmc», «chc» и «none».
- Граф потока управления: печать предупреждения для непустых функций с неназванными параметрами возврата, которым не присвоено значение во всех путях кода.
- SMTChecker: поддержка «keccak256», «sha256», «ripemd160» и «ecrecover» в механизме CHC.
- SMTChecker: поддержка встроенных массивов.
- SMTChecker: поддержка переменных «block», «msg» и «tx» в механизме CHC.
- Стандартный JSON: новая опция modelCheckerSettings.engine позволяет выбрать конкретный механизм SMTChecker. Варианты: «all» (по умолчанию), «bmc», «chc» и «none».
Исправления ошибок:
- Генератор кода: исправить прагму ABIEncoderV2 из текущего модуля, влияющую на унаследованные функции и применяемые модификаторы.
- Генератор кода: устранить внутреннюю ошибку компилятора при ссылке на элементы через имя модуля, но без использования ссылки.
- Генератор кода: устранить внутреннюю ошибку при возврате структур, содержащих сопоставления из библиотечной функции.
- Генератор кода: использовать возврат вместо недопустимого кода операции для доступа к индексу массива вне границ в геттере.
- Проверка уровня контракта: добавить отсутствующую проверку наследования функций с типами возврата ABIEncoderV2 в контрактах ABIEncoderV1.
- Разрешитель имён: исправить предупреждения о затенении/одинаковых именах для более поздних объявлений.
- Тип проверки: разрешить массивы типов контрактов в качестве выражений типов и в качестве аргументов для «abi.decode».
- Тип проверки: запретить недопустимое использование имён библиотек в качестве имени типа.
- Тип проверки: устранить внутреннюю ошибку компилятора, вызванную параметрами хранилища с вложенными сопоставлениями в библиотеках.
0.7.3 (2020-10-07)
Важное исправление ошибок:
- Генератор кода: правильно очистить после копирования динамического массива в хранилище для упакованных типов.
Особенности компилятора:
- Генератор кода: реализованы события с типом функции в качестве одного из индексированных параметров.
- Общее: возможность остановить компиляцию после этапа анализа. Может использоваться с «solc --stop-after parsing».
- Оптимизатор: оптимизировать «exp», когда основание равно «-1».
- SMTChecker: поддерживать «addmod» и «mulmod».
- SMTChecker: поддерживать срезы массивов.
- SMTChecker: поддерживать преобразования типов.
Исправление ошибок:
- Исправлены внутренние ошибки компилятора для определённых контрактов, связанных с выражением «new».
- JSON AST: исправлена внутренняя ошибка при использовании «--ast-json» для функции с аргументами памяти в контрактах ABIEncoderV2.
- Тип проверки: добавлены недостающие проверки для вызовов с использованием типов, несовместимых с ABIEncoderV1, в модулях, где ABIEncoderV2 не включён.
- Тип проверки: устранена внутренняя ошибка компилятора при вызове «.push()» для массива хранения с вложенным сопоставлением.
0.7.2 (2020-09-28)
Важное исправление ошибок:
-
Тип проверки: запрещение двух или более свободных функций с одинаковыми именами (потенциально импортированными и псевдонимами) и типами параметров. Компилятор
-
Экспорт сгенерированных компилятором служебных источников через standard-json или combined-json.
Оптимизатор
- Оптимизация exp, когда основание равно 0, 1 или 2.
SMTChecker
- Сохраняет знания о строковых литералах даже после присваивания и, таким образом, правильно поддерживает свойство .length.
- Поддерживает преобразование типа address с помощью литералов, например address(0).
- Поддерживает revert().
- Поддерживает type(T).min, type(T).max и type(I).interfaceId.
- Поддерживает операторы and, or и xor.
- Поддерживает события и низкоуровневые логи.
- Поддерживает доступ к фиксированным байтам индекса.
- Поддерживает выделение памяти, например new bytes(123).
- Поддерживает сдвиги.
- Поддерживает структуры.
Проверка типов
- Объясняет, почему слишком длинные шестнадцатеричные строковые литералы нельзя явно преобразовать в более короткий тип bytesNN.
- Предоставляет более подробные сообщения об ошибках при сбое неявных преобразований.
- Сообщает о позиции первой недопустимой последовательности UTF-8 в литералах unicode.
Генератор Yul IR
Сообщает об исходном местоположении, связанном с нереализованными функциями.
Yul Optimizer
- Встраивает функции в функции дальше по графу вызовов.
- Удаляет неиспользуемые параметры в функциях.
- Пытается упростить имена функций.
Исправления ошибок
- Генератор кода: исправляет внутреннюю ошибку при удалении динамических типов из возвращаемых параметров в версиях EVM без RETURNDATACOPY.
- Проверка типов: добавляет отсутствующую проверку против вложенных динамических массивов в функциях кодирования ABI при отключении ABIEncoderV2.
- Проверка типов: исправляет сообщение об ошибке для недопустимого именованного параметра в вызове, чтобы оно относилось к правильному аргументу.
- Проверка типов: запрещает virtual для модификаторов в библиотеках.
- Разрешение имён: исправляет предупреждение для одноимённых, но не затеняющих объявлений.
- Система типов: исправляет внутреннюю ошибку неявного преобразования экземпляра контракта в тип его super.
- Система типов: исправляет внутреннюю ошибку неявного преобразования строкового литерала в строку calldata.
- Система типов: устраняет неправильное сопоставление именованных параметров в перегруженных вызовах функций и событий, если порядок отличается от объявления.
- ViewPureChecker: предотвращает проверку видимости конструкторов.
0.7.1 (2020-09-02)
Языковые функции
- Разрешает определения функций вне контрактов, которые ведут себя подобно внутренним функциям библиотеки.
- Генератор кода: реализует копирование структур из calldata в хранилище.
Компилятор
- SMTChecker: добавляет переполнение и переполнение как условия проверки в механизме CHC.
- SMTChecker: поддерживает побитовые операции or, xor и not.
- SMTChecker: поддерживает условный оператор.
- Стандартный интерфейс JSON: не запускает генерацию байткода EVM, если запрашивается только вывод Yul IR или EWasm.
- Yul Optimizer: LoopInvariantCodeMotion может перемещать операции чтения за пределы циклов for, пока затронутая область не изменяется внутри цикла.
- Yul: сообщает об ошибке при использовании нестроковых литералов для datasize(), dataoffset(), linkersymbol(), loadimmutable() и setimmutable().
Исправление ошибок
-
AST: удаляет значения членов null, даже когда компилятор используется в режиме standard-json.
-
Общие: разрешает type(Contract).name для абстрактных контрактов и интерфейсов.
-
Неизменяемые объекты: запрещают присваивать неизменяемым объектам более одного раза во время их объявления.
-
Неизменяемые объекты: правильно обрабатывают сложное присваивание и инкремент/декремент как чтение и запись и, следовательно, запрещают это везде для неизменных переменных.
-
Оптимизатор: сохраняет побочные эффекты x в byte(a, shr(b, x)), даже если константы a и b сделали бы выражение равным нулю безоговорочно. Это правило оптимизатора очень сложно, если вообще возможно, вызвать таким образом, чтобы это привело к недопустимому коду.
-
Ссылки Resolver: исправляет внутреннюю ошибку при использовании конструктора для библиотеки.
-
Сканер: исправляет ошибку, из-за которой пробелы допускались в токене -> (например, function f() - > x {} становится недействительным в ассемблере и Yul).
-
SMTChecker: исправляет внутреннюю ошибку в BMC. Функция встраивания.
-
SMTChecker: исправление внутренней ошибки при неявном преобразовании массива.
-
SMTChecker: исправление внутренней ошибки при доступе к индексу фиксированных байтов.
-
SMTChecker: исправление внутренней ошибки с унарными операторами lvalue и кортежами.
-
SMTChecker: исправление внутренней ошибки при назначении кортежей.
-
SMTChecker: исправление внутренней ошибки для кортежей из одного элемента, имеющих тип кортежа.
-
SMTChecker: исправление ошибки при использовании импортированного кода.
-
SMTChecker: обеспечение надёжности операции «pop» для массива.
Проверка типов:
- запрет использования директивы «using for» внутри интерфейсов;
- запрет использования знаковых литералов в качестве показателя степени в операторе возведения в степень;
- запрет структур, содержащих вложенные отображения в памяти, в качестве параметров для библиотечных функций.
Оптимизатор Yul:
- обеспечение того, чтобы ключевые слова Yul не использовались ошибочно NameDispenser и VarNameCleaners (ошибка может привести к невозможности компиляции кода);
- повышение устойчивости порядка встраивания функций к наличию или отсутствию несвязанных исходных файлов.
0.7.0 (2020-07-28)
Изменения:
-
встраивание ассемблера: запрет точки («.») в именах пользовательских функций и переменных;
- доступ к слоту и смещению переменной указателя хранилища «x» осуществляется через «x.slot» и «x.offset» вместо «x_slot» и «x_offset»;
- маркировка шестнадцатеричных строковых литералов с помощью «kind: "hexString"»;
- удаление членов со значением null из вывода JSON;
- запрет «gwei» в качестве идентификатора;
- запрет синтаксиса точек для «value» и «gas»;
- запрет непечатаемых символов в строковых литералах;
- введение строковых литералов Unicode: «unicode"😃"»;
- разрешение комментариев NatSpec только для общедоступных переменных состояния;
- исключение деноминаций «finney» и «szabo»;
- замена идентификатора «now» на «block.timestamp»;
- влияние «using A for B» только на контракт, в котором оно упоминается, а не на все производные контракты;
- запрет virtual для библиотечных функций;
- запрет присваивания переменным состояния, содержащим вложенные сопоставления;
- запрет событий с одинаковыми именами и типами параметров в иерархии наследования;
- запрет сдвигов по знаковым типам;
- запрет структур и массивов в памяти или calldata, если они содержат вложенные сопоставления;
- возведение в степень и сдвиги литералов по нелитералам всегда будут использовать «uint256» или «int256» в качестве типа;
- запрет последовательных и конечных точек в идентификаторах (начальные точки уже запрещены);
- запрет EVM-инструкции pc().
Особенности языка:
- наследование: разрешение переопределения для более строгой изменчивости состояния: view может переопределить nonpayable, а pure — view;
- парсер: устаревание видимости для конструкторов;
- изменчивость состояния: не выдавать рекомендации по более строгой изменчивости для виртуальных функций, но выдавать их для функций, которые переопределяют.
Функции компилятора:
- SMTChecker: сообщение о контрпримерах с несколькими транзакциями, включая вызовы функций, инициирующие транзакции (не включает конкретные значения для ссылочных типов и реентерабельных вызовов).
- Переменные, объявленные с использованием ключевого слова var, больше не распознаются.
Исправления ошибок:
- неизменяемые объекты: исправление внутренней ошибки компилятора, когда неизменяемым объектам не присвоено значение;
- наследование: запрет публичных переменных состояния, перезаписывающих функции pure;
- NatSpec: согласованный вывод userdoc для конструкторов и функций;
- SMTChecker: исправление внутренней ошибки при присвоении значения 1-кортежу;
- SMTChecker: исправление внутренней ошибки, когда кортежи имеют лишние бессодержательные скобки;
- изменчивость состояний: постоянные общедоступные переменные состояния считаются функциями pure;
- проверка типов: устранение проблем с выводом при вызове функций с именованными аргументами.
0.6.12 (2020-07-22)
Особенности языка:
- NatSpec: реализация тега @inheritdoc для копирования документации из определённого базового контракта.
- Wasm backend: добавление i32.ctz, i64.ctz, i32.popcnt и i64.popcnt.
Функции компилятора: нет информации. Генератор кода: избегайте двойной очистки при копировании в память.
- Генератор кода: оценивайте «keccak256» строковых литералов во время компиляции.
- Оптимизатор: добавьте правило для удаления сдвигов внутри байт-кода операции.
- Оптимизатор Peephole: добавьте правило, чтобы удалить обмен после дублирования.
- Оптимизатор Peephole: удалите ненужное маскирование тегов.
- Yul EVM Code Transform: освободите слоты стека сразу после посещения правой части объявлений переменных, а не только в конце оператора.
Исправления ошибок:
- SMTChecker: исправление ошибки в событиях с индексами статического массива.
- SMTChecker: устранение внутренней ошибки при последовательном хранении массивов (push().push()).
- SMTChecker: устранение внутренней ошибки при использовании побитовых операторов над типом фиксированных байтов.
- SMTChecker: устранение внутренней ошибки при использовании составных побитовых операций присваивания на индексах массивов внутри ветвей.
- Type Checker: устранение внутренней ошибки компилятора, связанной с типами большого размера.
- Type Checker: исправление разрешения перегрузки в сочетании с {value: ...}.
Система сборки:
- Обновите внутреннюю зависимость jsoncpp до версии 1.9.3.
0.6.11 (2020-07-07)
Языковые функции:
- Общие: добавление единицы измерения «gwei».
- Yul: поддержка встроенного «linkersymbol» в автономном режиме сборки для ссылки на адреса библиотек.
- Yul: поддержка использования строковых литералов длиной более 32 байт в качестве аргументов для встроенных функций.
Функции компилятора:
- NatSpec: добавление полей «kind» и «version» к выводу JSON.
- NatSpec: наследование тегов от уникальных базовых функций, если производная функция их не предоставляет.
- Интерфейс командной строки: предотвращение совместного использования несовместимых параметров командной строки.
- NatSpec: поддержка комментариев NatSpec для событий.
- Yul Optimizer: сохранение знаний о хранилище/памяти после a := sload(x) / a := mload(x).
- SMTChecker: поддержка внешних вызовов неизвестного кода.
- Исходные карты: также помечайте переходы в функции Yul и из них как переходы в и из функций.
Исправление ошибок:
- NatSpec: не рассматривайте «////» и «/***» как комментарии NatSpec.
- Проверка типов: запретить конструкторы с расположением данных «calldata».
- Проверка типов: не запрещать присваивание переменным calldata.
- Проверка типов: исправление внутренней ошибки, связанной с использованием «using for» для небиблиотек.
- Wasm backend: исправление генерации кода для циклов for с предварительными операторами.
- Wasm backend: правильная поддержка i32.drop и i64.drop, удаление drop.
- Yul: запрет на использование одной и той же переменной несколько раз в левой части присваивания.
- Yul: исправление исходного местоположения многозначного присваивания переменной.
0.6.10 (2020-06-11)
Важные исправления ошибок:
- Исправлена ошибка, связанная с внутренними библиотечными функциями с параметрами calldata, вызываемыми через «using for».
Функции компилятора:
- Интерфейс командной строки: перегруппировка экрана справки.
- Вывод кодов ошибок компиляции в стандартном формате JSON и при использовании «--error-codes».
- Yul: предупреждение для операторов switch, которые имеют только значение по умолчанию и никаких других случаев.
Исправление ошибок:
- SMTChecker: исправление внутренней ошибки при кодировании кортежей кортежей.
- SMTChecker: исправление надёжности псевдонимов после нажатия на указатель массива.
- Система типов: исправление внутренней ошибки компилятора при внешнем вызове функции, возвращающей переменные с расположением calldata.
- Система типов: исправление ошибки, когда связанная функция не была найдена, если «using for» применяется к явным ссылочным типам.
0.6.9 (2020-06-04)
Языковые функции:
- Разрешить расположение calldata для всех переменных.
- NatSpec: поддержка комментариев NatSpec для переменных состояния.
- Yul: инструкция EVM «pc()» помечена как устаревшая и будет удалена в следующем критическом выпуске.
Функции компилятора:
-
Система сборки: обновление сборки soljson.js до emscripten 1.39.15 и boost 1.73.0 и включение Z3 для интегрированной поддержки SMTChecker без механизма обратного вызова.
-
Система сборки: переключение сборки emscripten с бэкэнда fastcomp на бэкэнд upstream.
-
Генератор кода: не создавайте новые внутренние исходные ссылки для небольших подпрограмм компилятора.
-
Интерфейс командной строки: добавлен новый параметр «—base-path PATH», чтобы использовать указанный путь в качестве корня. source tree (по умолчанию корневой каталог файловой системы)
-
SMTChecker: Поддержка массива «length».
-
SMTChecker: Поддержка массивов «push» и «pop».
-
SMTChecker: Общая поддержка BitVectors и побитового оператора «and».
Исправления ошибок:
- Генератор кода: Инициирование соответствующих ошибок при реализации определённых операций копирования массивов.
- Интерфейс командной строки: Устранение внутренней ошибки при использовании опций «—assemble» или «—yul» с «—machine ewasm», но без указания «—yul-dialect».
- NatSpec: Блок DocString завершается при обнаружении пустой строки.
- Оптимизатор: Исправление ошибки в BlockDeDuplicator.
- Сканер: Исправление ошибки, когда два пустых комментария NatSpec приводят к сканированию после EOL.
- SMTChecker: Исправление внутренней ошибки в предложениях try/catch с параметрами.
- SMTChecker: Исправление внутренней ошибки при применении арифметических операторов к переменным с фиксированной точкой.
- SMTChecker: Исправление внутренней ошибки при назначении доступа к индексу внутри ветвей.
- SMTChecker: Исправление внутренней ошибки при коротком замыкании булевых выражений с вызовами функций в инициализации переменных состояния.
- Проверка типов: Запрет присваивания переменным хранения типа «mapping».
- Проверка типов: Запрет встроенных массивов неименованных типов.
- Проверка типов: Запрещение использования override с непубличными переменными состояния.
- Проверка типов: Исправление внутренней ошибки компилятора при доступе к членам срезов массивов.
- Проверка типов: Исправление внутренней ошибки компилятора при прямой ссылке на нелитеральные константы из встроенной сборки.
- Проверка типов: Исправление внутренней ошибки компилятора при попытке декодировать слишком большие статические массивы.
- Проверка типов: Исправление неправильной ошибки компилятора при обращении к переопределённой функции без её вызова.
0.6.8 (2020-05-14)
Важные исправления ошибок:
- Добавление отсутствующей проверки callvalue в код создания контракта, который не определяет конструктор, но имеет базу, которая определяет конструктор.
- Запрет срезов массивов для массивов с динамически закодированными базовыми типами.
- Строковые литералы, содержащие символы обратной косой черты, больше не могут вызывать генерацию неправильного кода при передаче непосредственно вызовам функций или функциям кодирования, когда ABIEncoderV2 активен.
Функции языка:
- Реализованы «type(T).min» и «type(T).max» для каждого целочисленного типа T, которые возвращают наименьшее и наибольшее значение, представляемое типом.
Особенности компилятора:
- Интерфейс командной строки: Не игнорировать «—yul-optimizations» в режиме сборки.
- Разрешить использование функций кодирования abi для срезов массива calldata без явных приведений.
- Вывод двоичного файла Wasm: Реализовать «br» и «br_if».
Исправления ошибок:
- ABI: Пропускать конструкторы «private» или «internal».
- Исправлена ошибка «Assembly Exception in Bytecode», где запрошенные функции были сгенерированы дважды.
- Natspec: Исправлена ошибка, игнорировавшая тег «@return», когда другие теги документации разработчика отсутствовали.
- Проверка типов: Проверяет, является ли литеральный показатель степени в операции «**» слишком большим или дробным.
- Проверка типов: Запретить доступ к «runtimeCode» для типов контрактов, содержащих неизменяемые переменные состояния.
- Ассемблер Yul: Исправить исходное местоположение объявлений переменных без значения.
0.6.7 (2020-05-04)
Возможности языка:
- Добавить поддержку идентификаторов интерфейса EIP 165 с помощью type(I).interfaceId.
- Разрешить виртуальные модификаторы внутри абстрактных контрактов иметь пустое тело.
Компиляторные особенности:
- Оптимизатор: Упростить повторяющиеся операции AND и OR.
- Стандартный ввод Json: Поддерживать префикс «file://» в поле «urls».
- Добавьте опцию для указания шагов оптимизации, выполняемых оптимизатором Yul, с помощью «—yul-оптимизаций» в интерфейсе командной строки или optimizer.details.yulDetails.optimizerSteps в стандартном json.
Исправление ошибок:
-
SMTChecker: Исправить внутреннюю ошибку при использовании фиксированных точек.
-
SMTChecker: Исправить внутреннюю ошибку при использовании срезов массивов.
-
Проверка типов: запретить «virtual» и «override» для конструкторов.
-
Проверка типов: исправить несколько внутренних ошибок, выполняя проверки размера и рекурсивности типов перед полной проверкой типов.
-
Проверка типов: исправление внутренней ошибки при присвоении пустым кортежам.
-
Проверка типов: исправление внутренних ошибок. Ошибки при применении унарных операторов к кортежам с пустыми компонентами.
-
Проверка типов: Выполнить проверку рекурсивности для структур, объявленных на уровне файла.
Система сборки:
- soltest.sh: SOLIDITY_BUILD_DIR больше не является относительным к REPO_ROOT, чтобы разрешить создание каталогов сборки вне исходного дерева.
0.6.6 (2020-04-09)
Важные исправления ошибок:
- Исправить назначения кортежей с компонентами, занимающими несколько слотов стека и разным размером стека слева и справа.
Исправления ошибок:
- Экспорт AST: Экспортировать свойство immutable в поле mutability.
- SMTChecker: Исправить внутреннюю ошибку в механизме CHC при внутреннем вызове унаследованных функций.
- Проверка типов: Ошибка при попытке кодировать функции с установленными параметрами вызова gas и value.
0.6.5 (2020-04-06)
Важное исправление ошибок:
- Генератор кода: Ограничить длину динамических массивов памяти до 64 бит во время создания во время выполнения, устраняя возможный переполнение.
Особенности языка:
- Разрешить объявлять локальные переменные хранения без инициализации, если они назначены перед доступом.
- Переменные состояния могут быть помечены как immutable, что делает их доступными только для чтения, но присваиваемыми в конструкторе. Значение будет храниться непосредственно в коде.
Возможности компилятора:
- Интерфейс командной строки: Включить вывод макета хранилища с помощью --storage-layout.
- Метаданные: Добавлена поддержка IPFS-хэшей больших файлов, которые необходимо разделить на несколько фрагментов.
Исправление ошибок:
- Наследование: Разрешить публичным переменным состояния переопределять функции с динамическими типами памяти в возвращаемых значениях.
- Встроенная сборка: Исправить внутреннюю ошибку при доступе к недопустимым константным переменным.
- Встроенная сборка: Исправить внутреннюю ошибку при обращении к функциям.
- JSON AST: Всегда добавлять суффикс указателя для ссылочных типов памяти.
- Резолвер ссылок: Исправить внутреннюю ошибку при доступе к недопустимым членам структуры.
- Проверка типов: Исправить внутренние ошибки при назначении вложенных кортежей.
0.6.4 (2020-03-10)
Особенности языка:
- Общие: Устарело значение (...) и газ (...) в пользу {значение: ...} и {газ: ...}.
- Встроенная сборка: Разрешить присваивание _slot локальных переменных-указателей хранилища.
- Встроенная сборка: Выполнить анализ потока управления для встроенной сборки. Позволяет устанавливать возврат хранилища только в сборке.
Функции компилятора:
- AssemblyStack: Поддержка исходных местоположений (сопоставлений источников) и, следовательно, отладка источников Yul.
- Интерфейс командной строки: Включение вывода экспериментального оптимизированного IR через --ir-optimized.
Исправление ошибок:
- Наследование: Исправление некорректной ошибки при вызове нереализованных базовых функций.
- Резолвер ссылок: Исправление проблемы области видимости после операторов try/catch.
- Стандартный интерфейс JSON: Исправление ошибки, связанной с пустыми именами файлов и импортами.
- SMTChecker: Исправление внутренних ошибок при анализе кортежей.
- Импорт Yul AST: Правильный импорт блоков в виде операторов, операторов switch и строковых литералов.
0.6.3 (2020-02-18)
Особенности языка:
- Разрешить типы контрактов и перечисления в качестве ключей для сопоставлений.
- Разрешить использование селекторов функций в качестве констант времени компиляции.
- Сообщать о расположении источника для структурированных ошибок документации.
Функции компилятора:
- AST: Добавить новый узел для документирования в стиле doxygen, структурированной документации, которая может быть получена определениями контракта, функции, события и модификатора.
- Генератор кода: Использовать calldatacopy вместо codecopy для обнуления памяти после ввода.
- Отладка: Предоставить строки причин для внутренних возвратов, сгенерированных компилятором, при использовании параметра --revert-strings или настройки settings.debug.revertStrings в режиме отладки.
- Оптимизатор Yul: Удалять функции, вызывающие друг друга, но не имеющие других ссылок.
- SMTChecker: Поддержка CHC для внутренних вызовов функций.
Исправление ошибок:
- Сборка: Добавлено отсутствующее поле source в устаревшем выводе json для сборки, чтобы завершить ссылку на источник.
- Парсер: Исправить внутреннюю ошибку для abstract без contract.
- Проверка типов: Сделать недопустимые вызовы не вызываемых типов фатальными ошибками вместо обычных.
0.6.2 (2020-01-27)
Особенности языка:
-
Разрешить доступ к внешним функциям через имена контрактов и интерфейсов для... Получение их селектора.
-
Разрешить интерфейсам наследоваться от других интерфейсов.
-
Разрешить устанавливать газ и значение во внешних вызовах функций с помощью c.f{gas: 10000, value: 4 ether}()
.
-
Разрешить указывать соль для создания контрактов и, таким образом, код операции create2 с помощью new C{salt: 0x1234, value: 1 ether}(arg1, arg2)
.
-
Встроенное ассемблирование: поддержка литералов true и false.
Особенности компилятора:
- LLL: Компилятор LLL был удалён.
- Общие: Выдавать предупреждение, если байт-код времени выполнения превышает 24576 байтов (предел, введённый в Spurious Dragon).
- Общие: Поддержка компиляции начиная с импортированного AST. Среди прочего, это можно использовать для тестирования мутаций.
- Оптимизатор Yul: Применять штраф при попытке рематериализации в циклы.
Исправления ошибок:
- Интерфейс командной строки: Активировать оптимизатор Yul только при указании
--optimize
.
- Исправляет внутреннюю ошибку компилятора при явном вызове не реализованных базовых функций.
Система сборки:
- Перейти к созданию soljson.js со встроенным двоичным файлом wasm в кодировке base64.
0.6.1 (2020-01-02)
Исправление ошибок:
- Оптимизатор Yul: Исправление ошибки в средстве удаления избыточных присваиваний в сочетании с операторами break и continue.
0.6.0 (2019-12-17)
Изменения, нарушающие работу:
- ABI: Удалить устаревшие поля constant и payable.
- ABI: Поле type теперь является обязательным и больше не указывается по умолчанию равным function.
- AST: Встроенная сборка экспортируется как структурированный JSON вместо простой строки.
- C API (libsolc): Ввести параметр контекста как для solidity_compile, так и для обратного вызова.
- C API (libsolc): Предоставленный обратный вызов теперь принимает два параметра: kind и data. Обратный вызов может быть использован для различных целей, таких как импорт файлов и SMT-запросы.
- C API (libsolc): solidity_free был переименован в solidity_reset. Были добавлены функции solidity_alloc и solidity_free.
- C API (libsolc): solidity_compile теперь возвращает строку, которую необходимо явно освободить с помощью solidity_free().
- Интерфейс командной строки: Удалить текстовый принтер AST (
--ast
).
- Интерфейс командной строки: По умолчанию перейти на новый репортер об ошибках.
--old-reporter
возвращается к устаревшему старому репортеру об ошибках.
- Интерфейс командной строки: Добавить опцию для отключения или выбора метода хеширования между IPFS и Swarm для метаданных байт-кода.
- Общие сведения: Запретить явные преобразования из внешних типов функций в адрес и добавить член с именем address в качестве замены.
- Общие сведения: Включить оптимизатор Yul в стандартную оптимизацию.
- Общие сведения: Новые зарезервированные ключевые слова: override, receive и virtual.
- Общие сведения: private нельзя использовать вместе с virtual.
- Общие сведения: Разделить неназванные резервные функции на два случая, определённых с использованием fallback() и receive().
- Наследование: Теневое копирование переменных состояния теперь запрещено.
- Встроенная ассемблерная программа: Допускается только строгая встроенная ассемблерная программа.
- Встроенная ассемблерная программа: Объявления переменных не могут затенять объявления вне блока ассемблерной программы.
- JSON AST: Заменить атрибут superFunction на baseFunctions.
- Natspec JSON Interface: Правильно поддерживать несколько операторов @return в документации @dev и обеспечивать упоминание именованных параметров возврата в документации.
- Сопоставления источников: Добавить «глубина модификатора» в качестве пятого поля в сопоставлениях источников.
- Стандартный интерфейс JSON: Добавить опцию для отключения или выбора метода хэширования между IPFS и Swarm для метаданных байт-кода.
- Синтаксис: push(element) для динамических массивов хранения больше не возвращает новую длину.
- Синтаксис: Абстрактные контракты должны быть явно помечены как абстрактные с использованием ключевого слова abstract.
- Синтаксис: элемент length массивов теперь всегда доступен только для чтения, даже для массивов хранения.
- Проверка типов: Результирующий тип экспоненты равен типу основания. Также разрешите использование знаковых типов для основания.
Языковые особенности:
-
Разрешить явные преобразования от адреса к адресу payable через payable(...).
-
Разрешить глобальные перечисления и структуры.
-
Разрешить публичным переменным переопределять внешние функции.
-
Разрешить использование символов подчёркивания в качестве... Особенности компилятора:
-
Разрешить отмену строк в двоичном файле с помощью параметра --revert-strings или настройки settings.debug.revertStrings.
-
ABIEncoderV2: больше не выдавать предупреждения об использовании включённого ABIEncoderV2 (прагма всё ещё нужна).
0.5.17 (2020–03–17)
Исправления ошибок:
- Type Checker: запретить переопределение закрытых функций.
0.5.16 (2020–01–02)
Исправленные ошибки, перенесённые из предыдущих версий:
- Yul Optimizer: исправить ошибку в избыточном назначении при использовании операторов break и continue.
0.5.15 (2019–12–17)
Исправление ошибок:
- Yul Optimizer: исправить некорректную оптимизацию избыточной загрузки при работе с пользовательскими функциями, содержащими циклы с записью в память или хранилище.
0.5.14 (2019–12–09)
Языковые особенности:
- Получить селектор публичных или внешних библиотечных функций через член .selector.
- Поддержка констант, которые ссылаются на другие константы.
- Разделение шестнадцатеричных и обычных строковых литералов на несколько частей.
Особенности компилятора:
- Интерфейс командной строки: разрешить перевод с Yul / строгого ассемблера на EWasm с помощью команды solc --yul --yul-dialect evm --machine ewasm.
- Установить версию EVM по умолчанию как «Istanbul».
- SMTChecker: добавить поддержку конструкторов, включая наследование конструкторов.
- Yul: при компиляции через Yul строковые литералы из кода Solidity сохраняются как строковые литералы, если каждый символ можно безопасно распечатать.
- Оптимизация Yul: выполнять перемещение кода, инвариантное к циклам.
Исправления ошибок:
- SMTChecker: исправить внутреннюю ошибку при использовании abi.decode.
- SMTChecker: исправить внутреннюю ошибку при работе с массивами или отображениями функций.
- SMTChecker: исправить внутреннюю ошибку в массиве структур.
- Version Checker: ^0 должен соответствовать 0.5.0, но не предварительной версии.
- Yul: считать бесконечные циклы и рекурсию нерешаемыми.
Система сборки:
- Обновление до emscripten версии 1.39.3.
0.5.13 (2019–11–14)
Языковые функции:
- Получение адреса связанной библиотеки с помощью address(LibraryName).
Компиляторные функции:
- Генератор кода: использовать SELFBALANCE для address(this).balance, если используется Istanbul EVM.
- EWasm: экспериментальный вывод двоичного файла EWasm через --ewasm и как описано в standard-json.
- SMTChecker: поддержка break/continue в CHC-движке.
- SMTChecker: работа с присваиваниями многомерным массивам и отображениям.
- SMTChecker: наследование и переопределение функций.
- Стандартный интерфейс JSON: вывод макета хранилища контракта при запросе артефакта storageLayout.
- Проверка типов: список возможных кандидатов при неудачной перегрузке.
- Проверка типов: запрет переменных библиотечных типов.
Исправления ошибок:
- Генератор кода: исправлена ошибка в утверждении, которая ошибочно срабатывала для размеров массива, превышающих беззнаковое целое число.
- SMTChecker: исправление внутренней ошибки при доступе к индексам фиксированных байтов.
- SMTChecker: исправление внутренней ошибки при использовании указателей на функции в качестве аргументов.
- SMTChecker: исправление внутренней ошибки при неявном преобразовании строковых литералов в фиксированные байты.
- Проверка типа: запретить использование конструктора того же класса в качестве модификатора.
- Проверка типа: рассматривать магические переменные как неизвестные идентификаторы в ассемблерном коде.
- Генератор кода: исправление внутренней ошибки при попытке преобразовать super в другой тип.
0.5.12 (2019–10–01)
Функции языка:
-
Проверка типов: разрешить присваивание внешним аргументам функций, кроме ссылочных типов. Изменить порядок сортировки функций с селектора на вид, имя.
-
Оптимизатор: добавить правило, которое заменяет код операции BYTE на 0, если первый аргумент больше 31.
-
SMTChecker: добавить поддержку циклов в механизм CHC.
-
Yul Optimizer: учитывать отсутствие побочных эффектов пользовательских функций.
-
Yul Optimizer: удалить избыточные операции mload/sload.
-
Yul Optimizer: использовать тот факт, что условия ветвления имеют определённое значение внутри ветви.
Исправления ошибок:
- Генератор кода: исправить внутреннюю ошибку при извлечении динамического массива сопоставлений.
- Разрешитель имён: исправить неправильное исходное местоположение при предупреждении о затенённых псевдонимах в объявлениях импорта.
- Сканер: исправить анализ многострочных комментариев natspec с тройными косыми чертами, когда файл закодирован с помощью CRLF вместо LF.
- Система типов: исправить массивы рекурсивных структур.
- Yul Optimizer: исправить ошибку переупорядочения в связи со сдвинутыми инструкциями one и mul/div в условиях цикла for.
0.5.11 (2019-08-12)
Особенности языка:
- Встроенная сборка: поддержка прямых констант типа значения во встроенной сборке.
Функции компилятора:
- ABI: дополнительная внутренняя информация о типе в поле «internalType».
- eWasm: высокоэкспериментальный вывод eWasm с использованием «--ewasm» в интерфейсе командной строки или выбор вывода «ewasm.wast» в стандартном json.
- Метаданные: обновить хэш роя до текущей спецификации, изменить «bzzr0» на «bzzr1» и использовать URL-адреса «bzz-raw://».
- Стандартный интерфейс JSON: компилировать только выбранные источники и контракты.
- Стандартный интерфейс JSON: предоставить вторичные местоположения ошибок (например, исходное положение других конфликтующих объявлений).
- SMTChecker: не стирать знания об указателях хранения, если назначен другой указатель хранения.
- SMTChecker: поддерживать строковый литеральный тип.
- SMTChecker: новый алгоритм на основе Horn, который доказывает утверждения с помощью инвариантов многотранзакционных контрактов.
- Стандартный интерфейс JSON: предоставлять AST даже при ошибках, если установлен переключатель командной строки «--error-recovery» или StandardCompiler settings.parserErrorRecovery имеет значение true.
- Yul Optimizer: не встраивать функцию, если это приведёт к дублированию выражений, которые не являются дешёвыми.
Исправления ошибок:
- Декодер ABI: гарантировать, что декодированные массивы всегда указывают на отдельные области памяти.
- Генератор кода: правильно обрабатывать динамически закодированные, но статически заданные размеры массивов и структур в calldata.
- SMTChecker: исправить внутреннюю ошибку при встраивании функций, содержащих выражения кортежа.
- SMTChecker: исправить стирание знаний об указателе в циклах.
- SMTChecker: исправить внутреннюю ошибку при использовании составных побитовых операторов присваивания внутри ветвей.
- SMTChecker: исправить внутреннюю ошибку при встраивании функции, которая возвращает кортеж, содержащий неподдерживаемый тип внутри ветви.
- SMTChecker: исправить внутреннюю ошибку при встраивании функций, использующих переменные состояния и принадлежащих другому источнику.
- SMTChecker: исправить внутреннюю ошибку при сообщении контрпримеров относительно переменных состояния из разных исходных файлов.
- SMTChecker: исправить несоответствие сортировки SMT при использовании строковых литералов.
- Просмотр/Проверка чистоты: правильно определить доступ к переменной состояния через базовый класс.
- Анализатор Yul: проверить доступность объектов данных уже на этапе анализа.
- Yul Optimizer: исправить проблему, когда код доступа к памяти был удалён, хотя в программе использовался msize.
0.5.10 (2019-06-25)
Важные исправления ошибок:
- ABIEncoderV2: исправить некорректное кодирование abi массива хранилища данных, занимающего несколько слотов хранилища.
- Генератор кода: должным образом обнулять старшие биты элементов массива отрицательных чисел при назначении для хранения и одновременном преобразовании типа.
Функции компилятора:
- Интерфейс командной строки: экспериментальное восстановление после ошибок синтаксического анализа с помощью переключателя командной строки «--error-recovery» или логического значения StandardCompiler settings.parserErrorRecovery.
- Оптимизатор: добавьте правило для упрощения SUB(~0, X) до NOT(X).
- Yul Optimizer: заставить оптимизатор работать для всех диалектов Yul, включая eWasm.
Исправления ошибок:
-
Проверка типов: установить изменяемость состояния членов функционального типа «gas» и «value» как чистую (в то время как их возвращаемый тип... Данный текст затрагивает генерацию кода.
-
Система типов: разрешить прямой вызов функций базового класса, имеющих перегрузки.
-
Система типов: предупреждать о затенении встроенных переменных, если пользовательские переменные называются «this» или «super».
-
Yul: правильно регистрировать функции и запрещать затенение между функциональными переменными и переменными во внешней области видимости.
Система сборки:
- Soltest: добавить параметр командной строки «--test» / «-t» в isoltest, который принимает строку, позволяющую фильтровать модульные тесты.
- soltest.sh: разрешить использование переменной среды «SOLIDITY_BUILD_DIR» для указания папки сборки и добавить использование «—help».
0.5.7 (2019-03-26)
Важные исправления ошибок:
- ABIEncoderV2: исправить ошибки, связанные с загрузкой коротких типов значений из хранилища при кодировании массива или структуры из хранилища.
- ABIEncoderV2: устранить проблему переполнения буфера при кодировании упакованного массива из хранилища.
- Оптимизатор: исправить неправильный порядок аргументов в правиле оптимизации байтов для констант.
Особенности языка:
- вызовы функций с именованными аргументами теперь работают с перегруженными функциями.
Возможности компилятора:
- Ассемблерная вставка: выдавать ошибку при использовании «callvalue()» внутри неплатёжной функции (так же, как это уже делает «msg.value»).
- Стандартный интерфейс JSON: поддержка «Yul» в качестве входного языка.
- SMTChecker: показывать стек вызовов вместе с моделью, если применимо.
- SMTChecker: поддерживать модификаторы.
- Yul Optimizer: включить оптимизацию распределения стека по умолчанию, если оптимизатор Yul активен (отключить в «yulDetails»).
Исправления ошибок:
- Генератор кода: защитно дополнять память для «type(Contract).name» до кратного 32.
- Система типов: обнаруживать и запрещать внутренние указатели на функции в качестве параметров для публичных/внешних библиотечных функций, даже когда они вложены/обёрнуты в структуры, массивы или другие типы.
- Yul Optimizer: правильно определять, можно ли исключить переменную во время прохода сжатия стека.
- Парсер Yul / ассемблерной вставки: запретить более одного оператора case с одной и той же меткой внутри переключателя на основе целочисленного значения метки.
Система сборки:
- Установочные скрипты: исправить URL репозитория boost для CentOS 6.
- Soltest: исправить шестнадцатеричную строку в soltest.
0.5.6 (2019-03-13)
Важное исправление ошибок:
- Yul Optimizer: исправить ошибку порядка посещения для структурного упростителя.
- Оптимизатор: устранить переполнение в правиле оптимизации, которое упрощает двойной сдвиг на константу.
Особенности языка:
- Разрешить массивы calldata с динамически закодированными базовыми типами с помощью ABIEncoderV2.
- Разрешить динамически закодированные структуры calldata с помощью ABIEncoderV2.
Возможности компилятора:
- Оптимизатор: добавить правила для сравнений «lt» с константами.
- Peephole Optimizer: удалить двойной «iszero» перед «jumpi».
- SMTChecker: поддержка перечислений без приведения типа.
- SMTChecker: поддержка одномерных массивов.
- Type Checker: предоставлять улучшенные сообщения об ошибках для некоторых буквальных преобразований.
- Yul Optimizer: добавить правило для удаления пустых случаев по умолчанию.
- Yul Optimizer: добавить правило для удаления пустых случаев, если нет значения по умолчанию.
- Yul Optimizer: добавить правило замены переключателя без случаев на «pop(expression)».
Исправление ошибок:
- JSON ABI: описание библиотеки ABIs в формате JSON больше не содержит функций с внутренними типами, такими как структуры хранения.
- SMTChecker: исправить внутреннюю ошибку компилятора, когда контракт содержит слишком большое рациональное число.
- Система типов: определить, использует ли базовый контракт типы, требующие экспериментального кодировщика ABI, в то время как контракт всё ещё использует старый кодировщик.
Система сборки:
- Soltest: добавлена поддержка массивов в сигнатурах функций.
- Soltest: добавлена поддержка структурных массивов в сигнатуры функций.
- Soltest: добавлена поддержка выровненных по левому краю, неупакованных шестнадцатеричных строковых литералов.
0.5.5 (2019-03-05)
Особенности языка:
- Добавить поддержку геттеров отображений с типами ключей «string» или «bytes».
- Метапрограммирование: предоставить доступ к имени контрактов через «type(C).name».
Возможности компилятора:
-
Поддержка «petersburg» в качестве «evmVersion» и установка по умолчанию.
-
Интерфейс командной строки: опция активации экспериментального оптимизатора Yul с использованием «-optimize-yul».
-
Ассемблерная вставка: рассматривать «extcodehash» как часть Константинополя. Встроенные массивы типа отображения.
-
Проверка типов: рассмотрите абстрактную функцию, которая будет реализована с помощью публичной переменной состояния.
Система сборки:
-
CMake: LLL больше не собирается по умолчанию. Необходимо настроить его с помощью CMake как
-DLLL=ON
.
-
Docker: включает образы Scratch и Alpine.
-
Emscripten: обновитесь до Emscripten SDK 1.37.21 и boost 1.67.
Solc-Js:
- Исправьте обработку standard-json в исполняемом файле командной строки.
- Удалите поддержку nodejs 4.
0.5.0 (2018-11-13)
Как обновить код:
- Измените каждый
.call()
на .call("")
и каждый .call(signature, a, b, c)
на использование .call(abi.encodeWithSignature(signature, a, b, c))
(последний работает только для типов значений).
- Замените каждый
keccak256(a, b, c)
на keccak256(abi.encodePacked(a, b, c))
.
- Добавьте
public
к каждой функции и external
к каждой резервной или интерфейсной функции, которая ещё не определяет свою видимость.
- Сделайте свои резервные функции
external
.
- Явно укажите расположение данных для всех переменных типов struct, array или mapping (включая параметры функций), например, измените
uint[] x = m_x
на uint[] storage x = m_x
. Обратите внимание, что для внешних функций требуются параметры с расположением данных calldata
.
- Явно преобразуйте значения контрактного типа в адреса перед использованием члена
address
. Пример: если c
— это контракт, измените c.transfer(...)
на address(c).transfer(...)
.
- Объявите переменные и особенно аргументы функций как
address payable
, если вы хотите вызвать transfer
для них.
Изменения:
-
ABI Encoder: правильно дополняйте данные из calldata (msg.data
и внешние параметры функции). Используйте abi.encodePacked
для неупакованного кодирования.
-
C API (libsolc
/ raw soljson.js
): удалены методы version
, license
, compileSingle
, compileJSON
, compileJSONCallback
и заменены методами solidity_license
, solidity_version
и solidity_compile
.
-
Генератор кода: подписанный сдвиг вправо использует правильный арифметический сдвиг, то есть округление в сторону отрицательной бесконечности. Предупреждение: это может незаметно изменить семантику существующего кода!
-
Генератор кода: возврат во время выполнения, если calldata слишком короткий или указывает за пределы. Это делается внутри декодера ABI и поэтому также применяется к abi.decode()
.
-
Генератор кода: используйте STATICCALL
для функций pure
и view
. Это уже было в экспериментальном режиме 0.5.0.
-
Интерфейс командной строки: удалите устаревший параметр --formal
.
-
Интерфейс командной строки: переименуйте параметр --julia
в --yul
.
-
Интерфейс командной строки: требуется -
, если стандартный ввод используется в качестве источника.
-
Интерфейс командной строки: используйте хэш имени библиотеки вместо самого имени в качестве заполнителя ссылки.
-
Интерфейс компилятора: запретите переназначения с пустым префиксом.
-
Анализатор потока управления: учитывайте сопоставления при проверке неинициализированных возвращаемых значений.
-
Анализатор потока управления: превратите предупреждение о возврате неинициализированного указателя хранилища в ошибку.
-
Общее: continue
в цикле do...while
переходит к условию (раньше он переходил к телу цикла). Предупреждение: это может незаметно изменить семантику существующего кода.
-
Общее: запретить объявление пустых структур.
-
Общее: запретить необработанный callcode
(уже устарел в 0.4.12). Всё ещё можно использовать его через встроенную сборку.
-
Общее: запретить ключевое слово var
.
-
Общее: запретить псевдонимы sha3
и suicide
.
-
Общее: запретить оператор throw
. Это уже имело место в экспериментальном режиме 0.5.0.
-
Общее: запретить единицу измерения years
(уже устарело в 0.4.24).
-
Общее: ввести emit
в качестве ключевого слова вместо анализа его как идентификатора.
-
Общее: новые ключевые слова: calldata
и constructor
.
-
Общее: новые зарезервированные ключевые слова: alias
, apply
, auto
, copyof
, define
, immutable
, implements
, macro
, mutable
, override
, partial
, promise
, reference
, sealed
, sizeof
, supports
, typedef
и unchecked
.
-
Общее: удалить сборку. Инструкция aliases «sha3» и «suicide»:
-
Общие правила области видимости в стиле C99 теперь применяются. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Запрещено объединять шестнадцатеричные числа с единицами измерения (например, 0x1e wei). Это уже было реализовано в экспериментальном режиме 0.5.0.
-
JSON AST: удалить поля «constant» и «payable» (информация закодирована в поле «stateMutability»).
-
JSON AST: заменить поле «isConstructor» новым полем «kind», которое может быть «constructor», «fallback» или «function».
-
Интерфейс: удалить функцию «клонировать контракт». Опции командной строки «--clone-bin» и «--combined-json clone-bin» больше не доступны.
-
Решатель имён: не исключать публичные переменные состояния при поиске конфликтующих объявлений.
-
Оптимизатор: удалить последовательность «PUSH1 0 NOT AND», которая не выполняет никаких действий.
-
Парсер: запретить конечные точки, за которыми не следует число.
-
Парсер: удалить «constant» как модификатор изменчивости состояния функции.
-
Парсер: запретить верхний регистр X в литералах шестнадцатеричных чисел.
-
Проверка типов: запретить присваивания между кортежами с разным количеством компонентов. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить значения для констант, которые не являются константами времени компиляции. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить арифметические операции для логических переменных.
-
Проверка типов: запретить плотную упаковку литералов. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить вызов базовых конструкторов без скобок. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить преобразования между «bytesX» и «uintY» разного размера.
-
Проверка типов: запретить преобразования между несвязанными типами контрактов. Явное преобразование через «address» всё ещё возможно.
-
Проверка типов: запретить пустые операторы возврата для функций с одним или несколькими возвращаемыми значениями.
-
Проверка типов: запретить пустые компоненты кортежей. Это частично уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить объявления нескольких переменных с несоответствующим количеством значений. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить многократное указание аргументов базового конструктора в одной иерархии наследования. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить вызов конструктора с неправильным количеством аргументов. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: запретить неинициализированные переменные хранилища. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: обнаружение циклических зависимостей в переменных и структурах ограничено рекурсией до 256.
-
Проверка типов: требовать явное расположение данных для всех переменных, включая параметры функций. Это частично уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: принимать только один тип «bytes» для «.call()» (и семейства), «keccak256()», «sha256()» и «ripemd160()».
-
Проверка типов: функция fallback должна быть внешней. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: интерфейсные функции должны быть объявлены внешними. Это уже было реализовано в экспериментальном режиме 0.5.0.
-
Проверка типов: члены адреса больше не включаются в типы контрактов. Теперь требуется явное преобразование перед вызовом члена «адрес» из контракта.
-
Проверка типов: полностью запретить синтаксис «свободной сборки». Это означает, что метки переходов, переходы и нефункциональные инструкции больше нельзя использовать.
-
Система типов: запретить явные и неявные преобразования десятичных литералов в типы «bytesXX».
-
Система типов: запретить явные и неявные преобразования шестнадцатеричных литералов в типы «bytesXX» разного размера.
-
Система типов: различать оплачиваемые и неоплачиваемые типы адресов.
-
Проверяющий чистоту просмотра: запретить «msg.value» в (или введение его через модификатор) в неоплачиваемую функцию.
-
Удалить устаревший каталог «std» из репозитория Solidity. Доступ к https://github.com/ethereum/solidity/blob/develop/std/*.sol
(или https://github.com/ethereum/solidity/std/*.sol
в Remix) будет невозможен.
-
Resolver ссылок: Превращать отсутствующие места хранения в ошибку. Это уже имело место в экспериментальном режиме 0.5.0.
-
Проверка синтаксиса: Запретить использование модификаторов функциями без реализации. Это уже было реализовано в экспериментальном режиме версии 0.5.0.
-
Проверка синтаксиса: Именованные возвращаемые значения в типах функций являются ошибкой.
-
Проверка синтаксиса: Строго требовать спецификатора видимости для функций. Это уже имело место в экспериментальном режиме версии 0.5.0.
-
Проверка синтаксиса: Запрещать унарный оператор +
. Это уже имело место в экспериментальном режиме версии 0.5.0.
-
Проверка синтаксиса: Запрещать объявление переменной с одним оператором внутри тел if/while/for, которые не являются блоками.
-
Просмотр чистого чекер: Строго обеспечивать изменчивость состояния. Это уже имело место в экспериментальном режиме версии 0.5.0.
Особенности языка:
- Общие: Добавить
staticcall
к address
.
- Общие: Разрешить добавление ключевого слова
calldata
к типам, чтобы явно указать расположение данных для аргументов внешних функций.
- Общие: Поддержка
pop()
для массивов хранения.
- Общие: Правила области видимости теперь соответствуют стилю C99.
- Общие: Разрешить перечисления в интерфейсах.
- Общие: Разрешить указатели на хранение
mapping
в качестве аргументов и возвращаемых значений во всех внутренних функциях.
- Общие: Разрешить структуры в интерфейсах.
- Общие: Предоставить доступ к декодеру ABI через
abi.decode(bytes memory data, (...))
.
- Общие: Запретить нулевую длину для массивов фиксированного размера.
- Парсер: Принять тип
address payable
во время парсинга.
Функции компилятора:
- Система сборки: Добавлена поддержка версии Mojave для macOS.
- Генератор кода: Инструкция
CREATE2
была обновлена в соответствии с EIP1014 (также известным как «Skinny CREATE2»). Она также принимается как часть Константинополя.
- Генератор кода: Была добавлена инструкция
EXTCODEHASH
на основе EIP1052.
- Проверка типов: Более приятное сообщение об ошибке при попытке сослаться на перегруженные идентификаторы во встроенной сборке.
- Проверка типов: Показывать именованный аргумент в случае ошибки.
- Система типов: Тип IntegerType внутренне разделён на IntegerType и AddressType.
- Тесты: Определять статус транзакции во время вызовов IPC.
- Генератор кода: Выделение и освобождение локальных переменных в соответствии с их областью действия.
- Удалено
pragma experimental "v0.5.0"
.
- Проверка синтаксиса: Улучшено сообщение об ошибке для поиска в типах функций.
- Имя резолвера: Обновлённая функция поиска имени предложения учитывает длину идентификатора: 1 — поиск не производится, 2–3 — допускается не более одного изменения, 4– — допускается не более двух изменений.
- SMTChecker: Поддерживать вызовы внутренних функций, которые возвращают ни одного или одно значение.
Исправления ошибок:
-
Система сборки: Поддержка версий CVC4, связанных с CLN вместо GMP. В случае проблем с компиляцией из-за экспериментальной поддержки решателя SMT, решатели можно отключить при настройке проекта с помощью CMake, используя -DUSE_CVC4=OFF
или -DUSE_Z3=OFF
.
-
Тесты: Исправить параметры цепочки, чтобы тесты IPC работали с более новыми версиями cpp-ethereum.
-
Генератор кода: Исправление выделения байтовых массивов (слишком много памяти обнулялось).
-
Генератор кода: Правильно обрабатывать отрицательные числовые литералы в ABIEncoderV2.
-
Генератор кода: Не падать при использовании длины нуля для многомерных массивов фиксированного размера.
-
Интерфейс командной строки: Правильно обрабатывать пути с обратными косыми чертами в Windows.
-
Анализатор потока управления: Игнорировать не реализованные функции при обнаружении неинициализированных возвратов указателей на хранилище.
-
Исправить вывод NatSpec json для тегов @notice
и @dev
в определениях контрактов.
-
Оптимизатор: Правильно оценить затраты газа на константы для особых случаев.
-
Оптимизатор: Исправить ошибку инициализации правила упрощения, которая появилась на некоторых платформах emscripten.
-
Резольвер ссылок: Не падать при использовании суффиксов _slot
и _offset
по отдельности.
-
Резольвер ссылок: Применять storage
в качестве расположения данных для отображений.
-
Резольвер ссылок: Правильно обрабатывать недопустимые ссылки, используемые вместе с _slot
и _offset
. Отчёт об ошибке вместо сбоя утверждения, когда в качестве параметра функции используется необъявленный тип.
-
Ссылки на распознаватель: исправить проблему с высоким использованием процессора при использовании больших имён переменных. Предлагать только похожие имена, если идентификаторы короче 80 символов.
-
Проверка типов: расположение по умолчанию для преобразований типов (например, из литералов) — это память, а не хранилище.
-
Проверка типов: также запретить присваивания отображениям в назначениях кортежей.
-
Проверка типов: запретить упакованное кодирование массивов структур.
-
Проверка типов: разрешить присваивание локальным переменным типов сопоставления.
-
Проверка типов: учитывать массивы фиксированного размера при проверке рекурсивных структур.
-
Проверка типов: исправить сбои в ошибочных назначениях кортежа, в которых тип правой части не может быть определён.
-
Проверка типов: исправить зависание для отрицательных литералов с фиксированной точкой, близких к нулю, таких как -1e-100.
-
Проверка типов: динамические типы в качестве ключа для общедоступных отображений возвращают ошибку вместо сбоя подтверждения.
-
Проверка типов: исправить внутреннюю ошибку, когда значение индекса массива слишком велико.
-
Проверка типов: исправить внутреннюю ошибку, когда массив фиксированного размера слишком велик для кодирования.
-
Проверка типов: исправить внутреннюю ошибку для преобразования типов массивов.
-
Проверка типов: исправить внутреннюю ошибку, когда индекс массива не является беззнаковым.
-
Система типов: разрешать произвольные показатели степени для литералов с нулевой мантиссой.
-
Парсер: исправить неправильное исходное местоположение для безымянных параметров.
-
Интерфейс командной строки: исправить внутреннюю ошибку при компиляции stdin без содержимого и опции --ast.
Важные исправления ошибок:
-
Генератор кода: исправить процедуру инициализации неинициализированных внутренних функциональных указателей в контексте конструктора.
-
Система типов: использовать правильное имя типа для контрактов в параметрах событий при использовании в библиотеках. Это повлияло на генерацию кода.
Исправления ошибок:
-
ABIEncoderV2: отказаться от генерации потенциально ошибочного кода.
-
Общие: разделить список правил таким образом, чтобы среды JavaScript с небольшими стеками могли использовать компилятор.
Примечание: вышеуказанные изменения не включены в версию 0.5.0, поскольку они были перенесены.
Версия 0.4.25 (2018-09-12)
Важные исправления ошибок:
-
Генератор кода: правильно выполнить очистку для возведения в степень и типов, отличных от 256 бит.
-
Проверка типов: сообщить об ошибке при использовании индексированных структур в событиях с экспериментальным ABIEncoderV2. Раньше регистрировались неправильные значения.
-
Проверка типов: сообщить об ошибке при использовании структур в событиях без экспериментального ABIEncoderV2. Ранее это приводило к сбою или регистрации неправильных значений.
-
Парсер: рассмотреть все терминаторы юникод-строк (LF, VF, FF, CR, NEL, LS, PS) для однострочных комментариев и строковых литералов. Они недопустимы в строках и завершат комментарии.
-
Парсер: запретить незавершённые многострочные комментарии в конце ввода.
-
Парсер: рассматривать «/** /» как незавершённый многострочный комментарий.
Версия 0.4.24 (2018-05-16)
Особенности языка:
-
Генератор кода: используйте собственные инструкции сдвига на цели Константинополь.
-
Общие: разрешить объявлять несколько переменных как часть присвоения кортежу, например (uint a, uint b) = ...
-
Общие: удалить устаревший «constant» в качестве модификатора состояния функции из документации и тестов (но всё ещё оставить его как допустимую функцию).
-
Проверка типов: объявить устаревшим обозначение единицы измерения «years» и выдать предупреждение для него (или ошибку в качестве экспериментальной функции версии 0.5.0).
-
Проверка типов: сделать литералы (без явного приведения типов) ошибкой для плотной упаковки в качестве экспериментальной функции версии 0.5.0.
-
Проверка типов: выдавать предупреждение о назначениях с подстановочными знаками (это станет ошибкой в версии 0.5.0).
-
Проверка типов: предупреждать, когда keccak256, sha256 и ripemd160 не используются с одним аргументом байтов (предложить использовать abi.encodePacked(...)). Это станет ошибкой в версии 0.5.0.
Функции компилятора:
-
Система сборки: обновить внутреннюю зависимость jsoncpp до версии 1.8.4, которая обеспечивает большую строгость и снижает использование памяти.
-
Граф потока управления: добавить граф потока управления в качестве структуры анализа.
-
Граф потока управления: предупреждать о возврате неинициализированных указателей хранилища.
-
Оценка газа: исследовать только пути с более высокими затратами на газ. Снижает точность, но значительно повышает скорость оценки газа.
-
Оптимизатор: Убрать ненужную маскировку результата известных коротких инструкций (ADDRESS, CALLER, ORIGIN и COINBASE).
-
Парсер: Отображать более понятные сообщения об ошибках, показывая фактические токены, а не внутренние имена.
-
Парсер: Использовать всё местоположение токена, а не только его начальную позицию в качестве исходного местоположения для ошибок парсера.
-
Проверка SMT: Поддерживать переменные состояния целочисленного и логического типа.
Исправления ошибок:
- Генератор кода: Исправить revert с причиной, исходящей из состояния или локальной строковой переменной.
- Проверка типов: Показывать правильную ошибку при попытке emit не-события.
- Проверка типов: Предупреждать о пустых компонентах кортежа (это превратится в ошибку с версией 0.5.0).
- Проверка типов: Функции кодирования ABI являются чистыми и поэтому могут использоваться для констант.
0.4.23 (2018-04-19)
Функции:
- Система сборки: Поддержка Ubuntu Bionic.
- SMTChecker: Интеграция с CVC4 SMT решателем.
- Синтаксический анализатор: Предупреждение о функциях с именем «конструктор».
Исправление ошибок:
- Проверка типов: Улучшить сообщение об ошибке при неудачном разрешении перегрузки функций.
- Проверка типов: Не жаловаться на новый стиль конструктора и функцию отката, чтобы иметь одно и то же имя.
- Проверка типов: Обнаружить несколько объявлений конструктора в новом синтаксисе и старом синтаксисе.
- Проверка типов: Явное преобразование bytesXX в контракт должным образом запрещено.
0.4.22 (2018-04-16)
Функции:
- Генератор кода: Инициализировать массивы без использования msize().
- Генератор кода: Более специализированная и, следовательно, оптимизированная реализация для x.push(...).
- Интерфейс командной строки: Ошибка при обнаружении отсутствующего или недоступного файла. Подавить её с помощью флага --ignore-missing.
- Постоянный оценщик: Исправить оценку одноэлементных кортежей.
- Общие: Добавить процедуры кодирования abi.encodePacked, abi.encode, abi.encodeWithSelector и abi.encodeWithSignature.
- Общие: Добавить глобальную функцию gasleft() и объявить устаревшим msg.gas.
- Общие: Добавить глобальную функцию blockhash(uint) и объявить устаревшей block.hash(uint).
- Общие: Разрешить предоставление строки причины для revert() и require().
- Общие: Ввести новый синтаксис конструктора с использованием ключевого слова constructor в качестве экспериментальной функции версии 0.5.0.
- Общие: Ограничить количество ошибок, выводимых за один запуск, до 256.
- Общие: Поддержка доступа к динамическим данным возврата в пост-византийских EVM.
- Общие: Разрешить использование символов подчёркивания в числовых и шестнадцатеричных литералах для разделения тысяч и квадов.
- Наследование: Ошибка при использовании пустых скобок для конструкторов базового класса, требующих аргументов, в качестве экспериментальной функции версии 0.5.0.
- Наследование: Ошибка при использовании круглых скобок в вызовах конструкторов в стиле модификатора в качестве экспериментальной функции версии 0.5.0.
- Интерфейсы: Разрешить переопределение внешних функций в интерфейсах с public в реализующем контракте.
- Оптимизация: Оптимизировать SHL и SHR только с участием констант (только Константинополь).
- Оптимизация: Удалить бесполезную инструкцию SWAP1, предшествующую коммутативной инструкции (например, ADD, MUL и т. д.).
- Оптимизация: Заменить операторы сравнения (LT, GT и т.д.) на противоположные, если им предшествует SWAP1, например, SWAP1 LT заменяется на GT.
- Оптимизация: Оптимизировать через mload, если msize() не используется.
- Статический анализатор: Ошибка при дублировании вызовов суперконструктора в качестве экспериментальной функции версии 0.5.0.
- Анализатор синтаксиса: Выдать предупреждение для пустых структур (или ошибку в качестве экспериментальной функции версии 0.5.0).
- Анализатор синтаксиса: Предупредить о модификаторах функций без реализации (это станет ошибкой с версии 0.5.0).
- Тесты синтаксиса: Добавить исходные местоположения к ожиданиям тестов синтаксиса.
- Проверка типов: Улучшение документации и предупреждений для доступа к членам контракта, унаследованным от адреса.
Исправление ошибок:
- Генератор кода: Разрешить block.blockhash без вызова.
- Генератор кода: Не включать внутренние функции в байт-код времени выполнения, которые упоминаются только в конструкторе.
- Генератор кода: Правильно пропустить ненужную очистку массива хранения, когда длина не уменьшается. Генератор: исправление ошибки в поиске модификаторов в библиотеках.
- Генератор кода: реализация упакованного кодирования внешних типов функций.
- Генератор кода: рассматривать пустой список аргументов базового конструктора как не предоставленный.
- Генератор кода: правильно принудительно очищать типы bytesXX для сокращения преобразований.
- Интерфейс командной строки: исправить сообщения об ошибках для импортированных файлов, которые не существуют.
- Интерфейс командной строки: корректно поддерживать «--evm-version constantinople».
- Парсер DocString: исправить сообщение об ошибке для пустых описаний.
- Оценщик газа: правильно игнорировать затраты резервной функции для других функций.
- AST JSON: удалить квалификатор хранилища для строк типа имени.
- Анализатор синтаксиса: исправить внутреннюю ошибку компилятора при анализе объявления var без идентификатора.
- Анализатор синтаксиса: исправить анализ геттеров для переменных типа функции.
- Стандартный JSON: корректно поддерживать константинополь как evmVersion.
- Статический анализатор: исправить недетерминированный порядок предупреждений о неиспользуемых переменных.
- Статический анализатор: недопустимая арифметика с постоянными выражениями вызывает ошибки.
- Проверка типов: исправить обнаружение рекурсивных структур.
- Проверка типов: исправить асимметрию ошибки при сравнении с литералами чисел.
- Система типов: улучшить сообщение об ошибке при попытке сдвинуть дробное количество.
- Система типов: сделать внешние библиотечные функции доступными.
- Система типов: предотвратить кодирование странных типов.
- Система типов: ограничить рациональные числа до 4096 бит.
0.4.21 (2018-03-07)
Особенности:
- Генератор кода: утверждать, что k != 0 для mulmod(a, b, k) и addmod(a, b, k), как экспериментальная функция версии 0.5.0.
- Генератор кода: не сохранять газ в вызовах (кроме случаев, когда версия EVM установлена на homestead).
- Генератор кода: использовать opcode STATICCALL для вызова view и pure функций как экспериментальную функцию версии 0.5.0.
- Общие: правила области видимости C99/C++ (вместо области видимости функций JavaScript) действуют как экспериментальная функция версии v0.5.0.
- Общие: улучшенное сообщение при ошибке охватывает несколько строк исходного файла.
- Общие: поддержка и рекомендация использования emit EventName(); для явного вызова событий.
- Встроенное ассемблерное программирование: применять строгий режим как экспериментальную функцию версии 0.5.0.
- Интерфейс: предоставить возможность выбора целевой версии EVM (homestead или byzantium, по умолчанию — byzantium).
- Стандартный JSON: отклонять плохо отформатированные входные данные недействительного JSON.
- Проверка типов: запретить неинициализированные указатели хранения как экспериментальную функцию версии 0.5.0.
- Анализ синтаксиса: не предупреждать об экспериментальных функциях, если они не касаются генерации кода.
- Анализ синтаксиса: не предупреждать о pragma experimental "v0.5.0" и не устанавливать экспериментальный флаг в байт-коде для этого.
- Синтаксический анализатор: пометить throw как ошибку как экспериментальную функцию версии 0.5.0.
- Синтаксический анализатор: выдать ошибку, если видимость не указана для функций контракта как экспериментальной функции версии 0.5.0.
- Синтаксический анализатор: выдавать предупреждение при использовании перегрузок адреса для экземпляров контрактов.
- Проверка типов: запрещать объединение шестнадцатеричных чисел и единиц измерения как экспериментальную функцию версии 0.5.0.
Исправления ошибок:
- Ассемблер: вызывать ошибку при больших числовых литералах в ассемблере.
- JSON-AST: добавить свойство «документация» к определению функций, событий и модификаторов.
- Решатель: правильно определять затенение для импорта с псевдонимами.
- Автономная сборка: не игнорировать ввод после закрывающей фигурной скобки верхнего уровня блока.
- Стандарт JSON: правильно обрабатывать ошибки при передаче недопустимых источников.
- Стандарт JSON: гарантировать, что предоставленные адреса библиотек имеют правильную длину и шестнадцатеричный префикс.
- Проверка типов: правильно определить, какие типы массивов и структур не поддерживаются старым кодировщиком ABI.
- Проверка типов: правильно предупреждать при использовании _offset и _slot для констант во встроенной сборке.
- Интерфейс командной строки: выдавать ошибку, если опция неизвестна.
0.4.20 (2018-02-14)
Функции:
-
Генератор кода: предотвращать прямой вызов не являющихся view функций в библиотеках (в отличие от вызова через delegatecall).
-
Интерфейс командной строки: поддерживать строгий режим сборки (запрещающий переходы, операционные коды инструкций и т. д.) с помощью переключателя «--strict-assembly». Экспериментальный ABIEncoderV2.
-
Генератор кода: Частичная поддержка передачи структур в качестве аргументов и возвращаемых параметров (на данный момент требуется прагма experimental ABIEncoderV2).
-
Общее: Поддержка прагмы experimental «v0.5.0» для активации предстоящих критических изменений.
-
Общее: Добавлен член .selector во внешние типы функций для получения их сигнатуры.
-
Оптимизатор: Добавление нового шага оптимизации для удаления неиспользуемых JUMPDEST.
-
Статический анализатор: Предупреждение при использовании устаревших встроенных функций sha3 и suicide (заменены на keccak256 и selfdestruct, введены в 0.4.2 и 0.2.0 соответственно).
-
Синтаксический анализатор: Предупреждение, если видимость не указана для функций контракта.
-
Анализатор типов: Отображение полезного предупреждения для неиспользуемых аргументов функции/возвращаемых параметров.
-
Анализатор типов: Не показывать одну и ту же ошибку несколько раз для событий.
-
Анализатор типов: Значительно уменьшить количество повторяющихся ошибок, отображаемых для повторяющихся конструкторов и функций.
-
Анализатор типов: Предупреждать об использовании литералов в качестве параметров плотной упаковки в keccak256, sha3, sha255 и ripemd160.
-
Анализатор типов: Принудительное применение view и pure.
-
Анализатор типов: Применение view / constant с ошибкой в качестве экспериментальной функции версии 0.5.0.
-
Анализатор типов: Применение fallback-функций как external в качестве экспериментальной функции версии 0.5.0.
Исправления ошибок:
-
ABI JSON: Включить все перегруженные события.
-
Парсер: Исправление сбоя, связанного с parseTypeName.
-
Анализатор типов: Разрешить константные байтовые массивы.
Версия 0.4.16 (2017-08-24)
Новые возможности:
-
ABI JSON: Добавить новое поле stateMutability со значениями pure, view, nonpayable и payable.
-
Анализатор: Экспериментальная частичная поддержка SMT-контролёра Z3 («SMTChecker»).
-
Система сборки: Общие библиотеки (libsolutil, libevmasm, libsolidity и liblll) больше не создаются в процессе сборки.
-
Генератор кода: Экспериментальная новая реализация кодировщика ABI, который может кодировать произвольно вложенные массивы (ABIEncoderV2).
-
Метаданные: Хранить экспериментальный флаг в метаданных CBOR.
-
Парсер: Отображать предыдущий спецификатор видимости в ошибке, если найдено несколько.
-
Парсер: Ввести ключевые слова pure и view для функций, ключевое слово constant остаётся псевдонимом для view, а чистота пока не применяется, поэтому используйте с осторожностью.
-
Статический анализатор: Предупреждения о больших структурах хранения.
-
Синтаксический анализатор: Поддержка pragma experimental для включения экспериментальных функций.
-
Анализатор типов: Более подробное сообщение об ошибке для недопустимых переопределений.
-
Анализатор типов: Предупреждение о сдвиге литерала.
Исправления ошибок:
-
Ассемблерный парсер: Более строго относиться к числовым литералам.
-
Ассемблерный парсер: Ограничить максимальную глубину рекурсии.
-
Парсер: Обеспечить запятые между элементами массива и кортежа.
-
Парсер: Ограничение максимальной глубины рекурсии.
-
Анализатор типов: Исправление сбоя, связанное с using.
-
Анализатор типов: Запретить конструкторы в библиотеках.
-
Анализатор типов: Отклонить создание интерфейсных контрактов с использованием оператора new.
Версия 0.4.15 (2017-08-08)
Новые функции:
- Анализатор типов: Показывать нереализованную функцию при попытке создать экземпляр абстрактного класса.
Исправления ошибок:
-
Генератор кода: .delegatecall() всегда должен возвращать результат выполнения.
-
Генератор кода: Предоставить «новый счётчик газа» для низкоуровневых callcode и delegatecall.
-
Анализатор типов: Конструкторы должны быть реализованы, если объявлены.
-
Анализатор типов: Запрет модификатора .gas() для ecrecover, sha256 и ripemd160.
-
Анализатор типов: Не отмечать перегруженные функции как затеняющие другие функции.
-
Анализатор типов: Внутренние библиотечные функции должны быть реализованы, если они объявлены.
Версия 0.4.14 (2017-07-31)
Новые функции:
-
C API (jsonCompiler): Экспорт метода license.
-
Генератор кода: Оптимизация резервной функции путём удаления бесполезного перехода.
-
Встроенная сборка: Полезное сообщение об ошибке при попытке доступа к переменным calldata.
-
Встроенная сборка: Поддержка объявления переменных без начального значения (по умолчанию равно 0).
-
Метаданные: Включаются только файлы, которые использовались для компиляции данного контракта.
-
Анализатор типов: Запрещение передачи значений контрактам без * Функция payable fallback.
-
Проверка типов: включение типов в явное сообщение об ошибке преобразования.
-
Проверка типов: выдача соответствующей ошибки для массивов, слишком больших для кодирования ABI.
-
Проверка типов: предупреждение при использовании «this» в конструкторе.
-
Проверка типов: предупреждение о перезаписи существующих символов, включая встроенные.
Исправления ошибок:
- Генератор кода: правильное освобождение области памяти возврата для ecrecover.
- Проверка типов: исправление сбоя для некоторых назначений не-lvalue.
- Проверка типов: устранение недопустимого предупреждения «указать ключевое слово хранения» для ссылочных членов структур.
- Проверка типов: маркировка модификаторов как внутренних.
- Проверка типов: повторное разрешение нескольких упоминаний одного и того же модификатора для функции.
0.4.13 (2017-07-06)
Функции:
- Синтаксический анализатор: замена «throw» на require(), assert() и revert().
- Проверка типов: предупреждение, если локальная переменная ссылки на хранилище явно не использует ключевое слово «storage».
Исправление ошибок:
- Генератор кода: правильная отмена регистрации переменных-модификаторов.
- Интерфейс компилятора: вывод AST только в случае успешного анализа.
- Вывод ошибок: не опускать тип ошибки.
0.4.12 (2017-07-03)
Функции:
- Ассемблер: добавление инструкций CREATE2 (EIP86), STATICCALL (EIP214), RETURNDATASIZE и RETURNDATACOPY (EIP211).
- Ассемблер: отображение вспомогательных данных в выводе ассемблера.
- Ассемблер: переименование SHA3 в KECCAK256.
- AST: экспорт всех атрибутов в формат JSON.
- C API (jsonCompiler): использование стандартного JSON I/O внутри.
- Генератор кода: добавлена система шаблонов Whiskers.
- Встроенное ассемблирование: операторы for и switch.
- Встроенное ассемблирование: определения функций и вызовы функций.
- Встроенное ассемблирование: введение keccak256 в качестве кода операции. sha3 по-прежнему является допустимым псевдонимом.
- Встроенное ассемблирование: предоставление соответствующего сообщения об ошибке при недостаточном количестве аргументов для функциональной инструкции.
- Встроенное ассемблирование: предупреждение при затенении переменных Solidity инструкциями.
- Встроенное ассемблирование: предупреждение при использовании jump.
- Удаление устаревшего вывода Why3.
- Проверка типов: обеспечение строгой проверки UTF-8.
- Проверка типов: предупреждение о копиях в хранилище, которые могут неожиданно перезаписать данные.
- Проверка типов: предупреждение об определении типа из буквальных чисел.
- Статический анализатор: предупреждение об устаревании callcode.
Исправление ошибок:
-
Ассемблер: пометка MLOAD как имеющая побочные эффекты в оптимизаторе.
-
Генератор кода: исправление кодирования ABI пустой литеральной строки.
-
Генератор кода: исправление проверок отрицательного размера стека.
-
Генератор кода: использование REVERT вместо INVALID для сгенерированных процедур проверки ввода.
-
Встроенное ассемблирование: применение аргументов функции при анализе функциональных инструкций.
-
Оптимизатор: запрет оптимизаций, включающих MLOAD, поскольку он изменяет MSIZE.
-
Статический анализатор: больше не выдаются предупреждения о неиспользуемых переменных для переменных, используемых во встроенном ассемблировании.
-
Проверка типов: исправление литералов адресов, не рассматриваемых как константы времени компиляции.
-
Проверка типов: исправлен сбой, связанный с не вызываемыми типами.
-
Проверка типов: устранён segfault с постоянными параметрами функции.
-
Проверка типов: запрещено сравнение между типами сопоставления и внутренними функциями.
-
Проверка типов: запрещён повторный вызов одного и того же модификатора.
-
Проверка типов: не рассматривать строки, похожие на адреса, как адреса.
-
Проверка типов: поддержка действительных, но неправильно отклонённых последовательностей UTF-8. Быть сделано для обновления:
-
Добавить payable ко всем функциям, которые хотят получить эфир (включая конструктор и функцию fallback).
-
Заменить _ на _; в модификаторах.
-
Добавить прагму версии к каждому файлу: pragma solidity ^0.4.0;.
Изменения:
-
Исходные файлы должны указывать версию компилятора, с которой они совместимы, используя, например, pragma solidity ^ 0.4.0; или pragma solidity >=0.4.0 <0.4.8;.
-
Функции, которые хотят получать эфир, должны иметь новый модификатор payable (в противном случае они выдают ошибку).
-
Контракты, которые хотят получать Эфир с помощью простого «send», должны реализовать функцию fallback с модификатором payable. Контракты теперь выдают ошибку, если не определена функция payable fallback и ни одна из функций не соответствует сигнатуре.
-
Создание контракта через «new» приводит к ошибке.
-
Деление / модуль на ноль приводит к ошибке.
-
Вызов функции приводит к ошибке, если целевой контракт не имеет кода.
-
Модификаторы должны содержать _ (используйте if (false) _ в качестве обходного пути, если это необходимо).
-
В модификаторе после _ возврат не пропускает часть.
-
Оператор-заполнитель _ в модификаторе теперь требует явного ;.
-
ecrecover теперь возвращает ноль, если входные данные искажены (ранее он возвращал мусор).
-
Ключевое слово constant нельзя использовать для конструкторов или функции fallback.
-
Удалено --interface (интерфейс Solidity) опция вывода.
-
JSON AST: общая очистка, многие узлы переименованы в соответствии с их именами C++.
-
Вывод JSON: srcmap-runtime переименован в srcmapRuntime.
-
Перемещение (и переработка) стандартных библиотечных контрактов из компилятора в github.com/ethereum/solidity/std (import "std"; или import owned; больше не работают).
-
Убрано запутанное и недокументированное ключевое слово after.
-
Новые зарезервированные слова: abstract, hex, interface, payable, pure, static, view.
Функции:
-
Шестнадцатеричные строковые литералы: hex"ab1248fe".
-
Внутренняя: встроенная сборка, используемая генератором кода.
-
Интерфейс командной строки: использование - в качестве имени файла позволяет читать из stdin.
-
Интерфейсный JSON: функция fallback теперь является частью ABI.
-
Интерфейс: строка версии теперь совместима с SemVer.
-
Генератор кода: не предоставляйте «новый счётчик газа», если мы знаем, что вызываемая учётная запись существует.
Исправления ошибок:
-
JSON AST: узлы были добавлены не к тому родителю.
-
Переводчик Why3: исправление сбоя при возведении в степень.
-
Интерфейс командной строки: связывание библиотек с символами подчёркивания в их именах.
-
Проверка типов: функция fallback больше не может возвращать данные.
-
Генератор кода: исправление сбоя, когда sha3() использовался для неподдерживаемых типов.
-
Генератор кода: вручную установите надбавку за газ для .send(0).
Много изменений в документации, в основном благодаря добровольным внешним участникам.
0.3.6 (2016-08-10)
Функции:
-
Формальная верификация: учитывайте внешние эффекты контракта.
-
Проверка типа: предупреждение о неиспользуемом возвращаемом значении низкоуровневых вызовов и отправки.
-
Выходные данные: исходное местоположение и идентификатор узла как часть выходных данных AST.
-
Выходные данные: сопоставление исходного местоположения для байт-кода.
-
Выходные данные: формальная проверка как часть вывода json компилятора.
Исправление ошибок:
-
Интерфейс командной строки: не сбой, если ввод взят из stdin.
-
Сканер: правильно поддерживает коды Unicode в строках.
-
Вывод JSON: исправить ошибку об относительных / абсолютных именах исходных файлов.
-
Вывод JSON: исправить ошибку о недопустимых строках utf8.
-
Генератор кода: динамическое выделение пустого массива вызвало бесконечный цикл.
-
Генератор кода: правильно рассчитать требования к газу для memcpy precompile.
-
Оптимизатор: очистить известное состояние, если два пути кода объединены.
0.3.5 (2016-06-10)
Функции:
- Зависимое от контекста переназначение путей (разные модули могут использовать одну и ту же библиотеку в разных версиях).
Исправление ошибок:
-
Проверка типов: динамические типы возврата были удалены при извлечении данных из внешних вызовов, теперь они заменяются «неиспользуемым» типом.
-
Проверка типов: переопределения конструкторами рассматривались как делающие функцию неабстрактной.
0.3.4 (2016-05-31)
Никаких изменений вне документации.
0.3.3 (2016-05-27)
Разрешить внутреннюю библиотеку. Функции, которые должны быть вызваны (путём «встраивания»):
- Дробные/рациональные константы (используются только с типами с фиксированной точкой, которые всё ещё находятся в разработке).
- Встроенной сборке доступен доступ к внутренним функциям (как метки перехода).
- При запуске solc без аргументов на терминале будет выведена справка.
- Исправление: устранён некоторый недетерминизм в генерации кода.
- Исправление: исправлено использование not / bnot / iszero во встроенной сборке.
- Исправление: перед сравнением правильно очищены байты NN.
0.3.2 (2016-04-18)
- Исправление: парсер встроенной сборки: байт-код операции был непригоден для использования.
- Исправление: отчёт об ошибках: токены для типов переменного размера не были должным образом преобразованы в строку.
- Исправление: динамические массивы структур удалялись неправильно.
- Исправление: статические массивы в списке параметров конструктора декодировались неправильно.
0.3.1 (2016-03-31)
- Встроенная сборка.
- Исправление: генерация кода: доступ к массиву с узкими типами не очищал старшие биты.
- Исправление: отчёты об ошибках: отчёты об ошибках с неизвестным исходным местоположением вызывали сбой.
0.3.0 (2016-03-11)
Изменения:
- Добавлены новые ключевые слова: assembly, foreign, fixed, ufixed, fixedNxM, ufixedNxM (для различных значений M и N), timestamp.
- Деление числовых констант не округляется до целого числа, а до типа с фиксированной точкой (например, 1 / 2 != 1, но 1 / 2 == 0,5).
- Вызовы библиотек теперь по умолчанию используют DELEGATECALL (например, вызываемые библиотечные функции видят то же значение, что и вызывающая функция для msg.value и msg.sender).
- <адрес>.delegatecall как низкоуровневый интерфейс вызова.
Исправления:
- Исправлена ошибка оптимизатора, приводившая к неправильным сравнениям.
0.2.2 (2016-02-17)
- Доступ к индексам для типов bytes1, ..., bytes32 (на данный момент только чтение).
- Исправление: сбой проверки типов при неправильном количестве базовых параметров конструктора.
0.2.1 (2016-01-30)
- Встраивание массивов, т. е. var y = [1, x, f()]; если существует общий тип для 1, x и f(). Обратите внимание, что результатом всегда является массив памяти фиксированной длины, и преобразование в массивы памяти динамической длины пока невозможно.
- Импорт, аналогичный импорту ECMAScript6 (import «abc.sol» as d и import {x, y} from «abc.sol»).
- Компилятор командной строки solc автоматически разрешает отсутствующие импорты и позволяет использовать «включаемые каталоги».
- Условное выражение: x ? y : z.
- Исправления: исправлен ряд ошибок, когда оптимизатор генерировал недопустимый код.
- Исправления: перечисления и структуры были недоступны другим контрактам.
- Исправления: устранена ошибка сегментации, связанная с типами параметров функций, возникающая во время оценки газа.
- Исправления: сбой проверки типов при неправильном количестве основных параметров конструктора.
- Разрешены перегрузки функций с разными типами массивов.
- Разрешено присваивание типа (x) = 7.
- Тип uint176 был недоступен.
- Сбой проверки типов, связанный с вызовами конструкторов, устранён.
- Устранён сбой генерации кода, связанный с недопустимыми средствами доступа к типам структур.
- Устранён сбой генерации кода, связанный с вычислением хэша типа структуры.
0.2.0 (2015-12-02)
-
Изменение: new ContractName.value(10)() должен быть записан как (new ContractName).value(10).
- Добавлено selfdestruct как псевдоним для suicide.
- Распределение массивов памяти с использованием new.
- Связывание библиотечных функций с типами через using x for y.
- addmod и mulmod (модульное сложение и модульное умножение с произвольной промежуточной точностью).
- Исправления: параметры конструктора типа фиксированного массива читались неправильно.
- Исправления: распределение памяти для структур, содержащих массивы или строки.
- Исправления: расположение данных для явных параметров памяти в библиотеках было установлено в хранилище.
0.1.7 (2015-11-17)
-
Улучшены сообщения об ошибках для неожиданных токенов.
-
Доказательство концепции транскомпиляции в why3 для формальной верификации контрактов.
-
Исправления: массивы (также строки) в качестве индексированных параметров событий.
-
Исправления: запись в элементы байтов или строк перезаписывает другие.
-
Исправления: «Блок-преемник не найден» в Windows.
-
Исправления: использование строковых литералов в кортежах.
-
Исправления: работа с недействительным хеш-кодом фиксации в версии. 0.1.6 (2015-10-16)
-
Исправление ошибки: некоторые исправления в тестовом фреймворке для Windows.
-
Метод .push()
для динамических массивов хранения.
-
Выражения кортежей ((1, 2, 3)
или return (1, 2, 3);
).
-
Объявление и присвоение нескольких переменных (var (x, y,) = (1, 2, 3, 4, 5);
или var (x, y) = f();
).
-
Деструктурирующее присваивание ((x, y,) = (1, 2, 3)
).
-
Исправление ошибки: внутренняя ошибка, связанная с использованием библиотечной функции с недопустимыми типами.
-
Исправление ошибки: корректный анализ Library.structType a
на уровне операторов.
-
Исправление ошибки: корректное сообщение о расположении источника выражений в скобках (как часть «кортежной» истории).
0.1.5 (2015-10-07)
- Критическое изменение в кодировке хранения: кодирование коротких массивов байтов и строк вместе с их длиной в хранилище.
- Сообщение о предупреждениях.
- Разрешение типов ссылок на хранилище для публичных функций библиотеки.
- Доступ к типам, объявленным в других контрактах и библиотеках через
.
.
- Версия штампа в начале байт-кода библиотек во время выполнения.
- Исправление ошибки: проблема с инициализированными строковыми переменными состояния и динамическими данными в конструкторе.
- Исправление ошибки: автоматическое разрешение зависимостей, связанных с
new
.
- Исправление ошибки: разрешение четырёх индексированных аргументов для анонимных событий.
- Исправление ошибки: обнаружение слишком больших целочисленных констант в функциях, принимающих произвольные параметры.
0.1.4 (2015-09-30)
- Исправление ошибки: возврат массивов фиксированного размера.
- Исправление ошибки: комбинированный вывод JSON из solc.
- Исправление ошибки: доступ к возвращаемым значениям массивов фиксированного размера.
- Исправление ошибки: запрет присвоения из буквальных строк указателям хранилища.
- Рефакторинг: перемещение проверки типов в отдельный модуль.
0.1.3 (2015-09-25)
- Оператор
throw
.
- Библиотеки, содержащие функции, вызываемые через CALLCODE.
- Стадия компоновщика для компилятора для вставки адресов других контрактов (используется для библиотек).
- Опция компилятора для вывода исполняемой части контрактов.
- Проверка времени компиляции на выход за границы доступа к массивам фиксированного размера по целочисленным константам.
- Строка версии включает версию libevmasm/libethereum (содержит оптимизатор).
- Исправление ошибки: аксессоры для постоянных общедоступных переменных состояния.
- Исправление ошибки: распространение исключений в клонируемых контрактах.
- Исправление ошибки: пустые однострочные комментарии теперь обрабатываются правильно.
- Исправление ошибки: правильная проверка количества индексированных аргументов для событий.
- Исправление ошибки: строки в конструкторах структур.
0.1.2 (2015-08-20)
- Улучшенный интерфейс командной строки.
- Явное преобразование между
bytes
и string
.
- Исправление ошибки: передача значений, используемых в клонированных контрактах.
- Исправление ошибки: проблемы со строками в качестве ключей сопоставления.
- Исправление ошибки: предотвращение использования некоторых операторов.
0.1.1 (2015-08-04)
- Строки можно использовать в качестве ключей сопоставления.
- Клонированные контракты.
- Члены сопоставления пропускаются для структур в памяти.
- Использование только одного слота стека для ссылок на хранилище.
- Улучшенное сообщение об ошибке для неправильного количества аргументов. (#2456)
- Исправление ошибки: исправление сравнения между типами
bytesXX
. (#2087)
- Исправление ошибки: не допускать использование чисел с плавающей точкой для целочисленных литералов. (#2078)
- Исправление ошибки: некоторые проблемы с большим количеством локальных переменных. (#2478)
- Исправление ошибки: правильная инициализация переменных состояния
string
и bytes
.
- Исправление ошибки: правильный расчёт требований к газу для callcode.
0.1.0 (2015-07-10)
Опубликовать ( 0 )