Solidity

純/視圖函式的 Gas 成本呼叫與發送

  • February 11, 2020

我知道純/視圖函式通過簡單的“呼叫”無需花費任何氣體。但是,如果我有一個基於純/視圖函式結果更改合約狀態的函式會發生什麼。如果我執行“發送”,我是否必須為純/視圖函式循環付費?

在我的範例中,我想在數組中查找一個數字並返回索引。

function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
   bool exist;
   for (uint i=0; i<_array.length;i++){
       if(_array[i] == _value){
           exist = true;
           return i;
       }
   }
   assert(exist == true);
}

https://github.com/ethereum/solidity/issues/992中有兩條語句

關鍵字view是為函式引入的(它取代了constant)。呼叫視圖不能改變未來與任何合約互動的行為。這意味著這些函式不能使用SSTORE,不能發送或接收乙太,只能呼叫其他視圖或純函式。

關鍵字pure是為函式引入的,它們是view具有附加限制的函式,即它們的值僅取決於函式參數。這意味著他們不能使用SSTORE, SLOAD,不能發送或接收乙太幣,不能使用 msg 或 block 並且只能呼叫其他純函式。

這意味著 view 和 pure 不能改變契約狀態。如果您需要更改契約狀態,則需要刪除pure,view關鍵字。

function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
   bool exist;
   ...
}

該函式不會改變合約的狀態。exist變數儲存在堆棧中

Pure 和 view 函式在您的本地節點(或您用作本地、infura、etherscan 等的節點)中執行時不會消耗氣體。在這種情況下,交易將不會被發送。

另一方面,如果將交易發送到網路(如您的情況),純和查看功能將消耗氣體。

希望這可以幫助。

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