Solidity

在 Solidity 0.8.0 中,SafeMath 庫是否已過時?

  • March 11, 2022

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;
}

引用自:https://ethereum.stackexchange.com/questions/91367