Hyperledger Fabric的网络拓扑图与交易流程

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节点可以称之为排序节点,主要有两个功能

  1. 从全网的客户端节点接收交易,然后将交易按照一定的规则进行排序
  2. 将排序好的交易按照固定的时间间隔打包成区块,然后分发给其他组织的主节点

有两种常用类型的排序

  1. solo,整个网络中只有一个排序节点,它收到的交易的顺序就是整个网络中的排好序的**交易顺序。整个模式仅仅适用于开发和测试时用,如果Orderer节点挂掉了,整个网络就是瘫痪的
  2. kafka,将整个网络中的交易排序过程转交给了kafka集群,每一个Orderer节点都是kafka集群的生产者和消费者,生产者将从客户端节点接收到的交易转发给kafka集群,同时消费者中kafka集群里面获取交易,这样或得到的交易就已经是排好序的了
CA节点(可选)

证书颁发机构,鉴定一个区块链的身份是否是合法的,只有被认可的身份才能在区块链中进行交易。

可有选择官方的CA,也可以选择第三方CA,这样就没有CA节点。

2. Fabric的网络拓扑图

整体网络拓扑图如下

在这里插入图片描述

基本上包含了上述的所有节点。客户端有4条线与其他组件进行关联,代表不同的操作

  1. 注册登记,客户端向CA机构表名自己的身份,然后从CA机构获取相应的证书,用于后续的操作,比如交易提案,交易提交等等(图中的CA在区块链外,是一个第三方CA)
  2. 客户端向两个组织的背书节点发起交易提案请求,组织1与组织2是两个独立的组织,分别代表了一堆peer节点,可以认为是两个商业主体。两个组织相互独立并不会相互通信,他们共同的数据来源就是排序节点
  3. 排序节点两个功能都在图上显示出了,第一个是从客户端节点接收交易,然后将交易按照一定的规则进行排序,第二个是将排序好的交易按照固定的时间间隔打包成区块,然后分发给其他组织的主节点。这里用的是kafka排序

根据上述的网络拓扑图,就可以更好地理解Fabric的整体流程了。

3. Fabric交易的整体流程

在这里插入图片描述

  1. 客户端节点构造交易提案,选择背书节点提交。背书节点的选择是与智能合约相关的,智能合约在安装的时候必须指定背书节点。如果一个智能合约要求至少两个背书节点进行背书,那么客户端就必须将交易提案发到至少两个背书节点。如果因为网络问题,其中一个背书节点没有返回结果,那么就必须发给第三个背书节点,否则该笔交易就是无效的
  2. 背书节点模拟执行交易提案并生成签名。背书节点在收到交易提案以后,首先会做一些验证检查方面的工作,比如对交易提案的格式的验证,该交易提案以前是否被提交过,交易发送者的签名是否正确,以及发送者是否有权利去提交这笔交易等等。验证通过以后,背书节点会将交易发送给智能合约进行隔离执行,执行完以后,会返回执行结果,背书节点对结果进行签名(背书),随后返回给应用程序。这个过程是模拟执行的,并不会产生任何持久化操作
  3. 背书节点将结果返回给客户端。客户端收到以后,首先对消息进行验证,如果验证通过才会执行后续的操作。验证操作以后一般会有两种处理结果。如果该交易是一个查询交易,因为查询并不会对账本产生状态的影响,所以验证签名通过以后,客户单可能就会拿着返回值作为下一步业务逻辑判断的依据,可能会导致下一个交易的产生,而此时交易的流程就结束了
  4. 客户端提交交易,如果交易是一个写交易,且背书返回了,客户端就需要收集到足够多的背书结果,然后将交易提案,背书结果,再加上自己的签名合起来成为一个交易,然后将该交易发送给排序节点
  5. 排序节点对交易排序并做成区块
  6. 排序节点将区块打包并广播区块给组织中的主节点,这里使用的是gRPC通信
  7. 主节点保存区块,更新世界状态(世界状态代表了所有账本状态当前的值)。主节点在接收到区块以后,在记账的过程中会去验证该笔交易是否有效,如果无效就会被记录成无效交,不会更新状态数据库
  8. 主节点在组织内部通过gossip传递消息同步区块
  9. 记账节点保存区块,更新世界状态,与主节点做的类似

猜你喜欢

转载自blog.csdn.net/lvyibin890/article/details/106143781
今日推荐