7. 创世过程
创建创世区块的过程与之前的日记账部分中介绍的标准区块创建的过程不同 。
当使用链上设置(例如在起链时所需的特定共识算法,任何部署专用的配置设置以及任何应用程序专属的交易)来引导新的Sawtooth网络时,需要创世块(区块链的根)。
创世块包含了验证机制从头创建一条链时要处理的一系列批次的列表。这使得应用程序(也称为交易家族)可以只包括自己的批次,而无需知道链创世过程中的详细过程(无需包括链创世需要用到的批次)。
创世过程一般具有以下步骤:
1) 创建一个含有初始区块链交易的创世批次
2) 从创世批次创建创世区块
3) 启动交易处理器
4) 处理创世块
7.1 创建创世批次
sawadm genesis命令将一组批次作为输入,并将它们组合以创建创世批次。这个批次是存放在GenesisData中的经protobuf编码的单一批次列表。
将按照与批次列表相同的顺序依次执行创世块中的批次。每一个批次都隐式依赖于前一个。sawadm genesis命令在创建列表时会检查依赖关系,以验证批次的前后顺序正确(如果存在依赖关系的话)。
如果应用程序需要在创世区块中包括一组交易,则它必须提供一种工具以正确的顺序产生GenesisData中的批次清单。如有必要,此工具还应在应用程序的创世批次上下文中显式地管理批次和交易的依赖关系。
以下示例使用sawset proposal create命令创建一批配置PoET共识的交易。接下来,sawadm genesis命令将该批次(连同存在的任何其他批次)组合到创世区块的GenesisData的批次列表中。
当运行sawadm genesis命令时,它在验证组件的数据目录下写入一个genesis.batch文件。
注意:对于使用PoET共识的网络,创始批次中必须包括其他批次。
7.2 创建创世区块
一旦存在创始批次,验证组件将使用以下过程生成创始块。
1. 验证组件启动时,如果满足以下条件,它确定将产生创世块:
· genesis.batch文件存在
· 目前没有区块被指定作为链头
如果不满足以上任一条件,则验证组件将停止操作。
2. 验证组件将genesis.batch文件中的批次加载到挂起的队列中。
3. 验证组件使用区块创建的标准流程来生成创世区块,但作以下修改:
· 批次的执行顺序严格按照GenesisData列表中的批次顺序执行 。执行程序不会尝试对批次重新排序或删除失败的交易。如果genesis.batch中的任何交易失败,则不会产生任何创始块。验证组件将视此失败为重大错误。
· 验证组件在确认区块有效性时不考虑共识。即可确定块有效性。在开始创世块创建过程时,(默克尔-基数树)的状态为空,因此该区块链尚没有共识算法。所以,创世块中的共识字段为空。
4. 验证组件还将区块链ID(即创世块的签名)写入验证组件数据目录中的文件block-chain-id。区块链ID用于将验证组件中的创始块标记为该区块链的正确创世区块。
7.3 创世块处理
为了完成创世过程并提交创始块,必须运行所有必需的交易处理器。
如果创世块中有任何设置或更改设置的交易,则Sawtooth需要Sawtooth Settings交易处理器 或等效的处理。例如,创世块指定共识引擎和相关设置,因此需要Settings交易处理器来处理与这些设置相关的交易。
提交创世块后,共识设置将存储在状态中。所有后续块均使用配置的共识算法。