本文将总结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组件,也可使用第三方的权威机构

  • 通道

    一条通道即一条区块链,一个节点可加入多条通道

其他概念

成员管理

  • 会员注册
    • 使用证书认证
  • 身份保护
  • 交易审计
  • 内容保密

    • 一个成员可以拥有多条区块链,通过不同channel实现数据格力

      账本管理

  • 区块链

    • 保存所有的交易状态
  • channel

    • 一个组织可拥有多个channel,channel间互不干扰,一条channel其实就是一条区块链
  • 世界状态

    • 数据的最新状态
    • 数据存储在当前节点的数据库中
    • 自带的默认数据库是 levelDB,也可使用其他数据库,例如couchDB
      • 数据库为键值对数据库

交易管理

  • 部署交易
    • 部署链码,其实就是给节点安装链码(智能合约)-chaincode
  • 调用交易
    • invoke链码

交易流程

简要的交易流程如图所示: transactionflow

1. 客户端发起交易提案,到peer节点

  • 具体来说,交易提案提交到的目的地,即为Endorser节点,对链码进行初始化时选定的背书策略(-P),就是指定目的地。
  • 多个endorser时,如果有endorser网络等原因没有返回,会将交易提交给后面的endorser。

2. peer节点收到提案,进行模拟交易,并将模拟结果返回客户端

  • 不同的 endorser 返回的结果应该是一样的,只是签名不一样
  • 背书节点收到提案,进行验证,验证包括:
    • 交易格式是否正确
    • 发起人是否合法(签名是否正确)
    • 交易是否提交过
  • 提案验证完成,会交给智能合约隔离执行
  • 智能合约执行完成,返回执行结果
  • 背书节点对执行结果进行签名,返回给客户端

3. 客户端收到模拟结果,如果成功,则提交给 orderer 节点

  • 如果客户端发起的是查询交易,在收到模拟结果后即可进行下一步操作,不需提交到orderer
  • 如果客户端发起的是修改类型的交易,需要收集到足够的背书节点结果后,合并起来,提交到orderer

4. orderer节点对交易进行打包

  • orderer 只会验证提交过来的各背书节点的结果是否一致,但不会验证各自的签名和交易内容
  • 对交易的验证,在各peer节点(收到广播的交易内容)进行

5. 打包完成,写入区块,然后将数据发给 组织主节点

  • orderer 排序之后首先广播给各组织主节点
  • 主节点对交易进行验证,记录到区块账本中
  • 无效交易不会丢弃,同样会记录(会占用磁盘空间,后续版本可能会丢弃)
  • 有效交易会更新状态数据库(世界状态)

6. 组织间节点进行数据同步(gossip)