在 Solidity 0.8.0 中,SafeMath 庫是否已過時?
SafeMath通常用於在上溢和下溢時恢復事務,而不是讓數字迴繞。solidity 0.8.0 發行說明指出:
程式碼生成器:預設檢查所有算術。可以使用 unchecked { … } 禁用這些檢查。
這是否意味著在使用 solc >= 0.8.0 進行編譯時,SafeMath 現在已經完全過時了,還是在某些情況下它仍然有用?
來自關於冪運算符 ( ) 的Solidity 0.8.0 發佈公告
**
:我們希望我們找到了一個相當有效的實施方案,並且也非常感謝您對此的回饋!
對於許多特殊情況,我們實際上使用 exp 操作碼而不是我們自己的實現來實現它。更具體地說,使用文字數字作為基數的求冪運算將直接使用 exp 操作碼。對於具有較小值的變數,也有專門的程式碼路徑。對於高達 306 的基數,如果指數小於硬編碼的安全上限,它將直接使用 exp 操作碼。如果基數或指數太大,它可能會退回到基於循環的實現。
除了以上所有內容(儘管本公告中沒有直接說明),我相信他們已經設計了這個運算符的安全實現,專門針對最常用的鹼基 2 和 10 進行優化。
因此,如果您的系統需要此運算符用於其他鹼基,或者如果您碰巧想出了一個更好(更省氣)的安全實現,那麼將它添加到您的
SafeMath
庫中可能對您有用。當然,該語言支持的每個其他算術運算符也是如此,儘管我懷疑您是否可以以比 solc 0.8 更好的方式安全地實現它們中的任何一個。
Solidity v0.8.0 Breaking Changes Docs說:
溢出檢查非常常見,因此我們將它們設為預設值以提高程式碼的可讀性,即使它會稍微增加 gas 成本。
並檢查SafeMath.sol的 GitHub送出,我發現這個送出是在 2021 年 2 月送出的,他們添加了評論:
注意:從 Solidity 0.8 開始不再需要 SafeMath。編譯器現在已內置溢出檢查。
該評論後來在另一個送出中進行了審核,標題為Review wording of SafeMath need in Solidity 0.8,並更改為:
注意:從 Solidity 0.8 開始通常不需要 SafeMath,因為編譯器現在已內置溢出檢查。
檢查連結的第一個送出,我們還可以看到 SignedSafeMath.sol 合約中的註釋說:
在錯誤時恢復的簽名數學運算。
我認為這就像說他們正在檢查溢出。
此外,措辭更改似乎與此處的其他答案一致,請注意您可以將 safemath 用作庫以提高運營成本,例如,根據文件,預設值現在更昂貴,或者改進 ** 運算符對於不同於 2 或 10 的鹼基。
***但從 Solidity 0.8 開始,***似乎確實不需要 SafeMath
此外,安全數學庫中的頂級評論現在說:
注意 此版本的 SafeMath 只能與 Solidity 0.8 或更高版本一起使用,因為它依賴於編譯器的內置溢出檢查。
現在添加功能是:
function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; }
早期的實現是:
function add(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; }