Solidity
純/視圖函式的 Gas 成本呼叫與發送
我知道純/視圖函式通過簡單的“呼叫”無需花費任何氣體。但是,如果我有一個基於純/視圖函式結果更改合約狀態的函式會發生什麼。如果我執行“發送”,我是否必須為純/視圖函式循環付費?
在我的範例中,我想在數組中查找一個數字並返回索引。
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 等的節點)中執行時不會消耗氣體。在這種情況下,交易將不會被發送。
另一方面,如果將交易發送到網路(如您的情況),純和查看功能將消耗氣體。
希望這可以幫助。