Constant

Remix 顯示來自僅聲明“常量”的 getter 的值

  • January 28, 2018
pragma solidity ^0.4.0;

contract MyFirstContract {
   uint private age;

   function setAge(uint newAge) {
       age = newAge;
   }

   function getAge() returns (uint) {
       return age;
   }
}

當我在 remix 中創建契約,然後將例如數字 3 設置為變數 age 時,然後當我呼叫 getAge() 時它什麼也不顯示。但是,如果我添加“常量”,例如:

function getAge() constant returns (uint) {
   return age;
}

然後它工作。我看到一些影片說相同的程式碼在沒有聲明“常量”的情況下工作,所以我真的不明白為什麼它對我不起作用。

在智能合約中呼叫函式有兩種方法:

  1. 您可以發送交易。交易被發送到網路並作為區塊的一部分被探勘。它由網路中的所有節點驗證。
  2. 你可以呼叫一個函式。這不會向網路的其餘部分發送任何內容;在您連接的節點上本地執行呼叫。您取回函式的返回值,否則呼叫沒有副作用。如果它轉移了乙太幣或更改了狀態變數,那麼這些更改就會被丟棄。通話的優點是快速且免費(無需支付gas)。

Remix 根據函式是否標記為變異狀態來決定是發送事務還是進行呼叫。view/constant告訴編譯器然後 Remix 你沒有改變狀態,所以這個函式可以被call編輯而不是發送一個事務。

constant這解釋了為什麼 Remix 會根據您是否使用修飾符來不同地處理函式。最後一個難題是事務沒有返回值。如果您getAge作為事務呼叫,程式碼將執行,但您不會取回返回值。

由於這些差異,最佳做法是始終將不修改狀態的函式標記為view(更好的別名constant)。這使得該函式快速、免費並且能夠向您返回一個值。

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