Tips perlindungan overflow integer pada smart contract Rust

robot
Pembuatan abstrak sedang berlangsung

Kerentanan Overflow Integer dan Perlindungannya

Overflow bilangan bulat adalah masalah umum dalam pemrograman. Dalam sebagian besar bahasa pemrograman, nilai bilangan bulat disimpan dalam memori dengan panjang tetap. Bilangan bulat dapat dibagi menjadi bilangan bulat tanpa tanda dan bilangan bulat dengan tanda, perbedaannya terletak pada apakah bit tertinggi digunakan sebagai bit tanda untuk menunjukkan positif atau negatif. Misalnya, memori 32-bit dapat menyimpan bilangan bulat tanpa tanda dari 0 hingga 4.294.967.295 (uint32), atau bilangan bulat dengan tanda dari -2.147.483.648 hingga 2.147.483.647 (int32).

Ketika hasil perhitungan melebihi rentang yang dapat diwakili oleh tipe integer, akan terjadi overflow. Sebagian besar bahasa pemrograman tidak memeriksa kesalahan ini, melainkan melakukan operasi modulo sederhana atau menghasilkan perilaku yang tidak terdefinisi. Ini dapat menyebabkan hasil program berjalan tidak terduga. Dalam kontrak pintar blockchain, terutama di bidang DeFi, perhitungan integer sangat umum, sehingga perlu perhatian khusus terhadap celah overflow integer.

Definisi Overflow Bilangan Bulat

Overflow integer dibagi menjadi dua kondisi: overflow ( dan underflow ).

  1. Overflow: Hasil melebihi nilai maksimum tipe integer. Misalnya, 0xFFFFFFFF dari uint32 ditambah 1 akan menjadi 0x00000000.

  2. Underflow: Hasil lebih kecil dari nilai minimum tipe integer. Misalnya, 0 dari uint32 dikurangi 1 akan menjadi 0xFFFFFFFF.

Teknologi Perlindungan

Dalam Rust, langkah-langkah berikut dapat diambil untuk mencegah overflow integer:

  1. Konfigurasi Cargo.toml agar mode release juga memeriksa overflow integer:

toml [profile.release] overflow-checks = true panic = 'abort'

  1. Menggunakan uint crate untuk mendukung bilangan bulat yang lebih besar:

karat gunakan uint::construct_uint;

construct_uint! { pub struct U1024(16); }

  1. Gunakan fungsi matematika aman seperti checked_*:

karat let result = x.checked_add(y).expect("Penambahan overflow");

  1. Gunakan fungsi konversi seperti as_u128() untuk memeriksa overflow:

karat let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // akan memicu panic

Dengan metode ini, kita dapat secara efektif mencegah kerentanan overflow integer dalam kontrak pintar Rust, meningkatkan keamanan kontrak. Saat menulis kontrak pintar yang melibatkan perhitungan matematis, sangat penting untuk menangani operasi integer dengan hati-hati dan mengambil langkah perlindungan yang tepat.

Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
  • Hadiah
  • 4
  • Bagikan
Komentar
0/400
GasDevourervip
· 07-20 17:20
Hati-hati terhadap proyek yang berpotensi merugikan!
Lihat AsliBalas0
SchrodingerAirdropvip
· 07-19 14:45
Pemilik lantai benar, bagaimana jika kita belajar rust bersama?
Lihat AsliBalas0
liquiditea_sippervip
· 07-17 23:42
Wow, pemeriksaan overflow harus dilakukan!
Lihat AsliBalas0
TokenCreatorOPvip
· 07-17 23:24
Eh, siapa yang belum pernah terjebak dalam masalah ini~
Lihat AsliBalas0
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)