Переполнение и недополнение в Solidity

Важно знать основы любой технологии, в которую вы решили играть в долгосрочной перспективе. В этой статье мы рассмотрим Underflow и Overflow в Solidity.

Переполнение

Переполнение — это состояние, когда uint (беззнаковое целое число) достигает своего размера байта, следующий добавленный элемент возвращает первый элемент переменной (значение переменной по умолчанию). Размер байта uint равен 255, что означает, что когда он достигает максимального значения, то сбрасывается на 0.

Иллюстрация ниже:

uint16 number = 65535;
return number++;
// this returns 0 because it has gotten to the max
Вход в полноэкранный режим Выход из полноэкранного режима

Недополнение

Аналогично переполнению, недополнение — это состояние, когда uint16 при вычитании на 1 равно 0, оно покажет 65535 (потому что uint беззнаковые, и поэтому не могут быть отрицательными).

Иллюстрация ниже:

uint16 number ; // number here is equal to 0
return number--;
// this returns 65535 because it has gotten to the Minimum
Вход в полноэкранный режим Выход из полноэкранного режима

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

if(a + c > a) {
  a = a + c;
}
Ввести полноэкранный режим Выход из полноэкранного режима

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

Более простой альтернативой является использование библиотеки SafeMath от OpenZeppelin (Docs & Github), которая автоматически проверяет переполнения во всех математических операторах. Полученный код выглядит следующим образом:

a = a.add(c);
Войти в полноэкранный режим Выйти из полноэкранного режима

Если произойдет переполнение, код будет возвращен.

Надеюсь, это помогло вам получить представление о переполнениях и недополнениях в Solidity и лучше ориентироваться в этих сценариях!

Оцените статью
devanswers.ru
Добавить комментарий