Skip to content

Latest commit

 

History

History
171 lines (134 loc) · 12.5 KB

File metadata and controls

171 lines (134 loc) · 12.5 KB

WTF Solidity 極簡入門:3. 函數

重點內容

Note

函數可見性說明符:public、private、external、internal

隨筆

函數形式

    function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]

函數可見性說明福符號

  1. public:內部和外部皆可見

  2. private:只能從本合約內部訪問,繼承合約也不能調用

  3. external:只能從合約外部訪問(內部可通過 this.f() 調用,f 是函數名)

  4. internal:只能從合約內部訪問,繼承合約可以調用

Tip

函數需要明確指定可見性,沒有默認值

Tip

修飾符也可用於修飾狀態變量。public 變量會自動生成同名 getter 函數用於查詢數值。未標明可見性的狀態變量,默認為 internal

pure、view、payable

包含 pure 和 view 關鍵字的函數不改寫戀上狀態,因此用戶直接調用不需要付 gas
注意: 合約中非 pure / view 函數調用 pure / view 函數時需要付 gas

以下語句被視為修改鏈上狀態

  1. 寫入狀態變量
  2. 釋放事件
  3. 創建其他合約
  4. 使用 selfdestruct
  5. 通過調用發送 eth
  6. 調用任何為標記 view 或 pure 的函數
  7. 使用低級調用(low-level calls)
  8. 使用包含某些操作碼的內聯彙編

pure

pure 函數既不能讀取也不能寫入鏈上狀態變量
舉例:

    function addPure(uint256 _number) external pure returns(uint256 new_number){
        new_number = _number + 1;
    }

view

view 函數能讀取但不能寫入鏈上狀態變量
舉例:

    function addView() external view returns(uint256 new_number) {
        new_number = number + 1;
    }

payable

帶著他的函數,運行時候可以給合約轉入 ETH

題目練習

  1. Q: 下面哪像不是 Solidity 中的函數可見性說明符?
    A: protected

  2. Q: 下面关于view关键字的描述,哪一项是准确的?
    A: 包含 view 關鍵字的函數,可以讀取但不能寫入儲存在鏈上的狀態變量

  3. Q: 下面关于pure和view两个关键字的描述,哪一项是错误的? A: 每個函數在聲明時必須包含這兩個關鍵字中的一個

  4. 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

  5. Q: 以下代码截取自 USDT 的 Token 合约,其声明了一个函数,任何用户都可以调用这个函数以查询某个地址的 USDT 余额:

         function balanceOf(address who) _____ returns (uint)

    A: public