1、什么是ordering
在许多分布式区块链技术(如以太坊、比特币等)中,是没有准入限制的。也就是说是公链,任何一个节点都可以参与到共识机制中来,这个过程中,交易被排序打包成一个block。
基于以上事实,这些区块链技术都依赖于共识概率算法,来最大可能的保证ledger的一致性,但是,仍然会有分岔的可能。
Hyperledger Fabric采用不同的方式,它提供了叫做orderer的功能节点,用于对交易进行排序打包。
因为Fabric的设计是基于确定性的共识算法,被 peer 验证过的、并由orderer打包的block可以确保是最终的、并且正确的。因此在Fabric中,不会出现分岔的情况。
2、Orderer nodes 和 channel configuration
除了ordering角色之外,Orderer还维护一个组织列表,这些组织被允许创建channel。
我们这个组织列表称为联盟,这个列表保存在orderer system channel配置中。
默认情况下,这个组织列表和这个channel只能被orderer admin修改。
ordering service可以持有多个这样的组织列表。
Orderers也进行一些对channel的基本权限管控,限定谁可以读、写数据,谁可以进行配置等等。
有权修改channel配置的相关人员必须受到当初联盟创建之初时既定的一些策略约束。
Orderer进行配置相关的transaction时,需要知道当前的策略集,来查看执行者是否具符合相应的约束、是否具有合适的管理权限。如果符合,orderer会验证这个配置羹新的请求,并产生一个新的配置transaction,然后对其进行打包并分发到channel上的所有peer上。然后peer也会对这个配置transaction进行处理,以验证orderer批准的这个修改确实时符合channel创立之初既定的策略的。
3、Orderer ndoes 和 Identity
每一个与区块链网络进行交互的对象,包括peers、applicaitons、admins和orderers,都需要从他们的数字证书和 Membership Service Provider(MSP) 来获得他们的组织身份认证(organizational Identity )。
和peer一样,ordering node也属于一个组织,每个组织都需要使用独立的CA。
4、Orderers和transaction 流程
步骤1:提案 proposal
我们从Peers简介得知,peers是区块链网络的基本组成部分,他们持有ledger,这些ledger可以通过智能合约进行查询和修改。
要对ledger进行修改,需要通过三个步骤来确保区块链网络上每个peer的ledger保持一致。第一个步骤就是提案阶段。
首先,客户端application将交易提案发送给区块链网络中的一部分peers,这些peers会调用智能合约来产生一个ledger update的提议,然后peers会对这个结果进行背书(endorse)。这个时候,进行背书的节点并不会将这个ledger update的提议具体应用到本身的ledger上,而是将这个提案的请求返回给客户端application。
步骤2:将交易排序并打包到block
执行完步骤1之后,客户端applicaiton已经接收到了peers返回的、已完成背书的交易提案。现在开始第二步:
客户端application将包含已完成背书的交易提案,提交给ordering service node。然后ordering service将这些交易打包到block,然后最终会分发给所有的peers来进行验证和提交。
Ordering nodes并发的接收来自不同appliction的交易,这些ordering service nodes一起工作,组成了ordering service。他们的工作是将这些交易分批分配到预定义的序列中,然后打包进block。这些block就是区块链网络中的区块。
区块中打包的交易数量是基于channel配置参数决定的,BatchSize和BatchTimeout。然后,这些区块会保存到orderer‘s的ledger中,并分发到所有加入到当前channel的peer上。如果这时一个peer宕机了,或者稍后才加入这个channel,那么这个peer会在重新连接到ordering service ndoe的时候再接收这些blocks,或者通过长舌妇协议,从其他的peer上接收这些blocks。
步骤3:验证和提交
当peer接收到从ordering分发的block后,他们可以独立的对这些blocks进行验证。
具体来说,channel中每个peer都会验证block中的每个交易,检查其是否被所需的组织peers背书过,背书是否匹配,检查其是否被最近提交过的其他交易影响而变为invalid。已经失效的交易仍旧存在block中,他们会被标记为invalid,并且不会对ledger进行更新。