這章節說到Math**(數學)**相關:
主要分成三塊 SafeMath
、Math
、SafeCast
超方便使用!! 🎉🎉🎉🎉🎉 🧙
SafeMath
對 Solidity 的算術運算進行包裝,並添加了溢出檢查。
Solidity 中的算術運算在溢出時換行。這很容易導致錯誤,因為程序員通常認為溢出會引發錯誤,這是高級編程語言的標準行為。 SafeMath
通過在操作溢出時恢復事務來恢復這種直覺。
使用這個庫而不是未經檢查的操作可以消除一整類錯誤,因此建議始終使用它。
以下要特別介紹溢出這個詞,我們常常以為的 1 + 1 = 2 這件事情在電腦上面不是這個樣子 例如 int8 (佔的位元數是8). 在電腦眼裡就是 1111 1111 大家想想如果我現在+ 1會怎樣 會變成 10000 0000 位元數只有8 所以截斷後變成 0000 0000 (意不意外驚不驚喜🥴)Solidity 沒幫忙告訴我 可參考這裡的深度解析
過去我們可能寫程式都覺得理所當然的事情是因為過去程式語言可能就幫你有錯誤訊息所以我們不會發現。
回歸正題
SafeMath
主要提供 加、減、乘、除、取餘數 如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/utils/math/SafeMath.sol>";
contract Counter {
using SafeMath for uint256; // 使用safeMath
uint256 counter = 0;
function incrment() public pure returns {
counter = counter.add(1); // 0 + 1
}
function decrement() public pure returns {
counter = counter.sub(1); // 0 - 1
//counter = counter.sub(1 , "錯誤紀錄呈現");
}
function multiply() public pure returns {
counter = counter.mul(1); // 0 * 1
}
function divide() public pure returns {
counter = counter.div(1); // 0 / 1
//counter = counter.div(1 , "錯誤紀錄呈現");
}
function mod() public pure returns {
counter = counter.mod(1); // 取餘數
//counter = counter.mod(1 , "錯誤紀錄呈現");
}
}
Math
主要提供 最大、最小、平均 如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/utils/math/Math.sol>";
contract MathExample {
using Math for uint256;
function getMax(uint256 num1, uint256 num2) public pure returns (uint256) {
return num1.max(num2);
}
function getMin(uint256 num1, uint256 num2) public pure returns (uint256) {
return num1.min(num2);
}
function getAverage(uint256 num1, uint256 num2) public pure returns (uint256) {
return num1.average(num2);
}
}