ZooBC 维基
交易

每个账户每个区块一笔交易与批量交易

从 0.5.8 版本起,每个区块都适用一条简单的有效性规则:每个账户在其中最多只能有一笔交易。要一次做很多事,账户可以使用批量交易,即一笔携带同一种类多个操作的交易。这两条规则合在一起,让节点在区块之前所做的检查保持准确,同时仍允许繁忙的账户在单个区块内向许多人付款。

规则

这里的账户指的是签名地址。包含来自同一地址两笔交易的区块在每个节点上都无效,因此诚实的出块者绝不会构建这样的区块。出块者先取每个账户最早的符合条件的交易,把下一笔留给 15 秒后的后续区块。

发送方 A 的一队交易按最早优先、每个区块一笔的方式进入区块 N、N+1 和 N+2,而发送方 B 和 C 的交易填入同样的区块
发送方 A 的一队交易按最早优先、每个区块一笔的方式进入区块 N、N+1 和 N+2,而发送方 B 和 C 的交易填入同样的区块

账户仍然可以连续提交多笔交易。节点的交易池为每个发送方最多保留 50 笔待处理交易(这是每个节点的本地策略),出块者按最早优先的顺序每个区块打包其中一笔。

由这一定义可以得出两个细节:

  • 账户组的每个成员各有自己的名额,因为每个成员用自己的地址签名,尽管这些成员共享同一个余额;
  • 当多重签名账户的内部交易执行时,它计入该多重签名账户。

为什么有帮助

节点会对照已确认状态检查一笔交易两次:一次是把它接纳进交易池时,一次是组装区块时。每个账户只有一笔交易时,同一账户的其他交易不可能在区块内改变该状态。因此,对于只有发送方才能控制的一切,例如它自己的余额和它自己的对象,检查始终准确。

在不同账户之间,先被应用的交易胜出。如果两个账户试图接受同一个兑换报价,先到者得到它,而第二笔交易已失去意义:它是一个付费空操作,支付手续费而不做任何其他事(见 交易)。诚实的出块者会把这样的交易排除在外。没有针对每种对象的单独规则。

批量交易

批量交易是一笔携带同一种类多个操作的交易。共有三种:

  • ZBC 支付,一个批次最多 25 笔;
  • 代币转账,最多 32 笔,代币种类不限,手续费以 ZBC 支付;
  • 存储证明,最多 1,000 份,每个节点每个存储纪元一个批次(见 去中心化存储池)。

批量交易是全有或全无的。每个操作都会预先检查,因此其中的付款要么全部完成,要么一笔都不完成,而且整个批次只签名一次。

批量交易的费用

多个操作按多笔交易付费。批量交易的最低手续费,是其中各个操作作为单独交易时应付最低手续费之和:每个操作一份基础费用,加上每个操作的字节费用(见 手续费),而批次的消息只计费一次。不带消息的三笔付款,放在一个批次中与作为三笔单独交易的费用相同。由存储证明组成的批量交易不付任何费用:每份存储证明都是免手续费的职责交易,因此总和为零。

三笔单独的付款各带自己的手续费,等同于一个携带同样三份手续费的三笔付款批次,该批次标注为全有或全无、只签名一次
三笔单独的付款各带自己的手续费,等同于一个携带同样三份手续费的三笔付款批次,该批次标注为全有或全无、只签名一次

批量交易节省的主要是网络的工作量,而不是手续费:只需验证一个签名,只占区块中的一个位置,而不是三个。这也是一个账户在同一区块中向多个接收方付款的途径。

另见