- PVSM.RU - https://www.pvsm.ru -
Хочу рассказать об изменениях языка Solidity, которые ожидаются в версии 0.5.0. Сразу отмечу, что я ограничусь только языком — его грамматикой и семантикой.
Какого-то вменяемого текста на эту тему нет даже на английском языке, но недавно в репозитории Solidity [1] появился проект [2].
По нему можно отслеживать прогресс подготовки версии 0.5.0.
Disclaimer: в статье описано текущее состояние проекта, к релизу многое может поменяться. Точную информацию можно получить из официального changelog'a [3].
В Solidity накопилось довольно много устаревших конструкций, которые хотелось бы удалить из языка, но все никак не удается из-за обратной совместимости. В эту категорию изменений попадают:
throw
в пользу revert()
/assert(...)
/require(...)
. Механизм откатывания транзакции отличается от механизма исключений, и хочется подчеркнуть эту разницу на уровне языка.var
, который с учетом правил вывода типов легко приводит к ошибкам, например:for(var i = 0; i < 100500; i++) { ... // бесконечный цикл
var (z, y, z) = foo();
constant
для функций — всюду должно быть view или pure. функция gasleft()
[8] вместо msg.gas
. Так понятнее, что это не какая-то константа, а оставшееся количество газа. Да, gasleft()
можно переопределить.block.blockhash
в blockhash
. Логично, ведь blockhash
текущего блока недоступен (block.blockhash(block.number) == 0
).0xaf days
.suicide
/sha3
в inline assembly. Не понятно, почему вне assembly эти конструкции по-прежнему доступны, хотя и deprecated.x=+1;
вместо x+=1;
).years
, потому что сейчас он определен как 365 days
, и это не слишком точно соотносится с привычным календарем. Мне это представляется спорным решением — казалось бы, пока можно ограничиться предупреждением.В Solidity очень разные по смыслу конструкции имеют схожий синтаксис. Это мешает читать код, но еще больше это портит жизнь разработчикам инструментов для работы с исходниками (это касается компилятора в том числе). Приятно видеть, что работы ведутся и в этом направлении тоже.
emit
при генерации событий [13].constructor(<args>) public { ...
.public
или internal
, не может быть view
или pure
, не может иметь возвращаемых значений, т.е. является особой сущностью.function foo() { x = 1; revert(); uint x; }
--strict-assembly
. В нем ограничены манипуляции со стеком и недоступны метки и переходы — вместо них предлагается использовать более привычные управляющие конструкции вроде for
или switch
.0x0
использовать address(0)
.struct A {}
). Не очень-то и хотелось, но раньше грамматика такое позволяла.С модификаторами видимости был легкий бардак, во многом обусловленный наличием значений по умолчанию. Накопилось достаточно много мелких правок, которые должны сделать язык более строгим, убрав эту путаницу.
А поскольку эти модификаторы попадают в ABI контракта, изменения коснулись и его.
external view
функции с помощью public
переменных.В Solidity есть несколько функций, которые принимают любое количество аргументов, склеивают их одну бинарную колбасу и дальше работают уже с ней. В этом процессе много тонкостей и неочевидных моментов, и сейчас решили с ними разобраться.
abi
[24] и его методыencode
, encodePacked
, encodeWithSelector
и encodeWithSignature
, позволяющие контролировать сборку данных для вызова или хэширования.keccak256
/sha256
/ripemd160
и call
/delegatecall
. Планируется поменять синтаксис [26] этих команд так, чтобы они не могли принимать список аргументов произвольной длины.keccak256(1)
теперь используется не наименьший достаточный тип (uint8
), а uint256
. Если такое поведение не устраивает, то придется использовать явное приведение типов (keccak256(uint8(1))
).var
и высокой (хотя и конечной [28]) точностью вычислений константных выражений. msg.data
на уровне EVM.В кавычках, потому что речь в основном идет о "неожиданном" доступе к storage без использования assembly.
<array>.length
.delete
, для уменьшения размера предлагается [33] использовать pop()
, помимо этого обсуждают операции вроде truncate()
и extend()
. Ну и по-прежнему есть assembly, если очень надо.В любой бочке меда окажется своя ложка дегтя.
revert
, assert
и require
, но с точки зрения грамматики они остаются просто функциями (и их можно переопределить).Есть несколько очень важных изменений, которые не касаются непосредственно языка, но при этом сильно повлияют на код новых контрактов.
Хотя дата выхода релиза еще неизвестна, многие новшества уже можно потрогать руками.
Включаются они с помощью
pragma experimental "v0.5.0";
и
pragma experimental "ABIEncoderV2";
Компилятор, конечно, выдает предупреждение.
В целом, 0.5.0 воспринимается позитивно. Удалят то, от чего никак не удается избавиться из-за обратной совместимости, плотно отрефакторят пару скользких тем, внесут несколько полезных изменений. Потом будем ждать рефакторинг наследования [39], а там, может, и Vyper [40] подоспеет.
Автор: eMarchenko
Источник [41]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/279612
Ссылки в тексте:
[1] Solidity: https://github.com/ethereum/solidity/
[2] проект: https://github.com/ethereum/solidity/projects/4
[3] changelog'a: https://github.com/ethereum/solidity/blob/develop/Changelog.md
[4] Отказ: https://github.com/ethereum/solidity/issues/1793
[5] обсуждают: https://github.com/ethereum/solidity/issues/3520
[6] пропускать ненужные значения: https://github.com/ethereum/solidity/issues/3314
[7] Запретили: https://github.com/ethereum/solidity/issues/2502
[8] функция gasleft()
: https://github.com/ethereum/solidity/issues/2971
[9] Перенесли: https://github.com/ethereum/solidity/issues/2970
[10] Запретили: https://github.com/ethereum/solidity/issues/3574
[11] Отказались: https://github.com/ethereum/solidity/issues/3003
[12] Планируется отказ: https://github.com/ethereum/solidity/issues/3606
[13] генерации событий: https://github.com/ethereum/solidity/issues/2877
[14] конструкторов: https://github.com/ethereum/solidity/issues/3196
[15] issue: https://github.com/ethereum/solidity/issues/3705
[16] Изменение: https://github.com/ethereum/solidity/issues/1679
[17] строгого режима: https://github.com/ethereum/solidity/issues/1824
[18] Запретили: https://github.com/ethereum/solidity/issues/2907
[19] как external: https://github.com/ethereum/solidity/issues/2330
[20] возможным: https://github.com/ethereum/solidity/issues/3458
[21] обещают разрешить: https://github.com/ethereum/solidity/issues/3514
[22] обязательными для функций: https://github.com/ethereum/solidity/issues/2608
[23] только external: https://github.com/ethereum/solidity/issues/1048
[24] abi
: https://github.com/ethereum/solidity/pull/2980
[25] Предлагается: https://github.com/ethereum/solidity/issues/3955
[26] поменять синтаксис: https://github.com/ethereum/solidity/issues/3789
[27] Изменение: https://github.com/ethereum/solidity/issues/982
[28] конечной: https://github.com/ethereum/solidity/issues/3793
[29] Изменение: https://github.com/ethereum/solidity/issues/3978
[30] проблемы: https://blog.coinfabrik.com/smart-contract-short-address-attack-mitigation-failure/
[31] Запрет: https://github.com/ethereum/solidity/issues/1789
[32] запретят: https://github.com/ethereum/solidity/issues/3515
[33] предлагается: https://github.com/ethereum/solidity/issues/2780
[34] Добавляют: https://github.com/ethereum/solidity/pull/3627
[35] дробной частью: https://github.com/ethereum/solidity/pull/3793
[36] правильно: https://github.com/ethereum/solidity/issues/3860
[37] защита: https://github.com/ethereum/solidity/issues/3979
[38] более строгой: https://github.com/ethereum/solidity/issues/2109
[39] рефакторинг наследования: https://github.com/ethereum/solidity/projects/9
[40] Vyper: https://github.com/ethereum/vyper
[41] Источник: https://habr.com/post/353306/?utm_source=habrahabr&utm_medium=rss&utm_campaign=353306
Нажмите здесь для печати.