Hyperledger Fabric原理详解与实战9

1,886 阅读5分钟

本文主要内容如下,爱看不看~

上一篇最后,我们抛出了几个新的概念。

  • 提交节点(Commiter)
  • 背书节点(Endorser)
  • 主节点(Leader)
  • 锚节点(Anchor)

要理解这些概念,首先要知道,在组织内和组织间,peer节点相互交换数据是通过goosip协议实现的。

下面就先介绍下Gossip协议。

Gossip协议

goosip协议是P2P网络协议的一种实现。

goosip在Fabric中主要有三个功能:

  1. 通过不断识别可用的peer节点,剔除离线的节点,维护Channel成员关系。

  2. 对同一个Channel上的所有peer节点传播区块链数据。如果peer节点发现自己的数据与最新的不同步,则向其他peer节点请求数据来同步到最新状态。

  3. 通过允许点对点状态传输更新区块链数据,加快新节点达到最新状态。

总结起来就是,发现新的节点,剔除失效节点,同步区块链信息。

主节点(Leader peer)

前面说过了,新块是由orderer生成的,而块的传播是通过goosip协议传播的,但peer与orderer之间并不是通过goosip通讯的,而是采用的gRPC协议。

那新块是如何到达peer集群的呢?

组织内的peer集群节中设置了一个主节点,可以由管理员指定,也可以动态选举。

主节点会与orderer保持连接。当orderer产生新块时,会推送给各个组织的主节点。然后由主节点通过goosip协议传播这个新块。

在动态选举的情况下,任何一个peer节点都可能成为主节点。

如果一个集群由于网络异常导致分裂成两个,这时会出现两个主节点,所以,并不会影响新块的传播。网络恢复后,根据选举规则,会有一个主节点退出。

锚节点(Anchor peer)

默认情况下,peer之间只会检测到组织内部的节点。那组织之间的peer能不能通过goosip通讯呢?

当然可以。需要设置一个锚节点。

比如,组织A设置peer2为锚节点,地址为 peer2.A.org:7051 。这个设置会被更新到Channel的配置中。

其他组织得知A组织的锚节点地址后,会主动与peer2.A.org:7051建立连接,然后交换各自组织中的peer节点信息和它们所知道的peer节点信息。

如上图,组织A的peer2会收到组织B中的peer节点信息,然后,它也会将它获得的组织B中的节点信息告诉组织C的peer3,这样组织C也得知了组织B中的peer节点信息。

经过几轮数据交互后,所有的peer节点组成一个大的peer集群,它们之间都可以相互直接通讯。

注意,以上所说的情况,都是对相同的Channel来说的。

提交节点(Commiter peer)

所谓提交节点,就是将新块加入区块链的节点。所有的peer都有这个功能,所以,所有的peer节点都是提交节点。

背书节点(Endorser peer)

链码是被部署在peer节点上的。当然,不是每个节点上都部署了链码。可以选择性的将链码安装在指定的节点上。

只有安装了链码的节点才能执行交易请求。这种节点就被称为背书节点。

节点四种类型介绍完了,不难理解吧?

Note

要说明的是,对某一个peer节点来说,可能同时成为四种类型中的某一种或某几种。 也就是说,一个peer节点既可以同时是主节点、锚节点、背书节点和提交节点。
它们是互不冲突的!

世界状态

- 咋又冒出个新概念呢?有完没完?

- 没完!☺

什么是世界状态

假设,你在区块链上有100块钱,第一笔交易花了10块,第二笔交易花了20块,第三笔交易收到5块。问现在还剩多少?

你脱口而出,75块。

再问,如果你的账户经历了1万笔交易,问现在你的余额还剩多少?

额~,让我算算,不,让计算机给我算算!

比特币是没有余额这个概念的,想知道自己账户的余额,需要将所有的交易都遍历一次。

虽说计算机速度很快,但随着链的增长,消耗的资源也会越来越多。

“世界状态”这个词说得很大气,其实就是数字资产的当前状态。用上面的例子说,就是余额。

很明显,引入世界状态是为了加快交易速度。

上面我又说了一个新词:“数字资产”。别被这个词唬住了!

在程序员的眼里,Fabric其实就是个分布式的KV数据库而已,类似redis。

所谓数字资产,在程序员的眼里就是存储在这个数据库中的key的统称。比如:{"user":"laowang", "balance":75},user和balance就是一种数据资产。

更简单点说,就是保存在区块链中的业务数据

状态数据库

区块链里存的是一笔笔的具体交易,而世界状态需要单独保存当前结果。

用KV数据库是再合适不过了。

默认情况下,Fabric采用的是goleveldb,一种嵌入式KV数据库。但提供的功能有限,应付不了太复杂的查询。

所以,Fabric也支持CouchDB。不过它有独立的进程,需要单独部署,而且是每一个peer都需要部署一个独立的CouchDB。

理论知识基本上讲得差不多了,下一篇,我们再回头来看看整个交易过程。

我是2流程序员,我们下次再贱!

本文使用 mdnice 排版