Tài liệu lập trình Solidity bài 40: Overflows & Underflows. Ngăn chặn lỗi tràn dữ liệu trong SOLIDITY
Overflows & Underflows
Tài liệu lập trình Solidity bài 40: Overflows & Underflows. Ngăn chặn lỗi tràn dữ liệu trong SOLIDITY
Lỗi tràn dữ liệu trong SOLIDITY
Giả sử chúng ta có một uint8, chỉ có thể có 8 bit. Điều đó có nghĩa là số lớn nhất chúng ta có thể lưu trữ là số nhị phân 11111111 (hoặc ở dạng thập phân, 2 ^ 8 - 1 = 255).
Hãy xem đoạn mã sau. Kết quả của số
uint8 number = 255;
number++;
Trong trường hợp này, chúng tôi đã làm cho nó bị tràn. Vì thế biến số number này tràn ngược trở lại với giá trị bằng 0 mặc dù chúng tôi đã tăng nó lên. (Nếu bạn thêm 1 vào nhị phân 11111111, nó sẽ đặt lại về 00000000, giống như đồng hồ đi từ 23:59 đến 00:00).
Một lỗi tràn dưới cũng tương tự, nếu bạn trừ 1 từ uint8 bằng 0, thì nó sẽ bằng 255 (bởi vì uints không có dấu và không thể âm).
Mặc dù chúng ta không sử dụng uint8 ở đây và có vẻ như uint256 sẽ không bị tràn khi tăng 1 mỗi lần (2 ^ 256 là một con số thực sự lớn), nhưng vẫn tốt để đưa các biện pháp bảo vệ vào hợp đồng để ứng dụng DApp của chúng ta không bao giờ phát sinh lỗi bất ngờ trong tương lai.
Sử dụng thư viện SafeMath
Để ngăn chặn điều này, OpenZeppelin đã tạo một thư viện có tên là SafeMath để ngăn chặn những vấn đề này:
Thư viện là một loại hợp đồng đặc biệt trong Solidity. Một trong những điều hữu ích là gắn các hàm vào các kiểu dữ liệu gốc.
Ví dụ: với thư viện SafeMath, chúng ta sẽ sử dụng cú pháp sử dụng SafeMath cho uint256. Thư viện SafeMath có 4 chức năng - add, sub, mul và div. Và bây giờ chúng ta có thể truy cập các chức năng này từ uint256 như sau:
Ví dụ sử dụng SafeMath cho uint256;
using SafeMath for uint256;
uint256 a = 5;
uint256 b = a.add(3); // 5 + 3 = 8
uint256 c = a.mul(2); // 5 * 2 = 10
Thực hành luôn cho nhớ lâu bạn nhé
Nếu bạn chưa biết cách TẠO FILE, COMPILER và DEPLOY thì hãy xem lại trong bài giới thiệu nhé. Có hướng dẫn chi tiết ở đó.
BÀI TIẾP THEO: BÀI SỐ 41
HỌC TỪ ĐẦU: BÀI SỐ 1