SafeMath
Là một thư viện1 cung cấp các thao tác toán học cơ bản chẳng hạn như cộng, trừ, nhân, chia và giúp đảm bảo các arithmetic vulnerability sẽ không xảy ra.
Ví dụ bên dưới sử dụng thư viện SafeMath cho kiểu uint256
:
using SafeMath for uint256;
uint256 a = 5;
uint256 b = a.add(3); // 5 + 3 = 8
uint256 c = a.mul(2); // 5 * 2 = 10
Có thể thấy, ta thay thế toán tử +
và *
thành hàm add
và mul
của thư viện.
Về bản chất, hai hàm này đều có hai tham số, nhưng lúc gọi ta chỉ truyền vào có một đối số. Đối số còn lại chính là biến gọi thực thi hàm. Cụ thể:
function add(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
Trong hai hàm trên, các câu lệnh assert
được dùng để kiểm tra overflow. Câu lệnh assert
sẽ quăng lỗi nếu biểu thức truyền vào có giá trị là false
.
Sự khác nhau giữa require
và assert
là require
sẽ trả lại tiền cho user nếu như biểu thức truyền vào nó thỏa điều kiện.
Attention
Kiểu dữ liệu của các tham số trong hàm
add
vàmul
làuint256
. Điều này có nghĩa là chúng ta chỉ có thể sử dụng thư viện với kiểu dữ liệu làuint256
. Nếu muốn áp dụng cho các kiểu dữ liệu số nguyên khác, ta cần phải sao chép lại một thư viện mới có kiểu dữ liệu của các tham số làuint32
hayuint64
, etc.
Footnotes
-
Xem thêm Solidity - Libraries. ↩