1. 简介
Hyperledger Fabric 是一个开源的企业级许可分布式账本技术(Distributed Ledger Technology,DLT)平台。
Fabric 具有高度模块化和可配置的架构,可为各行各业的业务提供创新性、多样性和优化,其中包括银行、金融、保险、医疗保健、人力资源、供应链甚至数字音乐分发。
支持通用编程语言编写智能合约(如 Java、Go 和 Node.js)
该平台最重要的区别之一是它支持可插拔的共识协议,使得平台能够更有效地进行定制,以适应特定的业务场景和信任模型。例如,当部署在单个企业内或由可信任的权威机构管理时,完全拜占庭容错的共识可能是不必要的,并且大大降低了性能和吞吐量。在这种的情况下,崩溃容错(Crash Fault-Tolerant,CFT)共识协议可能就够了,而在去中心化的场景中,可能需要更传统的拜占庭容错(Byzantine Fault Tolerant,BFT)共识协议。
1.1 智能合约
智能合约不仅是在网络中封装和简化信息的关键机制,它还可以被编写成自动执行参与者的特定交易的合约。
例如,可以编写智能合约以规定物品的运费,运费根据物品送达的速度变化而变化。交易双方同意并把条款写入账本后,当物品送达时,相应的资金就会自动转账。
Hyperledger Fabric 智能合约用链码编写,当该应用程序需要与账本交互时,由区块链外部的应用程序调用。在大多数情况下,链码只与账本的数据库、世界状态(见3.4)交互(例如,查询),而不与交易日志交互。
链码可以用几种编程语言实现。目前支持 Go、Node.js 和 Java 链码。
1.2 共识
保持账本在整个网络中同步的过程称为共识。该过程确保所有账本仅在交易被相应参与者批准时更新,并且当账本更新时,所有账本都以相同的顺序更新相同的交易。
Hyperledger Fabric 被设计为允许网络启动者选择最能代表参与者间存在的关系的共识机制。
1.3 通道
Hyperledger Fabric 还提供创建通道的功能,允许一组参与者创建各自的交易账本。对于某些网络而言,这是一个特别重要的选择。这些网络中,一些参与者可能是竞争对手,并且不希望他们做出的每笔交易都被每个参与者知晓,例如,他们只向某些参与者提供的特殊价格,而其他人不是。如果两个参与者组成一个通道,那么只有这两个参与者拥有该通道的账本副本,而其他参与者没有。
不同通道的交易信息和数据彼此隔离。
1.4 链码
链码是对智能合约的进一步扩展,隔离运行在docker环境中。分为系统链码和用户链码,系统链码嵌入在系统内,提供对系统的配置和管理。用户通过相关的API编写用户链码,通过部署和实例化后可以对账本中的状态进行更新。部署和启动Fabric网络后,可以通过命令行或者SDK进行链码操作。
执行与交易排序分离,限制了跨节点类型所需的信任和验证级别,并优化了网络可扩展性和性能。
即业务逻辑。链码强制执行读取或更改键值对或其他状态数据库信息的规则。链码函数针对账本的当前状态数据库执行,并通过交易提案启动。链码执行会产生一组用于写入的键值对(写集),可以被提交到网络并应用于所有节点的账本。
2. 主要特点
2.1 模块化
平台的核心设计旨在满足企业业务需求的多样性。
- 可插拔的排序服务对交易顺序建立共识,然后向节点广播区块;
- 可插拔的成员服务提供者负责将网络中的实体与加密身份相关联;
- 可选的P2P gossip 服务通过排序服务将区块发送到其他节点;
- 智能合约(“链码”)隔离运行在容器环境(例如 Docker)中。它们可以用标准编程语言编写,但不能直接访问账本状态;
- 账本可以通过配置支持多种 DBMS;
- 可插拔的背书和验证策略,每个应用程序可以独立配置。
2.2 智能合约
智能合约,在 Fabric 中称之为“链码”
有三个关键点适用于智能合约,尤其是应用于平台时:
- 多个智能合约在网络中同时运行,
- 它们可以动态部署(很多情况下任何人都可以部署),
- 应用代码应视为不被信任的,甚至可能是恶意的。
大多数现有的具有智能合约能力的区块链平台遵循顺序执行架构,其中共识协议:
- 验证并将交易排序,然后将它们传播到所有的节点,
- 每个节点按顺序执行交易。
采用顺序执行架构的区块链执行智能合约的结果一定是确定的,否则,可能永远不会达成共识。由于所有节点都按顺序执行所有交易,性能和规模被限制。事实上系统要求智能合约代码要在每个节点上都执行,这就需要采取复杂措施来保护整个系统免受恶意合约的影响,以确保整个系统的弹性。
Fabric的新方法执行-排序-验证。为了解决顺序执行模型面临的弹性、灵活性、可伸缩性、性能和机密性问题,它将交易流分为三个步骤:
- 执行一个交易并检查其正确性,从而给它背书,
- 通过(可插拔的)共识协议将交易排序,
- 提交交易到账本前先根据特定应用程序的背书策略验证交易
在 Fabric 中,特定应用程序的背书策略可以指定需要哪些节点或多少节点来保证给定的智能合约正确执行。因此,每个交易只需要由满足交易的背书策略所必需的节点的子集来执行(背书)。这样可以并行执行,从而提高系统的整体性能和规模。第一阶段也消除了任何非确定性,因为在排序之前可以过滤掉不一致的结果。
因为我们已经消除了非确定性,Fabric 是第一个能使用标准编程语言的区块链技术。
3. 关键概念
关键概念 — hyperledger-fabricdocs master 文档
- 区块链网络区块链网络 — hyperledger-fabricdocs master 文档
- 角色划分
Fabric包含三类角色:客户端client、节点peer、排序者order。多角色划分有利于提高交易处理效率。
客户端client用于将终端用户的交易请求发送到区块链网络节点peer。为了提高交易处理效率,节点分为多种类型,如背书节点Endorser,确认节点Committter,主节点Leader,锚节点Anchor。节点是一个逻辑概念,Endorser和Committer可以同时部署在一台物理机上。排序者order负责对交易排序后打包成区块,并将结果返回给Committer节点,一般由order集群实现。
- Orderer 排序服务节点 或 排序节点:Orderer 是一个运行实现交付担保的通信服务节点,例如原子性或总顺序广播。排序节点负责接受交易并排序(排序算法有: SOLO,KAFKA,RAFT,PBFT),最后将排序好的交易按照配置中的约定整理为区块之后提交给记账节点进行处理。
- Peer 节点:Peer 是业务参与方组织在区块链网络中所拥有的参与共识和账本记录的节点。可以有多种角色。作为 Committing Peer 记账节点时,无需安装链码,只负责验证从 Orderer 发出的区块和交易的合法性、并存储账本区块信息。作为 Endorsing Peer 背书节点时,必须安装链码,在交易时需进行签名背书。
- Anchor 锚节点:为了实现高可用,每个参与方组织一般包含两个或多个 Peer 节点,可以设置其中的一个为 Anchor ,与区块链网络中的其他组织进行信息同步。
- 客户端节点:客户端扮演了代表最终用户的实体,可以同时与 Peer 和 Orderer 通信,创建并调用交易。这里客户端可以指应用程序、SDK、命令行等。