Предотвращение переполнения целых чисел: ключ к обеспечению безопасности смарт-контрактов

Уязвимость переполнения целых чисел и ее защита

Переполнение целого числа — это распространенная уязвимость программирования, которая может возникнуть в большинстве языков программирования. Переполнение происходит, когда результат вычислений превышает диапазон представления целочисленного типа. Например, диапазон 32-битного беззнакового целого числа (uint32) составляет от 0 до 4,294,967,295. Если к 4,294,967,295 прибавить 1, результат "переполнится" и станет 0.

Такое переполнение может привести к серьезным ошибкам в программе, особенно при обработке финансовых данных. Например, если цена акций представлена 32-битным целым числом, когда цена превышает максимальное значение, она может быть ошибочно прочитана как 0, что, очевидно, вызовет огромный хаос.

Целочисленный переполнение делится на два случая: переполнение вверх и переполнение вниз.

  • Переполнение: результат превышает максимальное значение, например, uint32 0xFFFFFFFF + 1 = 0x00000000
  • Недостаток: результат меньше минимального значения, например, 0x00000000 - 1 = 0xFFFFFFFF для uint32

В смарт-контрактах на блокчейне уязвимость переполнения целых чисел особенно опасна. В 2018 году токен BEC от BeautyChain был использован злоумышленниками из-за уязвимости переполнения целых чисел, что привело к краже большого количества токенов.

!

Чтобы предотвратить переполнение целых чисел, язык Rust предлагает несколько эффективных методов:

  1. Включите проверку переполнения в режиме release:

томл [профиль.выпуск] overflow-checks = true panic = 'прерывание'

  1. Используйте пакет uint для поддержки больших целочисленных типов, таких как U256, U512 и т.д.

  2. Используйте функции преобразования типов для проверки переполнения, например:

ржавчина пусть amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // Это вызовет панику

  1. Использование функций Safe Math, таких как checked_add, checked_sub и т.д:

ржавчина let result = x.checked_sub(y).expect("Произошла недоходность");

!

С помощью этих методов мы можем эффективно обнаруживать и предотвращать переполнение целых чисел, повышая безопасность смарт-контрактов. При написании контрактов, связанных с вычислениями больших чисел, необходимо осторожно обращаться с возможными ситуациями переполнения.

!

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Поделиться
комментарий
0/400
SellLowExpertvip
· 07-16 05:14
Неужели снова кто-то попал в снежный обвал?
Посмотреть ОригиналОтветить0
SigmaBrainvip
· 07-16 05:14
Кто знает, тот понимает, что в коде не бывает без переполнения.
Посмотреть ОригиналОтветить0
SchroedingersFrontrunvip
· 07-16 05:11
Вы же говорите, что эта штука не приведет к падению до нуля активов в кошельке?
Посмотреть ОригиналОтветить0
AirdropHunterWangvip
· 07-16 04:45
Снова наступил на грабли, кто понимает?
Посмотреть ОригиналОтветить0
  • Закрепить