前言
Fabric看了一些基础概念,感觉想深入学习,还是需要学习源码的。我用的资料是「Hyperledger Fabric源代码分析与深入解读」。这本书是基于Fabric v1.0版本的,和最新的Fabric v1.3版本是有变化的,我同时下载了两个版本的源代码,对比来学习。
Fabric的地址是https://github.com/hyperledger/fabric
我们把代码下载到本地后,可以使用git branch查看有哪些分支,然后使用git checkout命令切换到所需的分支。
我们先来简单看下Hyperledger Fabric项目的目录结构,方便我们对整个项目有一个比较宏观的认识 :
项目结构
注意,此项目结构是v1.0版本的,后期的版本有所不同。
- bccsp : bccsp 全称是blockchain cryptographic service provider,提供了加密标准以及算法的实现,为整个项目提供统一的加密、签名、验签服务 。
- common : common 模块提供了通用功能以及一些通用的代码实现,包括日志、错误、工具包等,主要包括项目全局的功能性代码 。
- core:core模块为Fabric项目的核心代码模块,其中包括权限控制、chaincode模块,committer、endorser、ledger、policy等核心功能的代码实现。
- devenv :主要是历史遗留原因早期docker不支持Windows系列操作系统,使用vagrant 运行 Ubuntu,再启动Docker,以此来构建开发环境,但是目前各大操作系统已支持Docker,因此不建议采用该方案。
- docs:该模块基于Python的sphinx进行在线文档的构件 。
- events:该模块为客户端提供事件订阅的功能。
- examples :该模块为整个项目提供相关的操作案例 。
- gossip :该模块意为流言萤语,是为Fabric在节点间达成最终一致性,实现的信息传播的模块。
- msp: msp 模块全称为 Membership service provider,为 Fabric 统一提供成员服务。
- orderer :进行全局的交易排序以及切块,并推送给 peer 。
- peer :包含 peer 节点的人口代码,以及命令行操作相关功能 。
- proposals :存放相关提案 。
- protos :存放 Protocol buffer 消息 。
- release_notes : 各个版本的 changelog 。
- sampleconfig :相关样例配置文件 。
- scripts :用于存放相关脚本文件 。
- test :包含整个项目 的一些测试方案。
- unit-test :包含 testenv 镜像,可以利用该镜像做单元测试 。
- vendor: Golang 的第三方包管理器 。
- Makefile:用于编译 Fabric。
Fabric交易流程
1)客户端发起交易
SDK 有两个作用:一个作用是将提案封装成符合grpc协议的 protobuffer 格式的消息,另 一个作用是对创建的交易提案进行签名 。
2) 背书节点验证签名并执行交易
背书节点使用 MSP 模块验证签名并确定请求者是否被合理授权进行提案的操作(使用每个 channel 对应的 ACL 进行验证) 。 背书节点以交易提案凭证为输入,基于当前状态的数据库执行来生成交易结果,输出包括反馈值、读取集合和写入集合 。 截至现在账本还未进行更新 。 这些值的集合、背书节点的签名以及是/否的背书声明一同作为“提案反馈”被传输回到 SDK, SDK 为应用解析 payload 以供进行业务逻辑的处理 。
3) 审查提案反馈
应用对背书节点签名进行验证,比较提案反馈(链接到包含载荷代理的术语条款)来决定是否一致,以及指定的背书策略是否被执行(即节点 A 和 B 都进行了背书) 。 这种架构可以保证即使一个应用选择不进行反馈审查或者转发了没有背书的交易,背书策略依然会被节点执行并在验证提交阶段维持 。
4) 客户组合交易背书
应用对交易提案进行广播,以“交易信息”对订购服务实现反馈 。 交易包含读/写集合、背书节点签名和通道 ID 。 订购服务不读取交易细节,只是从网络中所有的通道接收交易,根据每个通道按时间顺序调用,创建每个通道的交易区块 。
5) 交易验证和提交
交易区块被发布到通道中的所有节点 。 验证区块中的交易来确保背书策略被执行并且账本的读取集合变量没有发生变化 ,因为读取集合是执行交易生成的 。 区块中的交易被标记为有效或无效 。
6) 账本更新
每个节点都把区块追加到通道的链中,对每项有效交易,写入集合被提交到当前状态的数据库。发出事务通知客户端应用,交易(调用)被永久追加到链中以及交易是有效或者无效的 。
结语
通过本篇文章我们了解了Fabric的项目结构,对整体有个更好的把握了,在接下来的文章中,将继续学习Fabric源码。
如果您认为我的文章对您有帮助,欢迎关注我的头条号「BlockChainDeveloper」。
如果您想要和我联系,后台回复「骚扰」即可获取我的联系方式。
您的支持是对我的最大的鼓励。