何時使用“View”和“Pure”代替“Constant”
這個版本最終檢查了修飾符視圖(以前被命名為常量)和純函式。根據經驗,如果您的函式不修改儲存,請使用 view ;如果它甚至不讀取任何狀態資訊,請使用 pure ——但編譯器本身也會建議最嚴格的限制。
這在實踐中意味著什麼?
在早期版本中,我們會應用
constant
修飾符來指示函式不會以任何方式更改儲存狀態。例如:pragma solidity 0.4.16; contract UseConstant { string greeting; function UseConstant() public { greeting = "Hello"; } function SayHello() public constant returns(string says) { return greeting; } }
constant
表示不需要網路驗證。呼叫者接收return
值(快速,從本地儲存和處理)而不是事務雜湊。從 solc 0.4.17 開始,
constant
不贊成使用兩個新的和更具體的修飾符。查看這通常是
constant
. 它表示該函式不會以任何方式改變儲存狀態。Pure這更加嚴格,表示它甚至不會讀取儲存狀態。
一個
pure
函式可能看起來像這個非常人為的例子:function returnTrue() public pure returns(bool response) { return true; }
在 Remix 中,當您使用舊的
constant
修飾符時會收到警告。它將檢查功能程式碼並指示您可以安全應用的最大限制。希望能幫助到你。
更新
這是一個受歡迎的問答,所以我決定在更詳細的 Medium 文章中詳細說明:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2
修飾符的
constant
含義是函式不會修改合約儲存(但是常量這個詞實際上並沒有傳達它所使用的含義)。solidity 0.4.17 版本
constant
之後的新替代品:並傳達了它們的用法含義。view``pure
view
可以被視為constant
將讀取儲存(因此查看)的子集。但是儲存不會被修改。例如:
contract viewExample { string state; // other contract functions function viewState() public view returns(string) { //read the contract storage return state; } }
pure
可以被認為是constant
返回值僅由其參數(輸入值)確定的子集。不會對儲存進行讀寫,只會使用局部變數(在函式式程式中有純函式的概念)例如:
contract pureExample { // other contract functions function pureComputation(uint para1 , uint para2) public pure returns(uint result) { // do whatever with para1 and para2 and assign to result as below result = para1 + para2; return result; } }
要從外部執行/呼叫這些
pure
或view
函式,不需要事務。只需 acall
就足夠了,因為呼叫這些不會改變區塊鏈的狀態。因此,從外部使用這些功能不需要氣體/乙醚。但是,如果內部呼叫來自交易,則對這些函式的內部呼叫可能會花費 gas。可以在此處找到更多關於內部呼叫如何花費 gas 的詳細資訊。