Hyperledger Fabric 超级账本
区块链
区块链(BlockChain),区块链可以理解为是一个分布式
可共享的、通过共识机制
可信的、每个参与者都可以检查的公开账本,它只能够按照严格的规则和公开的协议进行修订。
而这些区块链账本则以区块
的形式记录和存储数据,且其中的区块也都将按照时间顺序排列,并通过密码学
证明来相互链接
。区块链技术的出现为许多行业都带来了一定的优势,并为缺乏信任的环境提供了更高的安全性。
区块链点有分布式
、数据不可篡改
、去中心化
等特点:
- 区块链数据通常都被存储在分布式节点网络上的数千个设备中,所以系统和数据对于技术故障和恶意攻击都具有很强的抵抗性。其中每个网络节点都可以复制并存储数据的副本,因此单点故障将不会有影响,单个节点的脱机将不会影响到的网络的可用性和安全性。相比之前,许多传统数据库却只依赖于单个或几个服务器,所以更容易受到技术故障和网络攻击的影响。
- 区块链使用了
密码学
、点对点传输(peer-to-peer)
等技术,保存账本数据等区块被验证之后,新区块会添加到网络中所有节点的链上,已被确认的区块基本上不可能再被逆转,这就意味着一旦数据被注册到区块链中,则很再难进行删除或更改。而这就使得区块链可以成为存储财务记录或任何其他需要审计追踪的数据的一项优秀的技术,因为区块链中的每个更改都会被分布式公众账本所追踪和永久记录。
Hyperledger Fabric联盟链
Hyperledger是Linux基金会下的一个区块链项目,由IBM、Intel等机构于2015年提出。其中Hyperledger Fabric是一个开源的企业级分布式账本技术平台。Fabric是一个高度模块化和可配置的架构,可为银行、金融、保险、医疗保健、人力资源、供应链甚至数字音乐交付等广泛的行业用例提供创新、多功能性和优化。
区块链中按照开放程度和应用范围有三种不同类型分别为公有链
、联盟链
和私有链
:
- 公链以比特币、以太坊等项目为代表,公链的开放程度最高,去中心化程度也最高,任何人都可以匿名参与到公链当中,成为公链的节点、公证人、参与者与使用者。
- 联盟链的开放程度低于公有链,因为它仅限于特定的联盟成员使用,例如特定的企业和机构之间,只有联盟内的成员才可以共享利益和资源。
- 私有链的开放程度最低,它是一个不对外开放、仅供内部人员使用、需要注册、需要身份认证的区块链系统,可以应用于企业的票据管理、财务审计、供应链管理等。就像公司自己的数据库一样,不对外公布。
Fabric架构
整体架构
以上是Fabric核心组件,分成三大部分:成员
、区块链和交易
、链码(智能合约)
,这三大组件为Fabric架构中的逻辑结构。
1. 成员服务
包含下列组件:注册、身份认证管理及审计。
- 成员服务通过公钥基础设施(Public Key Infrastructure - PKI)和去中心化的共识技术使得不带权限的区块链变成带权限的区块链。成员必须被许可才能加入网络,通过实体注册来获得长时间的,可根据实体类型生成的身份凭证(登记证书enrollment certificates)。
- 在用户使用过程中,这样的证书允许交易证书颁发机构(Transaction Certificate Authority - TCA)颁发匿名证书。交易证书被用来对提交交易授权。
2. 区块链服务
包含下列组件:共识管理、分布式账本、点对点网络和分类存储。
- 区块链服务通过HTTP/2上的点对点协议来管理分布式总账。为了提供最高效的哈希算法来维护世界状态的复制,数据结构进行了高度的优化。每个部署中可以插入和配置不同的共识算法(PBFT, Raft, PoW, PoS)。
3. 链码服务
包含下列组件:安全容器 、安全注册中心。
-
Fabric的智能合约(smart contract)称为链码(chaincode),是一段代码,它处理网络成员所同意的业务逻辑。
-
链码可采用Go、Java、Node.js语言编写。链码被编译成一个独立的应用程序,Fabric用Docker容器来运行chaincode,里面的base镜像都是经过签名验证的安全镜像,包括OS层和开发chaincode的语言、runtime和SDK层。一旦chaincode容器被启动,它就会通过gRPC与启动这个chaincode的Peer节点连接。
架构中的节点
Fabric包括以下节点:客户端节点
、CA节点
、Peer节点
、Orderer节点
。
1. 客户端节点
- 客户端或应用程序代表由最终用户操作的实体,它必须连接到某一个Peer节点或者排序服务节点上与区块链网络进行通信。客户端向背书节点(Endorser Peer)提交交易提案(Proposal),当收集到足够背书后,向排序服务节点广播交易,进行排序,生成区块。
2. CA节点
- CA节点是fabric的证书颁发节点(Certificate Authority),由服务器(fabric-ca-server)和客户端(fabric-ca-client)组成。CA节点接收客户端的注册申请,返回注册密码用于登陆,以便获取身份证书。在区块链网络上所有的操作都会验证用户的身份。
3. Peer节点
每个组织可以拥有一到多个Peer节点。每个Peer节点可以担任如下多种角色
- Endorser Peer(背书结点)
所谓背书(Endorsement),就是指特定peer执行交易并向生成交易提案( proposal )的客户端应用程序返回YES/NO响应的过程。背书节点是动态的角色,是与具体链码绑定的。每个链码在实例化的时候都会设置背书策略(Endorsement policy),指定哪些节点对交易背书才有效。 也只有在应用程序向节点发起交易背书请求时才成为背书节点,其他时候是普通的记账节点,只负责验证交易并记账。 - Leader Peer(主节点)
主节点负责和Orderer排序服务节点通信,从排序服务节点处获取最新的区块并在组织内部同步。可以强制设置,也可以选举产生。 - Committer Peer(记账节点)
负责验证从排序服务节点接收的区块里的交易,然后将块提交(写入/追加)到其通道账本的副本。记账节点还将每个块中的每个交易标记为有效或无效。 - Anchor Peer(锚节点)
通道上的每个成员都有一个Anchor Peer(或多个Anchor peer 来防止单点故障),允许属于不同成员的peer发现通道上的所有现有peer。
4. Orderer节点
- 排序服务节点接收包含背书签名的交易,对未打包的交易进行排序生成区块,广播给peer节点。排序服务提供的是原子广播,保证同一个链上的节点为接收到相同的消息,并且有相同的逻辑顺序。排序服务独立于peer进程存在并且以先来先服务的方式对网络上的所有信道进行排序交易。
交易流程
1. 应用程序创建交易提案并提交给背书节点
- 合约设置的背书策略规定所有交易需要经过一定数量节点的签名背书,因此请求需要被同时发往多个Peer。
- 客户端应用程序利用任意SDK(Go、Java、Node.js)构造交易提案。该提案是一个调用智能合约功能函数的请求,用来确认哪些数据可以读取或写入账本(即更新资产的Key/Value)。
- SDK将交易提案打包为可识别的格式(如gRPC上的protocol buffer),并使用用户的加密凭证为该交易提案生成唯一的签名。
2. 背书节点模拟执行交易并完成背书签名
-
peer节点(Committer节点)通过chaincode分别执行交易,但是并不将执行结果提交到本地的账本中(可以认为是模拟执行,交易处于挂起状态,放置于候选池)。
-
背书节点对接收到的交易提案请求进行验证。
-
交易提案格式是否正确;
-
交易在之前并未提交过(重复性攻击保护);
-
提交交易提案的客户端签名是否有效(使用MSP);
-
提交交易提案的请求者是否在该通道中有相应的执行权限。
-
3. 背书节点将背书签名和模拟交易结果返回给应用程序
-
参与背书的peer将执行结果返回给应用程序(其中包括自身对背书结果的签名)
-
背书节点将交易提案的参数作为输入,在当前状态数据库上执行交易,生成包含执行返回值、读操作集合和写操作集合的交易结果(此时不会更新账本),这些值的集合、背书节点的签名和背书结果(YES / NO)作为“提案的结果”返回给SDK。
-
SDK解析这些信息判断是否应用于后续的交易。应用程序(SDK)验证背书节点签名,并比较各节点返回的提案结果,判断提案结果是否一致以及是否参照指定的背书策略执行。
4. 应用程序需收集足够的交易背书,构建交易请求后发送给排序节点
- 应用程序(SDK)将交易提案和结果以消息形式广播到排序服务(Orderers/Consenter)。交易包含读/写操作集合、背书节点的签名和通道ID。
5. 排序节点对交易进行排序并生成区块
6. 排序节点生成区块后会广播给通道上不同组织的主节点
-
排序服务将区块发送到通道上的所有节点,所有交易需要被验证,确保满足背书策略。
-
同时,需要确保全部读操作集合在交易生成之后,账本上的状态值没有改变。