Phòng ngừa tràn số nguyên: chìa khóa để bảo vệ an toàn hợp đồng thông minh

Lỗ hổng tràn số nguyên và biện pháp phòng ngừa

Tràn số nguyên là một lỗ hổng lập trình phổ biến, có thể xảy ra trong hầu hết các ngôn ngữ lập trình. Khi kết quả tính toán vượt quá phạm vi biểu diễn của kiểu số nguyên, sẽ xảy ra tràn. Ví dụ, phạm vi của số nguyên không dấu 32 bit (uint32) là từ 0 đến 4.294.967.295. Nếu cộng 1 vào 4.294.967.295, kết quả sẽ "tràn" và trở thành 0.

Sự tràn này có thể dẫn đến lỗi chương trình nghiêm trọng, đặc biệt là khi xử lý dữ liệu tài chính. Ví dụ, nếu giá cổ phiếu được biểu diễn bằng số nguyên 32 bit, khi giá vượt quá giá trị tối đa, nó có thể bị đọc sai thành 0, điều này rõ ràng sẽ gây ra sự hỗn loạn lớn.

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

  • Tràn số: Kết quả vượt quá giá trị tối đa, chẳng hạn như uint32 của 0xFFFFFFFF + 1 = 0x00000000
  • Xuống dưới: kết quả nhỏ hơn giá trị tối thiểu, như uint32 của 0x00000000 - 1 = 0xFFFFFFFF

Trong hợp đồng thông minh blockchain, lỗ hổng tràn số nguyên đặc biệt nguy hiểm. Năm 2018, token BEC của BeautyChain đã bị kẻ tấn công lợi dụng do lỗ hổng tràn số nguyên, gây ra mất mát lớn token.

Để ngăn chặn tràn số nguyên, ngôn ngữ Rust cung cấp một số phương pháp hiệu quả:

  1. Bật kiểm tra tràn trong chế độ phát hành:

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

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

  2. Sử dụng hàm chuyển đổi kiểu để kiểm tra tràn, ví dụ:

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

  1. Sử dụng các hàm Safe Math như checked_add, checked_sub, v.v:

rỉ sét let result = x.checked_sub(y).expect("Đã xảy ra tình trạng thiếu");

Thông qua những phương pháp này, chúng ta có thể phát hiện và ngăn chặn hiệu quả việc 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 có liên quan đến tính toán số lớn, cần phải xử lý cẩn thận các tình huống có thể xảy ra tràn.

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
SellLowExpertvip
· 07-16 05:14
Sợ rằng lại có ai đó bị sập băng.
Xem bản gốcTrả lời0
SigmaBrainvip
· 07-16 05:14
Viết mã thì có chỗ nào không tràn? Ai hiểu thì đều hiểu.
Xem bản gốcTrả lời0
SchroedingersFrontrunvip
· 07-16 05:11
Các bạn nói cái này chẳng phải là tài sản trong ví tiền giảm về 0 sao?
Xem bản gốcTrả lời0
AirdropHunterWangvip
· 07-16 04:45
Lại dẫm phải bẫy rồi, ai hiểu đây?
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)