Hyperledger fabric是Linux Foundation主办的超级账本项目下的开源项目之一,旨在提供一个模块化的区块链解决方案的支撑平台。

概述

一、区块链的共有特性
1.分布式存储(Distributed Ledger):所有节点共同维护完全一致的账本数据,区块以保存前一个区块Hash值的方式顺序相连,组成了链式数据结构,保证了数据的不可篡改。

2.共识机制(Consensus Protocol):fabric v1.0以后使用的是交易背书、交易排序和交易验证共同构成的共识机制,不过目前的kafka排序节点集群仅能保证崩溃故障容错(CFT),不能实现拜占庭容错(PBFT)。

3.智能合约(Smart Contract):fabric中通过链码(chaincode)来对账本进行访问和控制,自动执行参与者定义的业务逻辑操作。

4.加密技术(Cryptography):fabric基于PKI体系引入MSP模块进行网络成员的身份管理,成员之间的通信利用非对称加密技术进行身份验证和数据加密。

二、区别于其他区块链平台的优势
1.Hyperledger fabric联盟链的优秀实现,更适合于企业区块链的场景。它具有有完备的权限控制,成员通过身份验证才能加入网络,且兼顾数据共享和隐私保护,更具安全性。

2.采用模块化设计,共识机制和加密算法等都是可插拔的

3.使用容器技术,各节点以及链码都运行在docker容器中,容器之间环境隔离且能进行通信。

基本概念

1.Ledger:账本,节点维护的区块链和状态数据库

2.World state:世界状态,经过数次交易后最新的键值对

3.Channel: 通道,私有的子网络,通道中的节点共同维护账本,实现数据的隔离和保密。 每个channel对应一个账本,由加入该channel的peer维护,一个peer可以加入多个channel,维护多个账本。

5.Org:Orginazation,管理一系列成员的组织。一个channel内可以有多个组织。

6.Chaincode:链码,运行在节点内的程序,提供业务逻辑接口,对账本进行查询或更新

7.Endorse:背书,指一个节点执行了一个交易并对结果进行签名后返回响应的过程。

8.Ordering Service:排序服务,将交易排序后放入区块中,并广播给网络各节点

9.PKI:Public Key Infrastructure,一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范

10.MSP:Membership Service Provider,成员管理服务,基于PKI实现,为网络成员生成证书,并管理身份

节点架构

fabric的节点具有不同身份并提供不同职能,下面是网络节点的示意图。

节点架构

一、Peer节点
1.记账节点:所有的Peer节点都是记账 (committer) 节点,负责验证从排序服务接收到区块中的交易,维护账本的副本

2.背书节点:部分Peer节点会执行交易并对结果签名背书,充当背书 (Endorsement) 节点。背书节点是动态的角色,只有在应用
程序向它发起背书请求的时候才是背书节点,其他时候只是普通的记账节点,只负责验证交易并记账

3.主节点(Leader Peer):代表的是与排序节点通信的节点,负责从排序服务节点处获取最新的区块并在组织内部同步

二、Orderer节点
1.排序服务节点接收包含背书签名的交易,并进行排序、打包生成区块,广播给Peer节点,保证同一个链上的节点接收到相同的消息,并且有相同的逻辑顺序

2.排序服务可以支持多链的交易处理,实现了多通道的数据隔离,保证只有同一个链的peer才能访问链上的数据

3.排序服务可选择集中式(Solo)或分布式(Kafka)协议,其中Kafka集群可以实现崩溃故障容错(CFT)

三、CA节点
1.CA节点是Fabric的证书颁发机构(Certificate Authority)。

2.CA节点接收客户端的注册申请,返回注册密码用于用户登陆,以便获取身份证书。

3.在区块链网络上所有的操作都会验证用户的身份。

四、Client节点
1.客户端节点代表最终用户操作的实体,它必须连接到某一个Peer节点或者排序服务节点上与区块链网络进行通信

2.客户端节点向背书节点提交交易提案,收集到足够背书后,向排序服务广播交易,进行排序,生成区块

数据存储

Fabric区块链系统的数据存储主要由一项文件存储(区块数据)和三项数据库组成,结构如下图。
数据存储

一、区块数据
1.区块(block)数据时以二进制文件的形式存储的,每个账本数据存储在节点文件系统的不同目录下

2.区块数据存储是通过区块文件管理器(blockfileMgr)实现的,它来决定区块存储于哪个目录下的哪个文件

3.区块文件管理器创建的文件名以“blockifle_”为前缀,6位数字位后缀,比如blockfile_000000,默认的区块文件大小为64MB,如果当前文件大小超过该值,则区块写入下一个文件中。

二、区块索引
1.Fabric提供多种索引方式,以方便能快速找到所需要区块数据。每次提交区块后都会更新索引数据库。索引方式(键)有:

  • 区块编号 (Block Number)
  • 区块哈希 (Block Hash)
  • 交易编号 (Tx ID)

2.索引的内容(值)是文件位置指针(File Location Pointer),结构如下:

  • fileSuffixNum:所在文件的编号
  • offset:文件内的偏移量
  • bytesLength:内容占用的字节数

三、状态数据库
1.状态数据(State Database)记录的是交易执行的结果,最新的状态代表了通道上所有键的最新值,所以又称为“世界状态”。

2.交易或查询操作调用链码会根据当前状态数据库来完成。

3.状态数据库支持查询单个键的数据,多个键的数据以及一个范围内的数据,如果使用的是CouchDB,还可以支持复杂的条件查询。

四、历史数据
历史数据(History Database):记录的是每个状态数据的历史信息,每个历史信息以一个四元祖表示:

  • namespace: 代表不同的chaincodeID
  • writeKey:要写入数据的键
  • blockNo:要写入数据所在的区块编号
  • tranNo:要写入数据所在区块内的交易编号

交易流程

以下是fabric的经典交易流程,所有涉及到对账本数据更新的操作都是基于这个交易流程来完成的。

交易流程

1.发送交易提案
客户端发送交易提案(Proposal)到背书节点,提案中包含交易所需参数。

2.模拟执行交易提案
背书节点会调用链码模拟执行交易提案(Proposal),这些执行不会更新账本

每个执行都会产生对状态数据读出和写入的数据集合,叫做读写集(RWsets),读写集是交易中记录的主要内容

3.返回提案响应
背书节点会对读写集进行背书(Endorse)签名,生成提案响应(Proposal response)并返回给应用程序

4.交易排序
应用程序根据接收到的提案响应生成交易,并发送给排序服务节点。排序服务打包一组交易到一个区块后,分发给各记账节点。

5.交易验证并提交
每个节点会对区块中的所有交易进行验证,包括验证背书策略以及版本冲突验证(防止双花),验证不通过的交易会被标记会无效(Invalid)

账本更新:节点将读写集更新到状态数据库 ,将区块提交到区块链上

6.通知交易结果给客户端
各记账节点通知应用程序交易的成功与否,交易完成。

标签: fabric

已有 6 条评论

  1. 大赢家xue 大赢家xue

    大佬,想问问关于Fabric的数据存储格式有详细的文档么?

    1. zyj zyj

      文档可能没有,对于 区块或状态数据库的结构 ,可以直接在fabric源码中打印出来,或者在app层调用查询接口获得。
      我之前在 balance-transfer应用中查询过相关结构,可以参考https://blog.csdn.net/zhayujie5200/article/details/80456301

      1. 大赢家xue 大赢家xue

        好的,多谢。

        1. 俊语 俊语

          这个是你要的吗?https://haojunsheng.github.io/2020/01/fabric-data-strcture/

添加新评论