Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
550 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Solidity hints. Часть 5

Спасибо всем, кто пережил неделю продаж и остался на канале, понимаю что для многих это действительно испытание. Мы возвращаемся в рабочий ритм и потихоньку продолжаем разбирать репо от Chinmaya, который делал свои заметки по Solidity во время своего обучения. И следующий пункт:

6. enum types are not part of the ABI, they are just a solidity abstraction

Тип данных enum не является частью ABI, это всего лишь абстракция Solidity.

Действительно, enum - это один из способов создания пользовательского типа данных в Solidity. Они явно преобразуются во все целочисленные типы и из них. При этом во время выполнения преобразования проверяется, что значение лежит внутри диапазона перечисления, и в противном случае возникает ошибка Panic.

Enum требуют наличия хотя бы одного значения и не могут иметь более 256 значений, что фактически означает равенство к типу данных uint8 (так он и будет отображаться в ABI).

Когда мы создаем enum, например:

enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
ActionChoices choice;


а затем хотим получить значение choice:

function getChoice() public view returns (ActionChoices) {
return choice;
}


в некотором роде, функция будет выглядеть как

getChoice() returns (uint8)

Значения в enum начинаются с 0, и если не установлено какое-либо другое значение, то функция или запрос к переменной вернем именно ноль. За этим необходимо следить в функциях, где от условия enum зависит ход ее исполнения.


7. Delete keyword is simply a reassignment of elements to their default values (ie.zero)

Ключевой метод delete в функциях фактически обнуляет значение, а не удаляет его.

При изучении Solidity нам часто говорили, что тут нельзя создать ни один тип данных с пустым или несуществующим значением. Например:

- boolean: false

- string: ""

- int / uint / enum: 0

- address: 0x0000000000000000000000000000000000000000 (or address(0))


Не помню, чтобы я встречал какие-либо критические уязвимости в последнее время, связанные с этим пунктом, так что, думаю, этот пункт можно просто запомнить.

#enum #default
👍4