fabric 主要模块和概念介绍和详细交易流程
本文将总结Hyperledger fabric 的主要模块、概念,以及详细的交易流程。以下总结基于 Hyperledger fabric 1.2版本。
fabric 中的主要模块
fabric 分为五大模块
模块名称 | 功能 |
---|---|
peer | 主节点模块,负责存储区块链数据,运行维护链码 |
orderer | 交易打包,排序 |
cryptogen | 组织和证书生成 |
configtxgen | 区块和交易生成 |
configtxlator | 区块和交易解析(block -> json) |
其中 peer和 orderer是系统模块,参与系统的运行,是核心模块。crytogen、configtxgen、configtxlator属于工具模块。工具模块负责证书文件、区块链创世区块、通道创世快的生成,即在项目一开始时使用,不参与系统的运行。
peer 和 orderer 作为核心模块,会在启动后以守护进程的方式在一直运行
fabric 中的各名词概念解释
- 组织
节点
- client 客户端
作用:进行交易管理。 与其他节点交互,本质是调用链码接口 - cli 命令行客户端 - node.js api编写的客户端 - java api 编写的客户端 - peer
作用:存储和同步账本数据。根据扮演的角色可分为 Anchor,Endorser, committer - Anchor,锚节点,一个组织只有一个anchor,负责与Orderer节点通信,其他非Anchor通过anchor同步orderer数据 - Endorser,背书节点,并不固定,如果该peer参与了链码的背书策略,则该peer成为这个链码的endorser - committer, 所有的 peer 都属于committer,记账节点,负责从orderer接收到的区块,验证其区块的有效性,交易的有效性,记录到本地的账本中,如果交易有效,同时修改区块链中的状态数据 - orderer
作用:排序和分发交易。目前有两种 orderer 类型,solo,和 kafka - 从 peer 接收交易进行排序,没发起的交易先经过orderer节点进行排序 - 排序好的节点,打包好分发给组织的 Anchor - CA(可选) 可用 fabric 提供的CA组件,也可使用第三方的权威机构
- client 客户端
通道
一条通道即一条区块链,一个节点可加入多条通道
其他概念
成员管理
- 会员注册
- 使用证书认证
- 身份保护
- 交易审计
内容保密
一个成员可以拥有多条区块链,通过不同channel实现数据格力
账本管理
区块链
- 保存所有的交易状态
channel
- 一个组织可拥有多个channel,channel间互不干扰,一条channel其实就是一条区块链
世界状态
- 数据的最新状态
- 数据存储在当前节点的数据库中
- 自带的默认数据库是 levelDB,也可使用其他数据库,例如couchDB
- 数据库为键值对数据库
交易管理
- 部署交易
- 部署链码,其实就是给节点安装链码(智能合约)-chaincode
- 调用交易
- invoke链码
交易流程
简要的交易流程如图所示:
1. 客户端发起交易提案,到peer节点
- 具体来说,交易提案提交到的目的地,即为Endorser节点,对链码进行初始化时选定的背书策略(-P),就是指定目的地。
- 多个endorser时,如果有endorser网络等原因没有返回,会将交易提交给后面的endorser。
2. peer节点收到提案,进行模拟交易,并将模拟结果返回客户端
- 不同的 endorser 返回的结果应该是一样的,只是签名不一样
- 背书节点收到提案,进行验证,验证包括:
- 交易格式是否正确
- 发起人是否合法(签名是否正确)
- 交易是否提交过
- 提案验证完成,会交给智能合约隔离执行
- 智能合约执行完成,返回执行结果
- 背书节点对执行结果进行签名,返回给客户端
3. 客户端收到模拟结果,如果成功,则提交给 orderer 节点
- 如果客户端发起的是查询交易,在收到模拟结果后即可进行下一步操作,不需提交到orderer
- 如果客户端发起的是修改类型的交易,需要收集到足够的背书节点结果后,合并起来,提交到orderer
4. orderer节点对交易进行打包
- orderer 只会验证提交过来的各背书节点的结果是否一致,但不会验证各自的签名和交易内容
- 对交易的验证,在各peer节点(收到广播的交易内容)进行
5. 打包完成,写入区块,然后将数据发给 组织主节点
- orderer 排序之后首先广播给各组织主节点
- 主节点对交易进行验证,记录到区块账本中
- 无效交易不会丢弃,同样会记录(会占用磁盘空间,后续版本可能会丢弃)
- 有效交易会更新状态数据库(世界状态)