Constant
Remix 顯示來自僅聲明“常量”的 getter 的值
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; }
然後它工作。我看到一些影片說相同的程式碼在沒有聲明“常量”的情況下工作,所以我真的不明白為什麼它對我不起作用。
在智能合約中呼叫函式有兩種方法:
- 您可以發送交易。交易被發送到網路並作為區塊的一部分被探勘。它由網路中的所有節點驗證。
- 你可以呼叫一個函式。這不會向網路的其餘部分發送任何內容;在您連接的節點上本地執行呼叫。您取回函式的返回值,否則呼叫沒有副作用。如果它轉移了乙太幣或更改了狀態變數,那麼這些更改就會被丟棄。通話的優點是快速且免費(無需支付gas)。
Remix 根據函式是否標記為變異狀態來決定是發送事務還是進行呼叫。
view
/constant
告訴編譯器然後 Remix 你沒有改變狀態,所以這個函式可以被call
編輯而不是發送一個事務。
constant
這解釋了為什麼 Remix 會根據您是否使用修飾符來不同地處理函式。最後一個難題是事務沒有返回值。如果您getAge
作為事務呼叫,程式碼將執行,但您不會取回返回值。由於這些差異,最佳做法是始終將不修改狀態的函式標記為
view
(更好的別名constant
)。這使得該函式快速、免費並且能夠向您返回一個值。