Note
函數可見性說明符:public、private、external、internal
function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]
-
public:內部和外部皆可見
-
private:只能從本合約內部訪問,繼承合約也不能調用
-
external:只能從合約外部訪問(內部可通過
this.f()
調用,f 是函數名) -
internal:只能從合約內部訪問,繼承合約可以調用
Tip
函數需要明確指定可見性,沒有默認值
Tip
修飾符也可用於修飾狀態變量。public 變量會自動生成同名 getter 函數用於查詢數值。未標明可見性的狀態變量,默認為 internal
包含 pure 和 view 關鍵字的函數不改寫戀上狀態,因此用戶直接調用不需要付 gas
注意: 合約中非 pure / view 函數調用 pure / view 函數時需要付 gas
以下語句被視為修改鏈上狀態
- 寫入狀態變量
- 釋放事件
- 創建其他合約
- 使用 selfdestruct
- 通過調用發送 eth
- 調用任何為標記 view 或 pure 的函數
- 使用低級調用(low-level calls)
- 使用包含某些操作碼的內聯彙編
pure 函數既不能讀取也不能寫入鏈上狀態變量
舉例:
function addPure(uint256 _number) external pure returns(uint256 new_number){
new_number = _number + 1;
}
view 函數能讀取但不能寫入鏈上狀態變量
舉例:
function addView() external view returns(uint256 new_number) {
new_number = number + 1;
}
帶著他的函數,運行時候可以給合約轉入 ETH
-
Q: 下面哪像不是 Solidity 中的函數可見性說明符?
A: protected -
Q: 下面关于view关键字的描述,哪一项是准确的?
A: 包含 view 關鍵字的函數,可以讀取但不能寫入儲存在鏈上的狀態變量 -
Q: 下面关于pure和view两个关键字的描述,哪一项是错误的? A: 每個函數在聲明時必須包含這兩個關鍵字中的一個
-
Q: 以下代码截取自 SafeMath Library,其定义了一个函数以替代“加法”,如果加法的结果溢出则会返回异常:
function add(uint256 a, uint256 b) internal _____ returns (uint256) { uint256 c = a + b; assert(c >= a); // 本行代码意为:若c不大于等于a,则说明加法运算溢出,抛出异常 return c; }
A: pure
-
Q: 以下代码截取自 USDT 的 Token 合约,其声明了一个函数,任何用户都可以调用这个函数以查询某个地址的 USDT 余额:
function balanceOf(address who) _____ returns (uint)
A: public