文章目錄
- 摘要
- 動機
- 原理
- 詳述
- 鑑權觸發器
- 鑑權R觸發器
- 應用觸發器
- 應用R觸發器
- 後相容性
- 實現
摘要
觸發器是一種觸發智慧合約執行的機制。本NEP定義四種型別的觸發器,
他們是鑑權觸發器、鑑權R觸發器、應用觸發器、應用R觸發器
動機
提供智慧合約系統的區塊鏈應當為其上執行的智慧合約提供多種觸發器來使其
在不同環境中執行。
原理
當前,Neo智慧合約中有兩種觸發器:鑑權觸發器和應用觸發器
這兩種觸發器使得智慧合約能夠驗證交易和修改區塊鏈的狀態。
但沒有辦法讓智慧合約拒絕一個交易,或在接受一個交易時修改區塊鏈的狀態。
我們需要兩種新的觸發器來實現:鑑權R觸發器和應用R觸發器
詳述
我們定義四種觸發器:鑑權觸發器、鑑權R觸發器、應用觸發器和應用觸發器R
鑑權觸發器
鑑權觸發器代表合約作為鑑權函式被呼叫。鑑權函式能接收多個引數,並返回
一個布林值代表交易和區塊的有效性如果合約由鑑權觸發器觸發,則將呼叫合
約的入口函式:
main(…);
合約的入口函式必需能夠處理這種型別的呼叫。
鑑權R觸發器
鑑權R觸發器代表合約作為鑑權函式被呼叫,因為他被指定為交易的輸出。
鑑權函式函式不接受任何引數,並應返回一個指示交易有效性的布林值。
如果合約由鑑權R觸發器觸發,則將呼叫合約的入口函式:
main(“receiving”, new object[0]);
合約的入口函式必需能夠處理這種型別的呼叫。
receiving函式需要有以下程式設計介面:
public bool receiving()
receiving函式必需在合約從一個交易接收資產時被自動呼叫。
應用觸發器
應用觸發器代表合約作為一個應用函式被呼叫。應用函式可以接收多個引數,
改變區塊鏈的狀態和返回各種型別的值
合約可以有任何格式的入口,但我們必需記住所有合約必需有以下入口:
public byte[] main(string operation, params object[] args)
函式可以在建立一個InvocationTransaction時被呼叫。
應用R觸發器
應用R觸發器代表函式的預設函式received 函式正在被呼叫,因為它被指定為
交易的輸出。received 函式不接受任何引數,更改區塊鏈的狀態,和返回任
何型別的值。
當合約被鑑權R觸發器觸發時,會呼叫入口函式:
main(“received”, new object[0]);
received 函式需要有以下程式設計介面:
public byte[] received()
received 函式在合約從一個交易接收資產時被自動呼叫。
後相容性
沒有實現receiving和received函式的老合約在被鑑權R觸發器和應用觸發器觸發
時會導致虛擬機器的FAULT狀態。所以轉給老合約的交易會被拒絕且沒有狀態會被改變