Solidity
中間記憶體變數會消耗gas嗎?
沒有中間變數的範例:
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
您定義的那些變數將儲存在堆棧中(如果有空間並且您將它們保存在一個函式中)。如果編譯會正確優化它,它將是免費的,如果沒有,每個變數都會花費你
PUST
和POP
操作(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 氣體