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 ).
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.
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:
Cấu hình Cargo.toml để chế độ release cũng kiểm tra tràn số nguyên:
gỉ
let result = x.checked_add(y).expect("Addition overflow");
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.
8 thích
Phần thưởng
8
4
Chia sẻ
Bình luận
0/400
GasDevourer
· 07-20 17:20
Cẩn thận với những dự án lừa đảo!
Xem bản gốcTrả lời0
SchrodingerAirdrop
· 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_sipper
· 07-17 23:42
Wow, kiểm tra tràn phải được bật!
Xem bản gốcTrả lời0
TokenCreatorOP
· 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ứ~
Kỹ thuật bảo vệ tràn số nguyên trong hợp đồng thông minh Rust
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 ).
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.
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:
toml [profile.release] overflow-checks = true panic = 'hủy bỏ'
gỉ sử dụng uint::construct_uint;
construct_uint! { pub struct U1024(16); }
gỉ let result = x.checked_add(y).expect("Addition overflow");
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.