摘要
触发器是一种触发智能合约执行的机制。本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状态。所以转给老合约的交易会被拒绝且没有状态会被改变
实现
https://github.com/neo-project/neo
原文链接:https://github.com/neo-project/proposals/blob/master/nep-7.mediawiki