本文主要内容如下,爱看不看~
上一篇最后,我们抛出了几个新的概念。
- 提交节点(Commiter)
- 背书节点(Endorser)
- 主节点(Leader)
- 锚节点(Anchor)
要理解这些概念,首先要知道,在组织内和组织间,peer节点相互交换数据是通过goosip协议实现的。
下面就先介绍下Gossip协议。
Gossip协议
goosip协议是P2P网络协议的一种实现。
goosip在Fabric中主要有三个功能:
通过不断识别可用的peer节点,剔除离线的节点,维护Channel成员关系。
对同一个Channel上的所有peer节点传播区块链数据。如果peer节点发现自己的数据与最新的不同步,则向其他peer节点请求数据来同步到最新状态。
通过允许点对点状态传输更新区块链数据,加快新节点达到最新状态。

总结起来就是,发现新的节点,剔除失效节点,同步区块链信息。
主节点(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 排版