hợp đồng thông minh số nguyên tràn: Giải thích các biện pháp bảo vệ

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. Số nguyên được chia thành hai loại: số không dấu và số có dấu, sự khác biệt nằm ở việc có sử dụng bit cao nhất làm bit dấu hay không. Ví dụ, bộ nhớ 32 bit có thể lưu trữ số nguyên không dấu trong khoảng từ 0 đến 4,294,967,295 (uint32), hoặc số nguyên có dấu trong khoảng 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 mà kiểu số nguyên có thể biểu thị, sẽ xảy ra tràn số. Hầu hết các ngôn ngữ lập trình và trình biên dịch sẽ không kiểm tra lỗi này, mà chỉ đơn giản là thực hiện phép toán modulo hoặc gây ra hành vi không 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 việc viết hợp đồng thông minh trên blockchain, đặc biệt là trong lĩnh vực tài chính phi tập trung, tính toán số nguyên rất phổ biến, do đó cần đặc biệt chú ý đến lỗ hổng tràn số nguyên.

Tràn số nguyên có thể được chia thành hai trường hợp: tràn lên và tràn xuống:

  1. Tràn: Kết quả tính toán vượt quá giá trị tối đa mà kiểu dữ liệu có thể biểu diễn. Ví dụ, 0xFFFFFFFF của uint32 cộng 1 sẽ trở thành 0x00000000.

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

Vào tháng 4 năm 2018, hợp đồng mã thông báo BeautyChain(BEC) đã bị tấn công do lỗ hổng tràn số nguyên, kẻ tấn công đã thu được một số lượng lớn mã thông báo. Lỗ hổng này xuất hiện trong hàm batchTransfer, do không kiểm tra tràn số trong phép nhân, dẫn đến việc có thể chuyển ra một số lượng lớn mã thông báo bằng một số dư mã thông báo rất nhỏ.

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

  1. Cấu hình tùy chọn biên dịch Rust, kiểm tra tràn số nguyên và kích hoạt panic trong chế độ release.

  2. Sử dụng gói uint để hỗ trợ các kiểu số nguyên lớn hơn, như U256, U512, v.v.

  3. Sử dụng hàm chuyển đổi kiểu uint để kiểm tra tràn, như as_u128().

  4. Sử dụng hàm Safe Math như checked_add() để kiểm tra xem phép toán có bị tràn số hay không.

Bằng những phương pháp này, có thể hiệu quả tránh được lỗ hổng tràn số nguyên, nâng cao tính an toàn của hợp đồng thông minh. Khi viết hợp đồng liên quan đến tính toán số lớn, cần phải cẩn thận xử lý vấn đề tràn số nguyên.

SAFE-0.37%
MATH-7.18%
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
  • 5
  • Chia sẻ
Bình luận
0/400
AirdropHunterXiaovip
· 9giờ trước
Tràn? Sẽ bị Phiếu giảm giá rồi.
Xem bản gốcTrả lời0
gas_guzzlervip
· 10giờ trước
Nhớ điều chỉnh tràn trước khi phát triển nhé các anh em
Xem bản gốcTrả lời0
0xInsomniavip
· 10giờ trước
溢出害惨了多少 đồ ngốc
Xem bản gốcTrả lời0
AirdropHunterZhangvip
· 10giờ trước
Làn sóng này, nhóm người không tốn tiền cảm thấy đau đầu.
Xem bản gốcTrả lời0
0xOverleveragedvip
· 10giờ trước
Mẹ Sò lại mất nữa rồi.
Xem bản gốcTrả lời0
  • Ghim
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)