1. Fabric中的四种节点
客户端节点
介于应用程序与底层之间,是两者之间交互的媒介节点。它不能独立存在,必须与Orderer节点
与Peer节点
建立连接,才可以发挥作用,比如连接到Orderer节点
进行通道创建,连接到Peer节点
进行交易模拟执行
Peer节点
Peer节点
是一个统称,包含了Leader(主节点),Anchor(锚节点),Endorser(背书节点)以及Committer(记账节点)
Leader
主节点连接到Orderer节点
并与之通信,从Orderer节点
获取区块,并通知给组织内部的其他节点,主节点可以通过自动选举产生。
Anchor锚节点
是在通道上可以被所有其他Peer
节点发现的节点,负责和其他组织通信,可以有多个。
Endorser背书节点
,可以简单理解为担保,它就是为交易做担保的。Farbic中的共识的第一步,就是应用程序向背书节点发送一个交易提案,交易背书节点经过交易模拟执行以后,返回给应用程序背书结果以及签名。
Endorser背书节点
不是一个固定的节点类型,是和智能合约绑定的。每一个智能合约在安装到区块链上的时候,都会设置其专有的背书策略,指定该智能合约的交易由哪些节点背书以后才是有效的。也就是说只有在Endorser背书节点
上才会运行智能合约。
如果一个Peer节点
不是某些背书策略里的一员,那么就是一个普通的Peer节点
,也就是最后的Committer记账节点
。
Committer记账节点
,所有的Peer节点
都是记账节点,无论它是否是Anchor锚节点
还是Endorser背书节点
。记账节点的主要功能是用于验证从Orderer节点
接收到的区块,验证区块的有效性以及交易的有效性,验证完以后记录到本地的账本中。如果交易有效,同时更改区块链上的状态数据。
Peer节点的几种类型不是互相排斥的,一个节点可能同时是几种类型,也有可能只是Committer记账节点
Orderer节点
Orderer节点
可以称之为排序节点,主要有两个功能
- 从全网的客户端节点接收交易,然后将交易按照一定的规则进行排序
- 将排序好的交易按照固定的时间间隔打包成区块,然后分发给其他组织的主节点
有两种常用类型的排序
- solo,整个网络中只有一个排序节点,它收到的交易的顺序就是整个网络中的排好序的**交易顺序。整个模式仅仅适用于开发和测试时用,如果
Orderer节点
挂掉了,整个网络就是瘫痪的 - kafka,将整个网络中的交易排序过程转交给了kafka集群,每一个
Orderer节点
都是kafka集群的生产者和消费者,生产者将从客户端节点接收到的交易转发给kafka集群,同时消费者中kafka集群里面获取交易,这样或得到的交易就已经是排好序的了
CA节点(可选)
证书颁发机构,鉴定一个区块链的身份是否是合法的,只有被认可的身份才能在区块链中进行交易。
可有选择官方的CA,也可以选择第三方CA,这样就没有CA节点。
2. Fabric的网络拓扑图
整体网络拓扑图如下
基本上包含了上述的所有节点。客户端有4条线与其他组件进行关联,代表不同的操作
- 注册登记,客户端向CA机构表名自己的身份,然后从CA机构获取相应的证书,用于后续的操作,比如交易提案,交易提交等等(图中的CA在区块链外,是一个第三方CA)
- 客户端向两个组织的背书节点发起交易提案请求,组织1与组织2是两个独立的组织,分别代表了一堆peer节点,可以认为是两个商业主体。两个组织相互独立并不会相互通信,他们共同的数据来源就是排序节点
- 排序节点两个功能都在图上显示出了,第一个是从客户端节点接收交易,然后将交易按照一定的规则进行排序,第二个是将排序好的交易按照固定的时间间隔打包成区块,然后分发给其他组织的主节点。这里用的是kafka排序
根据上述的网络拓扑图,就可以更好地理解Fabric的整体流程了。
3. Fabric交易的整体流程
- 客户端节点构造交易提案,选择背书节点提交。背书节点的选择是与智能合约相关的,智能合约在安装的时候必须指定背书节点。如果一个智能合约要求至少两个背书节点进行背书,那么客户端就必须将交易提案发到至少两个背书节点。如果因为网络问题,其中一个背书节点没有返回结果,那么就必须发给第三个背书节点,否则该笔交易就是无效的
- 背书节点模拟执行交易提案并生成签名。背书节点在收到交易提案以后,首先会做一些验证检查方面的工作,比如对交易提案的格式的验证,该交易提案以前是否被提交过,交易发送者的签名是否正确,以及发送者是否有权利去提交这笔交易等等。验证通过以后,背书节点会将交易发送给智能合约进行隔离执行,执行完以后,会返回执行结果,背书节点对结果进行签名(背书),随后返回给应用程序。这个过程是模拟执行的,并不会产生任何持久化操作
- 背书节点将结果返回给客户端。客户端收到以后,首先对消息进行验证,如果验证通过才会执行后续的操作。验证操作以后一般会有两种处理结果。如果该交易是一个查询交易,因为查询并不会对账本产生状态的影响,所以验证签名通过以后,客户单可能就会拿着返回值作为下一步业务逻辑判断的依据,可能会导致下一个交易的产生,而此时交易的流程就结束了
- 客户端提交交易,如果交易是一个写交易,且背书返回了,客户端就需要收集到足够多的背书结果,然后将交易提案,背书结果,再加上自己的签名合起来成为一个交易,然后将该交易发送给排序节点
- 排序节点对交易排序并做成区块
- 排序节点将区块打包并广播区块给组织中的主节点,这里使用的是gRPC通信
- 主节点保存区块,更新世界状态(世界状态代表了所有账本状态当前的值)。主节点在接收到区块以后,在记账的过程中会去验证该笔交易是否有效,如果无效就会被记录成无效交,不会更新状态数据库
- 主节点在组织内部通过
gossip
传递消息同步区块 - 记账节点保存区块,更新世界状态,与主节点做的类似