3.为何采用批次
如前所述,批次是系统中发生变化的最小单位。如果一个批次被执行,批次内所有的交易都会按顺序被执行。如果一个批次没有被执行(或许是由于其中一个交易无效导致),则该批次内所有的交易都不会被执行。
由于一个批次内的交易无需很精准明确地指明他们互相之间的依存关系,从客户角度来说,这极大地简化了(交易间)依赖关系的管理。只有当交易无法放在同一个批次里的时候,存放在交易(Transaction)的依赖关系域中的精准明确的依赖关系才有价值。
采用批次的方式解决了一个靠指明精确依赖关系而无法解决的重要问题。假设我们有交易A、B、C,希望他们按照这个顺序被执行,而且希望当其中一个无效时,其他两个不会被执行。我们可能会尝试以下依赖关系,比如说C的执行取决于B,B取决于A,A又取决于C。但是,交易(Transaction)中的依赖关系域无法表达上面这次关系,因为它强调单向顺序,而上述是循环关系。
来自多个交易家族的交易也可以一起批处理,这进一步鼓励了交易家族的重复使用。例如,来自配置或身份交易家族的交易可以与特定应用的交易一起批处理。
交易和批次也可以通过不同的密钥进行签名。例如,浏览器应用程序可以对交易进行签名,而服务器端组件也可以添加交易并创建批次和对批次签名。这会带来有趣的应用程序模式,包括将来自多个交易对象的交易聚合到一个最小单元操作(一个批次)中。
交易和批次之间存在一个重要的限制,那就是该交易必须在batcher_public_key字段中包含批次签名者的公钥。这是为了防止交易不在原定批次里被重新使用。因此,例如,除非您拥有批次的私钥,否则不可能从该批次中抽取出交易,删除部分后将它们重新打包为一个新的批次。