HyperledgerFabric是区块链中联盟链架构详细介绍
区块链开源实现HYPERLEDGER FABRIC架构详解
区块链开源实现HYPERLEDGER FABRIC架构详解
hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM、Intel、各⼤银⾏等贡献,⽬前v1.1版的kafka共识⽅式可达到
1000/s次的吞吐量。本⽂中我们依次讨论:区块链的共通特性、fabric核⼼概念、fabric的交易执⾏流程。。
1、区块链解决⽅案的特性
1.1 分布式帐本
区块链核⼼概念是分布式帐本,就像下⾯的图1所⽰,同样的帐本(全量的交易数据,详见下节)在任意⼀台节点(不包括客户端)上都有。所以,其优点是数据很难造假,造假后也可以通过追溯记录来追究法律责任。⽽缺点就是极⼤的浪费,传统服务每份数据都尽量少存⼏份,即使存了三份拷贝都已经考虑到诸多异常,并使服务可⽤性达到N个9了。⽽区块链这种特性,同时造成的另⼀个问题是帐本不能太⼤,⾄少不能超过区块链⽹络中最⼩结点的存储以及处理能⼒。所以,这制约了总交易数据(下⽂为⽅便概念介绍,统称为帐本ledger)的条数,进⽽也影响了能写⼊区块链的单条交易数据的⼤⼩。
图1 区块链分布式帐本⽰意图
什么是区块链呢?我很喜欢《区块链技术进阶与实战》⼀书中对它的定义:区块链是⼀种按照时间顺序将数据区块以顺序相连的⽅式组合成
的⼀种链式数据结构。如果觉得有点抽象,那么我们再来看看下⾯的图2。
图2-区块链数据结构⽰意
图2中就是账本,它由多个区块构成了⼀个有时序的链表,⽽每个区块⾥含有多条交易trasaction(缩写为tx)构成的链表。图2下⽅有⼀个WorldState世界状态,这其实是为了提升性能⽤的。⽐如,key1共交易了10000次,为了获取它的当前状态值,需要正向执⾏这10000次交易,这就得不偿失了。如果这1万次交易⾥,每次新交易执⾏完,都同步更新⼀个数据库(在fabric⾥⽤的是levelDB),这样查询当前状态时,只需要查询该数据库即可,如图3所⽰。
图3-fabric levelDB状态数据库
图3中,区块链帐本是在FileSystem⽂件系统中保存的,⽽Level DB存放世界状态。
1.2 智能合约smart contract
区块链的发展过程中,⼀般1.0时代就是数字货币时代,代表是⽐特币,⽽2.0时代就是智能合约(现在是3.0时代,各种联盟链即为代表)。
智能合约是运⾏在区块链上的模块化、可重⽤的⾃动执⾏脚本,有了它我们就可以完成复杂的业务逻辑,例如同⼀个区块链上有多份合约,⽽每份合约可以约定不同的参与者(企业或者相关⽅)。也可以指定每份合约⾥每个⼦命令做⼀批特定的事,⼤家可以把它想象成关系数据库⾥的事务。如图4所⽰,我们可以在合约⾥指定允许哪些企业的节点可以参与到交易流程中来(在fabric⾥这叫共识策略)。
图4-智能合约图⽰
在fabric中,智能合约叫做chaincode,它有6个状态,如下所⽰:
Install → Instantiate → invocable → Upgrade → Deinstantiate → Uninstall.
实际上智能合约就是⼀段代码,fabric官⽅认可的是GO语⾔。⾸先我们需要把合约代码上传到区块链
上,这⼀步的状态就叫Install。
接着,需要做初始化操作。⽐如,现在的数据是存放在mysql中的,那么上线时需要⽤Instantiate把数据迁移⾄链上,这也算初始化。初始化后,chaincode就进⼊invocable可调⽤状态了。
通⽤我们可以通过CLI命令⾏或者程序⾥⽤SDK调⽤合约(v1.1前还有RestApi调⽤,现已放弃)。
联盟链由于跨多家企业、多个地区甚⾄国家,很难使得合约保持⼀致的版本,因此,每个合约都有版本号。⽽版本升级时,就是Upgrade状态。
最后两个状态对应着合约下链。
智能合约可以在供应链等较复杂的业务场景下起到很⼤的作⽤,如下⾯的图5所⽰:
图5-智能合约技术的应⽤⽰意
1.3 数据⼀致性(共识算法)
既然区块链是⼀个去中⼼化的分布式系统,那么⾃然只能通过投票来决定⼀致性了:少数服从多数。
当然,多少算多数呢?不同的共识算法下,结果并不相同。⽐如paxos算法(参见笔者的《》)就是超过⼀半,⽽PBFT则需要三分之⼆以上。
这⾥有⼀个拜占庭将军问题需要注意,如何理解该问题可以参见这份翻译过的⽂档。简⾔之,就是投票的拜占庭将军(服务器)们有2种不可靠的形式。第⼀是迟钝(数据包延迟)、失忆(数据包丢失以及数据包重发)、失踪(服务器宕机)等不含背叛的⾏为,第⼆则是有将军是间谍(服务器被攻破)。如paxos这样的算法属于第⼀种,Fault-tolerance,它不能容忍服务器上有恶意代码;⽽如PBFT(Practical Byzantine Fault Tolerance)这样的算法是第⼆类,Byzantine-Fault-tolerance,它能够容忍⼀定数量的拜占庭将军节点存在,如PBFT、SBFT、RBFT算法等。
第⼆类Byzantine-Fault-tolerance共识算法虽然看上去很美,但并不成熟,特别是性能低下,⽐如PBFT是⼀个多项式复杂度的算法
O(N^2),节点过多时(⼤于100)性能急骤下降。第⼀类通常是O(N)复杂度,在某些场景下使⽤效果还不错,⽐如fabric v1.1的kafka共识机制就是这样的算法,下⽂我们会详述。
像⽐特币、以太坊等采⽤的共识算法⼜有所不同,例如⽐特币的POW⼯作量证明算法,它定义⼀⼩时内(通过调整运算难度实现,⽐如调整近似程度)有⼀个lucky node节点,该节点是通过证明⾃⾝的努⼒(hash值逆解)⽽幸运选出,选出后它就可以为这段时间的交易做决定(似乎挺像总统选举^_^)
。详情参见我这篇⽂章:
1.4 ⾮对称加密
区块链通过⾮对称加密技术实现⾝份验证与数据加密。其实就是我们⽇常在⽤的SSL技术。
为了⽅便理解,我们需要先介绍PKI(Public Key Infrastructure),它是⼀种遵循标准的利⽤公钥加密技术为电⼦商务的开展提供⼀套安全基础平台的技术和规范。有⼀个CA(Certificate Authority)权威机构负责向⽤户(包括服务提供者与使⽤者)提供数字证书,包括公钥
与私钥,同时CA机构还需要提供⼀个CRL(Certificate Revocation List)证书吊销列表,如下⾯的图6所⽰。