Kỹ thuật bảo vệ tràn số nguyên trong hợp đồng thông minh Rust

robot
Đang tạo bản tóm tắt

Lỗ hổng tràn số nguyên và biện pháp bảo vệ

Tràn số nguyên là một vấn đề phổ biến trong lập trình. Trong hầu hết các ngôn ngữ lập trình, giá trị số nguyên được lưu trữ trong bộ nhớ có độ dài cố định. Các số nguyên có thể được chia thành số không dấu và số có dấu, sự khác biệt nằm ở việc bit cao nhất có được sử dụng làm bit dấu để biểu thị âm dương hay không. Ví dụ, bộ nhớ 32 bit có thể lưu trữ số nguyên không dấu từ 0 đến 4,294,967,295 (uint32), hoặc số nguyên có dấu từ -2,147,483,648 đến 2,147,483,647 (int32).

Khi kết quả tính toán vượt quá phạm vi có thể biểu diễn của kiểu số nguyên, sẽ xảy ra tràn số. Hầu hết các ngôn ngữ lập trình không kiểm tra lỗi này, mà chỉ thực hiện phép toán mô đơn giản hoặc tạo ra hành vi chưa được xác định. Điều này có thể dẫn đến kết quả chạy chương trình không như mong đợi. Trong hợp đồng thông minh blockchain, đặc biệt là trong lĩnh vực DeFi, tính toán số nguyên rất phổ biến, vì vậy cần đặc biệt chú ý đến lỗ hổng tràn số nguyên.

Định nghĩa tràn số nguyên

Tràn số nguyên được chia thành hai trường hợp: tràn trên ( overflow ) và tràn dưới ( underflow ).

  1. Tràn số: Kết quả vượt quá giá trị tối đa của kiểu số nguyên. Ví dụ, uint32 của 0xFFFFFFFF cộng 1 sẽ trở thành 0x00000000.

  2. Giảm dưới: Kết quả nhỏ hơn giá trị tối thiểu của kiểu số nguyên. Ví dụ, 0 của uint32 trừ 1 sẽ trở thành 0xFFFFFFFF.

Công nghệ bảo vệ

Trong Rust, có thể thực hiện các biện pháp sau để ngăn chặn tràn số nguyên:

  1. Cấu hình Cargo.toml để chế độ release cũng kiểm tra tràn số nguyên:

toml [profile.release] overflow-checks = true panic = 'hủy bỏ'

  1. Sử dụng gói uint để hỗ trợ số nguyên lớn hơn:

gỉ sử dụng uint::construct_uint;

construct_uint! { pub struct U1024(16); }

  1. Sử dụng các hàm toán học an toàn như checked_*:

gỉ let result = x.checked_add(y).expect("Addition overflow");

  1. Sử dụng các hàm chuyển đổi như as_u128() để kiểm tra tràn:

rỉ sét let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // sẽ gây ra panic

Thông qua những phương pháp này, chúng ta có thể ngăn chặn hiệu quả lỗ hổng tràn số nguyên trong hợp đồng thông minh Rust, nâng cao tính an toàn của hợp đồng. Khi viết hợp đồng thông minh liên quan đến các phép toán toán học, cần phải xử lý cẩn thận các phép toán số nguyên và thực hiện các biện pháp bảo vệ thích hợp.

Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • 4
  • Chia sẻ
Bình luận
0/400
GasDevourervip
· 07-20 17:20
Cẩn thận với những dự án lừa đảo!
Xem bản gốcTrả lời0
SchrodingerAirdropvip
· 07-19 14:45
Chủ nhà nói đúng mà, hay là chúng ta cùng học Rust nhé.
Xem bản gốcTrả lời0
liquiditea_sippervip
· 07-17 23:42
Wow, kiểm tra tràn phải được bật!
Xem bản gốcTrả lời0
TokenCreatorOPvip
· 07-17 23:24
Êi, ai mà chưa từng bị dính vào cái chuyện tràn này chứ~
Xem bản gốcTrả lời0
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)