第二集:Solidity函式講解
阿新 • • 發佈:2018-11-10
函式基礎
1.Solidity本身也是一門函式程式語言,也就是說函式可以做引數、變數、返回值。函式屬於值型別,支援多返回值。
2.呼叫方式
- 內部呼叫
- 內部呼叫採用EVM跳轉呼叫,所以能夠直接使用上下文中的資料,因為不用拷貝資料,所以在資料傳遞的時候非常高效
- 對合約內的函式,引入的庫函式和從父合約中繼承的函式都可以進行內部呼叫
- 外部呼叫
- 採用外部交易呼叫,使用external。對於一個外部呼叫,所有的函式引數必須要拷貝到記憶體中。
函式定義型別
1.View:只讀,不改變合約內部狀態
- 會改變合約狀態的操作
- 寫入狀態變數
- 底層的呼叫
- 呼叫任何一個沒有被標記為view或者pure的函式
- 傳送以太幣
- 使用自毀函式
- 建立合約
- 觸發事件
在箭頭位置新增view,可以解除方框內的warning。
2.Pure:也不會修改合約狀態,而且pure標記的函式不能讀取合約狀態(可以讀取與合約狀態無關的資料)。
- 與view相比,pure的限制還包括更多的內容
- 不能讀取狀態變數
- 用任何一個沒有被標記為pure的函式
- 不能訪問block,tx,msg的大多數成員(可以訪問msg.sig,msg.data)
- 不能訪問this.balance或者address.balance
特殊函式型別
回退函式
- 定義:在每個合約中都有一個沒名字的函式,該函式沒有名字、沒引數、沒有返回值,這就是回退函式
- 作用:
- 在呼叫合約時,沒有匹配上任何一個函式
- 如果回撥函式要接收ether,必須要有payable修改飾符
- 給合約傳送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:
- external可以用途外部函式呼叫的引數,或者由外部函式呼叫返回
- 還可以通過其它合約進行呼叫
- 如果是this呼叫,那麼都是在通過external的方式進行呼叫
- 不能在內部去呼叫一個外部函式
-
private:私有函式只能在當前合約中進行訪問,不能通過繼承進行訪問
-
public:公有函式,可以通過內部,外部,或者訊息進行進行呼叫。對於public型別的狀態變數,會自動建立一個訪問器。
在內部呼叫:
在外部呼叫:
通過繼承呼叫: