Solidity

刪除幾行後契約規模如何增長?

  • July 26, 2022

這肯定不是一般情況,而是具體情況。

我有一個大的智能合約(22.572 KB),我正試圖讓它更小。這是契約的一部分:

   modifier onlyValidTokenId(bytes32 composedTokenId) {
       _onlyValidTokenId(composedTokenId);

       _;
   }

   function _onlyValidTokenId(bytes32 composedTokenId) internal view {
       bytes16[2] memory decomposedTokenId = _decomposeTokenId(composedTokenId);

       uint256 composedTokenIdAsNumber = uint256(composedTokenId);
       if (composedTokenIdAsNumber == 0 || composedTokenIdAsNumber > collectionTokenSupplyCap(decomposedTokenId[0])) {
           revert CardTokenInvalidTokenId(composedTokenId);
       }
   }

現在無論程式碼說什麼或做什麼,忽略契約的其餘部分,我都這樣做了:

   modifier onlyValidTokenId(bytes32 composedTokenId) {
       bytes16[2] memory decomposedTokenId = _decomposeTokenId(composedTokenId);
       
       uint256 composedTokenIdAsNumber = uint256(composedTokenId);
       if (composedTokenIdAsNumber == 0 || composedTokenIdAsNumber > collectionTokenSupplyCap(decomposedTokenId[0])) {
           revert CardTokenInvalidTokenId(composedTokenId);
       }

       _;
   }

認為契約規模會縮小,因為我刪除了幾行。但編譯後,我的合約大小增加到 22.702 KB。這怎麼可能?

修飾符被內聯到它們各自的函式中(即它們的程式碼被複製)。

在您之前的範例中,程式碼大小更短,因為修飾符僅包含對內部函式的引用,而現在它包含完整的字節碼。

同時,第二個程式碼範例將使用更少的氣體(沒有跳轉到內部函式)。

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