Техніки захисту від переповнення цілих чисел у смартконтрактах на Rust

robot
Генерація анотацій у процесі

Вразливість переповнення цілого числа та її захист

Цілочисельний переповнення є поширеною проблемою в програмуванні. У більшості мов програмування цілочисельні значення зберігаються в пам'яті фіксованої довжини. Цілі числа можна поділити на беззнакові та знакові, відмінність полягає в тому, чи використовується старший біт як знак для позначення позитивних чи негативних значень. Наприклад, 32-бітна пам'ять може зберігати беззнакове ціле число від 0 до 4,294,967,295 (uint32) або знакове ціле число від -2,147,483,648 до 2,147,483,647 (int32).

Коли результат обчислень виходить за межі діапазону, який може бути представлений цілим числом, відбувається переповнення. Більшість мов програмування не перевіряють цю помилку, а просто виконують просту операцію модулю або створюють невизначену поведінку. Це може призвести до несподіваних результатів виконання програми. У смарт-контрактах блокчейну, особливо в сфері DeFi, обчислення цілих чисел є дуже поширеними, тому потрібно особливо звертати увагу на вразливість переповнення цілих чисел.

Визначення переповнення цілих чисел

Цілісні переповнення діляться на два випадки: верхнє переповнення ( overflow ) і нижнє переповнення ( underflow ).

  1. Переповнення: результат перевищує максимальне значення цілочисельного типу. Наприклад, 0xFFFFFFFF для uint32 плюс 1 стане 0x00000000.

  2. Нижнє переповнення: результат менший за мінімальне значення цілочисельного типу. Наприклад, 0 від uint32 зменшене на 1 стане 0xFFFFFFFF.

!

Техніка захисту

У Rust можна вжити такі заходи для запобігання переповненню цілих чисел:

  1. Налаштуйте Cargo.toml, щоб режим release також перевіряв переповнення цілих чисел:

Томл [профіль.реліз] Переповнення-перевірки = Істина паніка = 'перервати'

  1. Використання пакету uint для підтримки більших цілих чисел:

іржа використовуйте uint::construct_uint;

construct_uint! { паб структура U1024(16); }

  1. Використовуйте безпечні математичні функції, такі як checked_*:

іржа let result = x.checked_add(y).expect("Переповнення при додаванні");

  1. Використовуйте функції перетворення типів, такі як as_u128() для перевірки переповнення:

іржа нехай amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // викликатиме паніку

!

Завдяки цим методам ми можемо ефективно запобігати вразливостям переповнення цілих чисел у смарт-контрактах на Rust, підвищуючи безпеку контрактів. При написанні смарт-контрактів, що містять математичні обчислення, необхідно обережно обробляти цілі числові операції та вживати відповідних заходів захисту.

!

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 4
  • Поділіться
Прокоментувати
0/400
GasDevourervip
· 07-20 17:20
Обережно з переповненням і шахрайськими проєктами!
Переглянути оригіналвідповісти на0
SchrodingerAirdropvip
· 07-19 14:45
Автор правий, може навчимося разом rust?
Переглянути оригіналвідповісти на0
liquiditea_sippervip
· 07-17 23:42
Ого, перевірка переповнення повинна бути!
Переглянути оригіналвідповісти на0
TokenCreatorOPvip
· 07-17 23:24
Ей, хто не натрапляв на проблеми з переповненням~
Переглянути оригіналвідповісти на0
  • Закріпити