触发器与见证
触发器是由链持有的条件付款:ZBC 先被锁定,之后在条件满足时释放给接收方。条件要么是一个区块高度,要么是外部世界的一个事件(例如比赛结果),由已注册节点通过见证加以确认。触发器无需任何合约代码,就能实现时间锁、延迟赠予以及基于现实世界结果的支付。
创建触发器
CreateTrigger 交易(类型 15)声明接收方、金额和条件。触发器只承载 ZBC。条件有两种:
- 高度触发器指定一个区块高度,该高度必须在未来。每 15 秒出一个区块,因此高度相当于日期:一天之后就是 5,760 个区块;
- 事件触发器指定一个事件 id,当已注册节点裁定该事件时触发;在此之前,它一直处于待处理状态,除非被取消。它还携带一个触发高度,但这个高度不会被使用。
金额立即离开创建者的余额并被锁定。在触发器触发之前,创建者可以用 CancelTrigger(类型 16)取回这笔钱。触发器只付款一次:它不运行任何脚本,也不会重复。
见证:事件如何裁定
区块链无法自行读取外部世界:如果每个节点都去抓取一个网页,它们可能看到不同的答案而产生分歧。ZooBC 改用见证。
- 已注册节点发送一笔 AttestEvent(类型 17),携带一个事件 id 和一个值,各自最多 4,096 字节。
- 每个节点对每个事件只有一票:较新的见证会替换它较旧的见证。只有来自已注册节点的见证才算数。
- 在每个区块结束时,链会统计每个未裁定事件的见证。当活跃注册表中三分之二的节点见证了完全相同的值时(例如 11 个席位中的 8 个),该值就成为该事件的结果,并且永久有效。
- 在同一个区块中,每个指定该事件的待处理触发器都会向其接收方付款。
见证是一种免手续费的职责交易:它声明恰好为 0 的手续费,并且来自节点自己的账户(见 手续费)。当注册表的席位数和不同所有者数低于下限 max(3, min_registry_size)(在 mainnet 上为 7)时,任何全注册表范围的决定都不会被裁定(见 三分之二规则)。
保留的事件 id
同样的见证也承载其他网络决定,使用事件 id 的保留前缀。每种决定由自己的步骤来裁定,而不是由触发器步骤裁定:
与其他功能的配合
- 触发器的付款属于入账,因此会经过接收方的分账策略(见 分账策略与交易策略)。
- 接收方的交易策略只针对 CreateTrigger 本身进行检查;即使接收方之后选择拒收付款,释放的资金仍会到达它。
- 在交易策略中,AttestEvent 属于“桥接”类别。
重复的付款见 定时转账;逐分钟归属的资金见 流动支付(流式支付)。