Fabric1.0交易整体流程如下图:
1,客户端发起交易:
客户端将交易预提案(Transaction Proposal)通过gRPC发送给支持Endorser角色的Peer进行背书。
这些交易提案可能包括链码的安装、实例化、升级、调用、查询;以及 Peer 节点加入和列出通道操作。
Peer 接收到请求后,会调用 core/endorser/endorser.go中Endorser结构体的 ProcessProposal(ctx context.Context, signedProp *pb.SignedProposal)(*pb.ProposalResponse, error)方法,进行具体的背书处理。
背书过程主要完成如下操作:
◎检查提案消息的合法性,以及相关的权限;
◎模拟执行提案:启动链码容器,对世界状态的最新版本进行临时快照,基于它执行链码,将结果记录在读写集中;
◎对提案内容和读写集合进行签名,并返回提案响应消息。
返回的读写集结构如下:
2,Order节点对交易进行排序
排序服务在超级账本Fabric网络中起到十分核心的作用。所有交易在发送给 Committer 进行验证接受之前,需要先经过排序服务进行全局排序。
在目前架构中,排序服务的功能被抽取出来,作为单独的 fabric-orderer 模块来实现,代码主要在 fabric/orderer目录下。
Orderer 节点(Ordering Service Node,OSN)在网络中起到代理作用,多个 Orderer 节点会连接到Kafka集群,利用Kafka的共识功能,完成对网络中交易的排序和打包成区块的工作。
Fabric 网络提供了多通道特性,为了支持这一特性,同时保障每个 Orderer 节点上数据的一致性,排序服务进行了一些特殊设计。
对于每个通道,Orderer将其映射到Kafka集群中的一个topic(topic名称与channelID相同)上。
此外,Orderer 还在本地维护了针对每个通道的账本(区块链)结构,其中每个区块包括了一组排序后的交易消息,并且被分割为独立区块。
◎客户端通过 gRPC 连接发送交易信息到Orderer节点的Broadcast()接口。
◎Orderer节点收到请求后,提取消息进行解析、检查,通过检查后封装为Kafka消息, 通过Produce接口发送到Kakfa集群对应的topic分区中。
◎当前收到消息数达到 BatchSize.MaxMessageCount 或消息尺寸过大,或超时时间达到
BatchTimeout(配置在configtx.yaml),则发送分块消息 TTC-X 到 Kafka。
◎Kafka集群维护多个topic分区。Kakfa通过共识算法来确保写入到分区后的消息的一 致性。即一旦写入分区,任何Orderer节点看到的都是相同的消息队列。
◎Orderer节点在启动后,还默认对本地账本对应的Kafka分区数据进行监听,不断从 Kafka 拉取(Consume)新的交易消息,并对消息进行处理。满足一定策略情况下(收 到 TTX-C 或配置消息)还会将消息打包为区块。
3,Orderer 节点对排序后消息的处理过程
经过排序后的消息,可以认为在网络中已经达成了基本的共识。Orderer 会获取这些消息,进行对应处理(包括打包为区块,更新本地账本结构等)。
以Kafka模式为例,Orderer节点启动后,会调用orderer/consensus/kafka模块中chainImpl 结构体的processMessagesToBlocks() ([]uint64, error)方法,持续获取Kafka对应分区中的消息。
在以下几种情况下会生成新的区块:
◎时间超时(BatchTimeout)
◎区块消息数达到BatchSize.MaxMessageCount
◎传入新的配置消息(例如有新的节点加入)
由于每个配置消息会单独生成区块。因此,如果之前已经收到了一些普通交易消息,会先把这些消息生成区块。
4,Commit Peer节点执行如下操作:
◎运行验证逻辑(VSCC检查背书策略,MVCC检查读操作的版本自仿真交易以来未在数据库中被修改。
VSCC用于检查以下内容:
*所有背书是有效的 (即它们是来自预期消息上的有效证书的有效签名)
*得到一定数量的背书
*背书来自预期的来源(指定背书节点)
◎在区块中指明哪些交易是有效或无效的。
◎在内存或文件系统上把区块加入区块链,并且将区块内的有效交易写入状态数据库。
◎出发Event消息,使得客户端通过SDK监听知道哪些交易是有效的或无效的。
PBFT算法中N>3f+1的由来
一共有N个节点,其中恶意节点数量是f个
在一次通讯中,一共收到了N-f个消息,未收到f个消息,极端情况下,未收到的f个消息全部是正常节点,那么收到的N-f个消息中,就有N-2f个正常节点,f个恶意节点,根据少数服从多数的原则,可以得到:
N-2f>f
即N>3f
即N>=3f+1
Fabric0.6中,pbft的流程
转载请注明来源