Solidity

中間記憶體變數會消耗gas嗎?

  • October 7, 2018

沒有中間變數的範例:

uint startTime = 9;
uint allowedTime = 7;

require(now > startTime + allowedTime);

帶有中間變數的範例:

uint startTime = 9;
uint allowedTime = 7;

uint deadline = startTime + allowedTime;

require(now > deadline);

顯然上面這兩個塊在功能上是等價的,但是後者引入了一個中間變數來增加可讀性。我希望在編譯原始碼時取消中間變數,因此這兩個範例應該產生相同的字節碼。如果是這種情況,則使用中間變數應該沒有額外的 gas 成本。

何苦?上面的例子很簡單,但在實際情況下,有時中間變數對於減少閱讀器的認知負擔非常有用(可讀程式碼 -> 無錯誤程式碼 -> 安全合約)。所以如果它是免費的氣體,我不想使用它。

現在問題來了:中間變數是否會被 Solidity 編譯器抵消並且不需要額外的氣體?還是 Solidity 編譯器還沒有那麼聰明?

以下是有關在 Solidity 中儲存數據的更多資訊 https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack

您定義的那些變數將儲存在堆棧中(如果有空間並且您將它們保存在一個函式中)。如果編譯會正確優化它,它將是免費的,如果沒有,每個變數都會花費你PUSTPOP操作(3 + 2 gas)

更新

兩個版本的優化字節碼消耗相同數量的氣體。檢查 pragma solidity 0.4.24

Ropsten 測試(混音)

pragma solidity ^0.4.24;
contract A {
   uint t;

   function run() public returns(uint){
       uint startTime = 9;
       uint allowedTime = 7;

       uint v = startTime + allowedTime; // second test without v
       t = now + v;
       return t;
   }
}

結果:

與 v
部署95237氣
功能 41470 氣體

沒有 v
部署95237氣
功能 41470 氣體

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