一 hyperledger fabric 结构分析是什么?hyperledger fabric的架构设计指的什么?

先前分析程序着眼于细节分析,这样没有框架的概念,花了两天时间分析整理了一下hyperledger fabric的架构设计,分析该程序没有参照任何资料,如有错误欢迎指正,共同进步 。
笔者在详细分析程序前有以下疑问:
1)CLI(命令行)客户端如何发送命令给Peer节点
2)本Peer节点如何接收其他节点的数据,接收到数据又如何处理,处理的方式和1又有什么区别
3)数据是何时又是如何被送入consensus模块
4)consensus模块内部又是如何架构的 为什么看起来helper executor pbft controller文件夹交至在一起,保存各自句柄,相互调用
5)ChainCode(链码,简称CC)是如何接收到Peer对其的操作、访问的
6)ChainCode是如何调用fabric API来查询写入数据的
7)在阅读源码初始化过程中,Peer节点会创建大量Server,这些Server后续过程我们是如何使用的
注:本人对于数据库、Docker相关知识不是很了解,尽量避免关于这两个部分的介绍以免错误的引导读者 。
下面会慢慢的渗透以上涉及的问题 。
Server :

一 hyperledger fabric 结构分析是什么?hyperledger fabric的架构设计指的什么?


每个Server作用:
AdminServer:控制该节点的命运,可以删除该节点所在的进程 。(Start Stop GetStatus )
EventHubServer:Peer节点支持客户端对指定事件进行监听,例如Rejection等 。客户端需要先注册自己关心的Events,当事件发生时trigger 监听者 。
OpenChainServer:对外提供ledger的访问接口,涉及GetBlockchainInfo GetBlockByNumber等 。
DevopsServer:负责与CLI Client对接,外部进行CC操作的入口,Deploy invoke query 。
ChaincodeSupportServer:负责与shim/Chaincode通信,ChainCode的所有调用接收发送都要与该Server信息交互 。
PeerServer:该Server是一个Engine,Engine关联了内部消息响应实现,同时为周围Peer节点创建Client与之通信 。
RESTServer:该Server没有进行分析,应该是REST接口格式相关 。
一级模块分类:
一 hyperledger fabric 结构分析是什么?hyperledger fabric的架构设计指的什么?


Client: 之前创建服务器与之对应的客户端,可以理解成其他节点或者CLI client等 。
Protos: 中间层,Server与Client端 API接口定义
ServerProcess:服务响应处理函数,包括各类型的HandleMessage 。
Consensus: 共识模块,目前采用的是PBFT NOOPS
ChainCode Shim:代码中shim和我理解的不一致,将ChainCodeSupport也应该算到shim,该模块的作用是连接Peer节点与ChainCode的媒介,用shim形容也可 。
ChainCode: 链码,应用(例如智能合约) 。
DB: 数据存储 。
Library: 代码里有一个叫做Vendor的文件夹,该文件夹里涉及的功能模块自成一体,例如grpcServer等
API: ChainCode里面会调用Peer节点信息 。
Crypto: 伴随着数据加解密 。
Ledger: 账本操作 。
该代码使用Handler触发模式,在跟踪代码程序时要注意handler对象赋值位置,否则容易找错HandleMessage,这些Handler处理函数命名基本相同,容易操作混乱 。
下面分析几个读者应该最关心的流程:
1)Client通过CLI执行一条invoke命令
2)某节点发送给该节点ViewChange命令
3)ChainCode调用API putStatus
4)Consensus流程
一、 Client通过CLI执行一条invoke命令
1)在Peer节点初始化的时候 创建DevopsServer
serverDevops := core.NewDevopsServer(peerServer)
pb.RegisterDevopsServer(grpcServer, serverDevops)
2)DevopsServer设置Service规范,例如Invoke Message,调用_Devops_Invoke_Handler函数
var _Devops_serviceDesc = grpc.ServiceDesc{
ServiceName: protos.Devops,

推荐阅读