1. 程式人生 > >第二集:Solidity函式講解

第二集:Solidity函式講解

函式基礎

1.Solidity本身也是一門函式程式語言,也就是說函式可以做引數、變數、返回值。函式屬於值型別,支援多返回值。

2.呼叫方式

  • 內部呼叫
  1. 內部呼叫採用EVM跳轉呼叫,所以能夠直接使用上下文中的資料,因為不用拷貝資料,所以在資料傳遞的時候非常高效
  2. 對合約內的函式,引入的庫函式和從父合約中繼承的函式都可以進行內部呼叫
  • 外部呼叫
  1. 採用外部交易呼叫,使用external。對於一個外部呼叫,所有的函式引數必須要拷貝到記憶體中。

函式定義型別

1.View:只讀,不改變合約內部狀態

  • 會改變合約狀態的操作
  1. 寫入狀態變數
  2. 底層的呼叫
  3. 呼叫任何一個沒有被標記為view或者pure的函式
  4. 傳送以太幣
  5. 使用自毀函式
  6. 建立合約
  7. 觸發事件

在箭頭位置新增view,可以解除方框內的warning。

2.Pure:也不會修改合約狀態,而且pure標記的函式不能讀取合約狀態(可以讀取與合約狀態無關的資料)。

  • 與view相比,pure的限制還包括更多的內容
  1. 不能讀取狀態變數
  2. 用任何一個沒有被標記為pure的函式
  3. 不能訪問block,tx,msg的大多數成員(可以訪問msg.sig,msg.data)
  4. 不能訪問this.balance或者address.balance

特殊函式型別

回退函式

  • 定義:在每個合約中都有一個沒名字的函式,該函式沒有名字、沒引數、沒有返回值,這就是回退函式
  • 作用:
  1. 在呼叫合約時,沒有匹配上任何一個函式
  2. 如果回撥函式要接收ether,必須要有payable修改飾符
  3. 給合約傳送ether時也會呼叫,需要注意的是,如果合約沒有定義回撥函式的話,接收ether會觸發異常。

呼叫一個存在的函式,若沒有調到,則呼叫回退函式。


自毀函式

  • 自毀函式可以摧毀當前合約,如果合約中有以太幣,則會將以太幣轉移到給定的地址
  • 如果合約在被自毀之後還有人傳送以太幣到這個合約地址,那麼這些以太幣就會消失,無法贖回

常函式

  • 關鍵字 : constant
  • 常函式不會修改區塊鏈上的任何狀態,沒有強制的規定,但是會給警告。

訪問器(getter)

  • 編譯器為自動為所有的public狀態變數建立訪問器
  • 訪問函式具有外部可見性。如果通過內部方式訪問,可以直接當成一個變數。但如果通過外部方式進行訪問,比如通過this,那麼必須通過函式的方式呼叫。


其它內建函式

加密函式

  • Solidity中的加密實際上呼叫的是以太中的加密函式
  • keccak256(x)

  • sha256(x)
  • sha3(x)
  • ripemd160(x)
  • ecrecover(hash, v, r, s)   公鑰恢復的函式

資料函式

  • addmod(x, y, k):x+y對k取餘
  • mulmod(x, y, k):x * y 對k 取餘

 

函式修改器(modifier)

  • 修改器的作用是在函式執行前檢查某種前置條件是否滿足
  • 修改器是一種合約的屬性,可以被繼承也可以被派生的合約重寫。
  • 一個函式可以有多個修改器,其間採用空格分開,而修改器的生效順序與定義順序一樣。
  • 必須要加   _;


函式可見性與許可權

內部函式:internal

外部函式:external

私有函式:private

公有函式:public

  • Internal:不能夠在當前合約的上下文環境之外執行,只能在當前合約內進行呼叫。比如當前的程式碼塊,內部的庫函式,繼承的合約中。
  • external:
  1. external可以用途外部函式呼叫的引數,或者由外部函式呼叫返回
  2. 還可以通過其它合約進行呼叫
  3. 如果是this呼叫,那麼都是在通過external的方式進行呼叫
  4. 不能在內部去呼叫一個外部函式
  • private:私有函式只能在當前合約中進行訪問,不能通過繼承進行訪問

  • public:公有函式,可以通過內部,外部,或者訊息進行進行呼叫。對於public型別的狀態變數,會自動建立一個訪問器。

在內部呼叫:

在外部呼叫:

通過繼承呼叫: