Solidity

何時使用“View”和“Pure”代替“Constant”

  • January 26, 2021

根據solidity 0.4.17發行說明

這個版本最終檢查了修飾符視圖(以前被命名為常量)和純函式。根據經驗,如果您的函式不修改儲存,請使用 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;
   }

}

要從外部執行/呼叫這些pureview函式,不需要事務。只需 acall就足夠了,因為呼叫這些不會改變區塊鏈的狀態。因此,從外部使用這些功能不需要氣體/乙醚。

但是,如果內部呼叫來自交易,則對這些函式的內部呼叫可能會花費 gas。可以在此處找到更多關於內部呼叫如何花費 gas 的詳細資訊。

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