Solidity

Solidity 是否預先計算了函式體中定義的兩個的冪?

  • March 27, 2021

我只在我的合約函式中使用了二合一的權力,但我在頂層定義了它們,認為這樣我可以在執行時節省氣體。

那有必要嗎?使用 Solidity 優化器時,我可以執行以下操作並產生相同的 gas 成本嗎?

function foo(uint256 x) external returns (uint256 result) {
   if (x >= 2**128) {
       // ...
   }

   if (x >= 2**64) {
       // ...
   }

   // ...
}

是的,即使沒有啟用優化器,它也會記憶體數字!

當傳遞 65535 (max uint16) 作為參數 x 時,執行foo或需要 1003 gas bar我在Remix上使用 Solidity v0.8.3 執行了這個測試。

contract PowersOfTwo {
   uint256 internal constant TWO_POW_1 = 2**1;
   uint256 internal constant TWO_POW_2 = 2**2;
   uint256 internal constant TWO_POW_4 = 2**4;
   uint256 internal constant TWO_POW_8 = 2**8;

   function foo(uint16 x) external view returns(uint256 gasConsumed) {
       uint256 startGas = gasleft();
       uint256 msb = 0;
       if (x >= TWO_POW_8) {
           x >>= 8;
           msb += 8;
       }
       if (x >= TWO_POW_4) {
           x >>= 4;
           msb += 4;
       }
       if (x >= TWO_POW_2) {
           x >>= 2;
           msb += 2;
       }
       if (x >= TWO_POW_1) {
           msb += 1;
       }
       gasConsumed = startGas - gasleft();
   }
   
   function bar(uint16 x) external view returns(uint256 gasConsumed) {
       uint256 startGas = gasleft();
       uint256 msb = 0;
       if (x >= 2**8) {
           x >>= 8;
           msb += 8;
       }
       if (x >= 2**4) {
           x >>= 4;
           msb += 4;
       }
       if (x >= 2**2) {
           x >>= 2;
           msb += 2;
       }
       if (x >= 2**1) {
           msb += 1;
       }
       gasConsumed = startGas - gasleft();
   }   
}

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