Hyperledger Fabric 2.0(项目仓库为hyperledger/fabric)属于联盟链。在Fabric区块链网络中,联盟成员认可彼此的身份、权限配置、责任划分,成员依据相同的交易逻辑产生数据、依据相同的策略认可交易。

超级账本

超级账本实际上由两个部分组成,一个是 world state,另一个是 Tx Log(交易)。world state 描述的是账本的当前状态,而 Tx Log 则记录了所有事务按照时间顺序的状态变化,它最终被记录在区块链上。

超级账本有一些关键特性,如下:

  1. 资产(assets):这里不单单指货币金钱的范畴,而是泛指一切的价值物,这也是区块链被视为价值传递网络的原因,价值物的价值在区块链网络中从一方流转到另一方,而流转是通过触发区块链上的智能合约导致状态发生改变实现的
  2. 节点:是组成组织的个体在Fabric区块链网络中运行的基础设施实体。由于职责和功能的迥异,Fabric区块链网络将主要的参与节点分为orderer和peer。orderer节点主要负责运行系统通道、共识排序服务,peer节点负责背书、广播、散播等服务。
    • peer专门存储账本的数据,可以担任记账结点、领导结点(连接order结点,转发区块)、背书结点(对交易模拟执行,然后签名)、锚结点(负责跨组织通讯)
    • order结点:对fabric网络的交易进行排序,然后进行签名,并产生区块的结点。(类似于挖矿结点)
  3. 组织(organization)是参与Fabric区块链网络、组成一个联盟的基本单位,也是一个逻辑主体,如现实中的公司、行业协会、多个工厂同类产品的生产线等。
  4. MSP:每个组织、结点、用户都拥有MSP信息,可以理解为会员卡。可以定义用户的角色盒访问权限。MSP信息由CA颁发
  5. 链码(chaincode):智能合约,书写业务逻辑的地方
  6. 通道(channel)是Fabric区块链网络中隔离账本交易数据的逻辑主体。一个通道对应着一个联盟,一个通道也对应着一个账本。通道中的账本数据在联盟成员之间共享,但完全与另一个通道的数据隔离。
  7. 智能合约(smart contract)是使用编程语言实现的一种交易规则,以链码(chaincode)的形式部署在Fabric区块链网络中。智能合约属于通道,供联盟成员调用,产生交易数据。
  8. 账本(ledger)是Fabric区块链网络中数据存储的主体,用于以多种形式记录网络中所有发生的成功或失败的交易。具体地,账本使用blockfile存储区块,使用LevelDB或CouchDB存储来自区块的有效交易数据、区块索引、历史数据、私有交易数据。
  9. 区块(block)是区块链特性在数据存储方面的核心体现,也是Fabric区块链网络中账本数据存储的基本单位。区块的次序号由0开始,依次递增,前后块相互验证关联,形成一条不可篡改的链。一个通道的账本,可以视为一条区块链。
  10. 交易(transaction)是Fabric区块链网络的通道账本中组成区块的基本单位,主要描述了依据交易规则对应用通道中账本数据的读取、更改,以及对交易数据表示认可的背书主体。
  11. 私有数据集合(private data collection)是在Fabric区块链网络参与者之间隔离交易数据方面更细化的应用。通道中,有不公开交易需求的若干参与者组成一个“小团体”,遵循一份私有数据集合定义,执行交易,产生的交易数据只在“小团体”范围内散播存储。
  12. 共识机制(consensus mechanism)保证了Fabric区块链网络的账本数据的可信、防篡改等特性。Fabric区块链网络中的共识机制不单指某一共识算法(如PoW、PoS、Raft、PBFT等),而是基于交易处理流程的分阶段共识,并在分阶段共识的基础上,达成整个网络交易处理的共识。

流程与架构

fabric工作流

Endorser peer是背书结点,链码是在这里被调用的
APP收集够背书结果后,提交给order,order生成区块提交给leader

leader将区块进行分发(跨组织的交给锚结点)

Fabric 网络如何构建的

Fabric 中网络的概念

符号说明

创建网络流程

多通道网络

一个通道只是一个子区块链网络,而 Fabric 支持多个通道,从而形成一个多链网络的结构,一个组织,组织中的节点,组织中的应用程序都可以依据配置文件(CCx)加入到多个通道中,而它们在每个通道中都是相互独立的实例

多通道网络的特点——

  1. 通道完全分隔了不同子区块链的通信机制,即便两个不同的通道可能都有相同的组织参与
  2. 多通道的之间虽然隔离,但是通过智能合约是可以实现不同通道之间的通信的

代码框架

三类模块

  • 核心模块:提供核心功能服务的代码,包括core、orderer两个代码包,这两个代码包涵盖了Orderer排序节点与Peer节点(包含Endorser背书节点与Committer记账节点)的核心代码,我将在后续文章中深入分析各个模块的初始化启动流程、处理交易流程以及与其他模块间的交互过程,并介绍其核心功能的设计与实现细节。

  • 公共模块:为核心模块和其他模块提供基础支持服务,包括bccsp、common、gossip、msp、protoutil等目录代码。其中,Gossip消息模块为Peer节点提供安全、可靠、可扩展的P2P数据分发协议。common公共功能模块包括账本数据存储模块、安全服务模块、通道配置等,为其他模块提供底层存储机制、安全机制、异步通信机制等。

  • 辅助模块:为其他模块提供辅助性工具、运行环境、测试用例、文档等,包括ccaas_builder、ci、docs、release_notes、swagger等,不作为分析重点,视情况分析以帮助理解其他模块。

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 wujinquan@wujinquandeMacBook-Pro  ~/workspace/gospace/src/github.com/hyperledger/fabric  tree -L 1
.
├── CHANGELOG.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Gopkg.lock
├── Gopkg.toml
├── LICENSE
├── MAINTAINERS.md
├── Makefile
├── README.md
├── SECURITY.md
├── bccsp //密码学相关,用于签名、加密等
├── ci //常用脚本文件
├── ci.properties
├── cmd //项目命令行,可从此目录入手了解整个项目,包含节点的启动、功能配置、停止等操作
├── common //公用代码
├── core //项目的核心代码,包含包括权限控制、 chaincode 、committer、 endorser、 ledger、 等功能 代码实现
├── discovery //为客户端程序提供服务发现的功能
├── docker-env.mk
├── docs
├── go.mod
├── gossip //是 Fabric 在节点间达成最终一致性, 实现的信息传播的模块
├── gotools.mk
├── idemix
├── images
├── integration
├── internal
├── msp //全称为 Membership service provider ,为 Fabric 提供成员服务
├── orderer //进行全局的交易排序以及切块
├── pkg
├── protoutil
├── release_notes
├── sampleconfig//配置示例
├── scripts //常见脚本
├── test-pyramid.png
├── testingInfo.rst
├── tox.ini
├── vagrant
└── vendor //Golang 第三方包管理器

21 directories, 18 files


链码

链码编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// InitLedger adds a base set of assets to the ledger
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
assets := []Asset{
{ID: "asset1", Owner: "ZhangSan", Value: 300},
{ID: "asset2", Owner: "LiSi", Value: 400},
{ID: "asset3", Owner: "Klay", Value: 500},
}

for _, asset := range assets {
assetJSON, err := json.Marshal(asset)
if err != nil {
return err
}

err = ctx.GetStub().PutState(asset.ID, assetJSON)
if err != nil {
return fmt.Errorf("failed to put to world state. %v", err)
}
}

return nil
}

[1] https://zhuanlan.zhihu.com/p/669519180
[2] https://zhuanlan.zhihu.com/p/661248922