Hyperledger Fabric的Transaction处理

2018-09-04  本文已影响0人  Athletics_yan

Hyperledger Fabric的Transaction处理流程

在介绍Transaction处理流程之前,我们先来了解区块链网络的最重要的组成部分->peer节点。通过分析peer节点与其他组件之间的关系来逐步了解Fabric中transaction的处理流程。

我们通过一下几个方面来进行了解:

Fabric的网络结构

区块链网络由账本(ledger)、智能合约(smart contracts)、背书节点(orderers)、通道(channels)、应用(applications)、组织(organizations)、成员关系服务提供商(MSP)等部分组成。


trans.png

Peer节点和账本和链码的关系

peer节点是区块链网络的基础组成部分,peer存储了区块链账本数据,智能合约也是在peer节点上运行的。下图展示了peer节点、账本和链码这三者之间的关系。

peers.png

当peer节点刚创建时,是不包含账本和链码的。当它加入到区块链网络中,安装完链码之后,才会同步账本数据。

多账本(Multiple Ledgers)

一个peer节点可以维护多套账本,如下图:

muledgers.png

多链码(Multiple Chaincodes)

一个peer节点同时也可以维护多套链码,如下图:


muchaincodes.png

结论:一个链码可以适用于多个账本,而一个账本也可以同时由多个链码来维护。

applications和peers的关系

在上面网络结构中,描述了交易执行的流程,客户端发起交易提案,经过背书后,生成交易发送给排序节点排序,并生成区块,最后提交给提交节点进行校验并提交。


appp.png

注意事项:

其中链码的执行是由application通过sdk调用,通过peer节点执行的。
交易通过排序节点提交到peer节点后,如果通过校验会直接将读写集的写集作为结果更新世界状态,并不会再重新执行一次链码处理流程。</br>
校验失败的交易会被标记成无效,区块依旧会追加到区块链中,但是不会更新世界状态。
查询交易不会执行上述图片中的4、5步。在提案结果返回后结束。

peers和channels的关系

上面已经描述了application、peer、账本、链码之间的关系。但是它们之间的交互并不是没有限制的。链与链之间通过通道来隔离。只有加入到同一个通道的组件之间才能进行交互。如下图:


channel.png

channel并不是一个实体,它只是一个逻辑概念。

peers和organizations的关系

peer节点是区块链网络的最基础的组成部分。但是区块链网络并不是按peer为单位进行管理的,而是按组织。如下图:


org.png

注意事项:一个组织中的peer节点可以加入到不同的通道中。一个peer节点属于一个组织。应用程序可以链接到所加入的组织中的其中一个节点。

peers和identity的关系

关于加入到链中的peer的身份管理,如下图:

identity.png

当一个peer加入到一个通道,它所属的组织会通过MSP给这个peer分配一个数字证书。在上面这个图例中,P1、P2通过CA1分配证书,P3、P4通过CA2分配证书。通道C通过配置的通道配置策略CP来确认peer节点和组织的关系。

一个peer只能属于一个组织,所以一个peer也只是对应一个MSP,一个MSP可以给多个peer分配证书。

peers和orderers的关系

排序节点负责对交易进行排序,并负责生成区块。一个交易执行的主要过程大致分成三部分,第一部分:发起提案,由背书节点对提案进行背书签名。第二部分:发起交易,由排序节点进行排序,并声称区块。第三部分:分发到所有peer节点进行校验,然后更新账本。排序节点处于交易的核心位置。

接下来我们分别看这三部分的处理流程:

提案处理
proposal.png

问题:一笔交易应该由哪些背书节点进行背书?

答:这个是由背书策略决定的,背书策略定义了需要经过一组组织确认,交易才会被认可。背书策略可以手工指定。

问题:背书的过程是怎么样的?

答:背书节点模拟执行链码生成结果之后,背书节点通过自身的私钥对返回结果进行加密。这也是背书策略验证是否收集到足够背书的一个证明。

打包生成区块

背书节点接收很多application的交易,并对这写交易进行排序,根据配置文件配置的区块生成配置来生成区块。


packing.png

在配置文件fabric/examples/e2e_cli/configtx.yaml中有两个配置,定义了区块的生成策略。

BatchTimeout:从区块的第一笔交易开始,创建一个计时器,当超过这个超时时间,还没有足够的交易,那么会将所有未打包的交易进行打包生成区块。
BatchSize:这个配置又主要包含三个部分。如下:

MaxMessageCount:区块包含的最大交易数量。
AbsoluteMaxBytes:区块最大的大小。(不包括交易头部)
PreferredMaxBytes:每个区块建议的大小。Kafka对于相对小的消息提供更高的吞吐量;区块大小最好不要超过1MB。

打包生成的区块是一定会被加入到区块链中的,如果是无效交易,会被标示成无效,但是交易依旧是存在于区块中。区块中的交易是不能修改的。

校验区块并更新账本
validation.png
上一篇下一篇

猜你喜欢

热点阅读