hyperledger-fabric概念

32 min read

介绍

Linux 基金会于2015年创建了 Hyperledger(超级账本)项目,以推进跨行业的区块链技术。它不是用来宣布一个区块链标准,而是鼓励通过社区流程开发区块链技术的协作方法,其中包括鼓励开放式开发、和随着时间的推移采用关键标准的知识产权。
Fabric 是第一个支持通用编程语言编写智能合约(如 Java、Go 和 Node.js)的分布式账本平台,不受限于特定领域语言(Domain-Specific Languages,DSL)。这意味着大多数企业已经拥有开发智能合约所需的技能,并且不需要额外的培训来学习新的语言或特定领域语言。
Hyperledger Fabric 与其他区块链系统不同的地方是 私有许可 。与允许未知身份参与网络的开放式非许可系统(需要诸如“工作量证明”之类的协议来验证交易并保护网络)不同,Hyperledger Fabric 网络的成员需要从可信赖的 成员服务提供者(MSP) 注册。
Fabric 平台也是许可的,这意味着它与公共非许可网络不同参与者彼此了解而不是匿名的或完全不信任的。也就是说,尽管参与者可能不会完全信任彼此(例如,同行业中的竞争对手),但网络可以在一个治理模式下运行,这个治理模式是建立在参与者之间确实存在的信任之上的,如处理纠纷的法律协议或框架。
该平台最重要的区别之一是它支持可插拔的共识协议,并且大大降低了性能和吞吐量。
Fabric 可以利用不需要原生加密货币的共识协议来激励昂贵的挖矿或推动智能合约执行。不使用加密货币会降低系统的风险,并且没有挖矿操作意味着可以使用与任何其他分布式系统大致相同的运营成本来部署平台。
这些差异化设计特性的结合使 Fabric 成为当今交易处理和交易确认延迟方面性能较好的平台之一,并且它实现了交易的隐私和保密以及智能合约(Fabric 称之为“链码”)。

模块化

Fabric 由以下模块化的组件组成:
  • 可插拔的排序服务对交易顺序建立共识,然后向节点广播区块;
  • 可插拔的成员服务提供者负责将网络中的实体与加密身份相关联;
  • 可选的P2P gossip 服务通过排序服务将区块发送到其他节点;
  • 智能合约(“链码”)隔离运行在容器环境(例如 Docker)中。它们可以用标准编程语言编写,但不能直接访问账本状态;
  • 账本可以通过配置支持多种 DBMS
  • 可插拔的背书和验证策略,每个应用程序可以独立配置

许可和非许可区块链

在一个非许可区块链中,几乎任何人都可以参与,每个参与者都是匿名的。在这样的情况下,区块链状态达到不可变的区块深度前不存在信任。为了弥补这种信任的缺失,非许可区块链通常采用“挖矿”或交易费来提供经济激励,以抵消参与基于“工作量证明(PoW)”的拜占庭容错共识形式的特殊成本。
另一方面,许可区块链在一组已知的、已识别的且经常经过审查的参与者中操作区块链,这些参与者在产生一定程度信任的治理模型下运作。许可区块链提供了一种方法来保护具有共同目标,但可能彼此不完全信任的一组实体之间的交互。通过依赖参与者的身份,许可区块链可以使用更传统的崩溃容错(CFT)或拜占庭容错(BFT)共识协议,而不需要昂贵的挖掘

智能合约

智能合约,在 Fabric 中称之为“链码”,作为受信任的分布式应用程序,从区块链中获得信任,在节点中达成基本共识。它是区块链应用的业务逻辑。
  • 多个智能合约在网络中同时运行
  • 它们可以动态部署(很多情况下任何人都可以部署),
  • 应用代码应视为不被信任的,甚至可能是恶意的。
几乎所有现有的区块链系统都可以找到顺序执行架构,从非许可平台,如 Ethereum(基于 PoW 共识)到许可平台,如 TendermintChain Quorum
采用顺序执行架构的区块链执行智能合约的结果一定是确定的,否则,可能永远不会达成共识。为了解决非确定性问题,许多平台要求智能合约以非标准或特定领域的语言(例如 Solidity)编写,以便消除非确定性操作。这阻碍了平台的广泛采用,因为它要求开发人员学习新语言来编写智能合约,而且可能会编写错误的程序。

一种新方法

针对交易 Fabric 引入了一种新的架构,我们称为执行-排序-验证。为了解决顺序执行模型面临的弹性、灵活性、可伸缩性、性能和机密性问题,它将交易流分为三个步骤:
  • 执行一个交易并检查其正确性,从而给它背书,
  • 通过(可插拔的)共识协议将交易排序
  • 提交交易到账本前先根据特定应用程序的背书策略验证交易
比较维度传统区块链(如 Bitcoin / Ethereum)Hyperledger Fabric(新方法)
网络类型公有链(任何人可加入)联盟链 / 私有链(仅授权成员参与)
身份机制匿名地址 + 数字签名基于 PKI 的真实身份体系(MSP)
共识机制PoW / PoS 等计算竞争可插拔共识(Raft / BFT / Kafka),性能高
智能合约执行所有节点执行同一合约背书节点执行 + 排序节点共识 + 提交节点验证(分离执行流程)
隐私与访问控制全网可见交易通道(Channel)+ 私有数据集合(PDC) 实现隐私分区
交易确认速度分钟级(需全网共识)秒级(仅联盟节点共识)
应用场景去中心化金融、加密货币企业级协作、供应链、电子存证、司法等

“执行-排序-验证”三阶段架构(新交易模型)

传统区块链(例如以太坊)中:
每个节点都执行交易 → 再达成共识 → 更新账本
这会导致 性能低、易冲突、浪费算力
而 Fabric 的新方法是:
背书节点(Endorser)执行交易 → 排序服务(Orderer)排序 → 提交节点(Committer)验证并写入账本。
优点****:
  • 并行执行,提高吞吐量(可达数千 TPS)。
  • 合约执行和共识解耦,便于定制和扩展。
  • 减少重复计算,节约资源。

模块化可插拔架构

Fabric 被设计为“模块化区块链平台”,不同部分都可以更换:
模块可插拔实现
共识层Raft、Kafka、BFT、Solo 等
身份管理Fabric CA、LDAP、外部 PKI
存储层LevelDB、CouchDB
策略控制ACL(访问控制列表)自定义
区别:传统区块链共识和网络架构是固定的(如以太坊只能用PoS),而 Fabric 的可插拔设计更贴合企业需求。
Fabric 的新方法不追求“去信任化”,而是“有限信任的联盟治理”。
  • 每个成员组织都有经过认证的身份(MSP)。
  • 各组织共同维护账本副本。
  • 通过策略(Policy)决定哪些组织可以背书、添加区块或访问数据。
分类优势潜在代价 / 限制
性能高并发、秒级出块部署复杂
隐私通道+PDC,灵活控制隐私配置需细致管理
可扩展性模块化架构,可定制配置错误风险增加
信任模型联盟治理可信不适合完全去中心化场景
合规性无代币,易被政府接受缺乏经济激励机制

隐私和保密性

在一个公共的、非许可的区块链网络中,利用 PoW 作为其共识模型,交易在每个节点上执行。这意味着合约本身和他们处理的交易数据都不保密。每个交易以及实现它的代码,对于网络中的每个节点都是可见的。在这种情况下,我们得到了基于 PoW 的拜占庭容错共识却牺牲了合约和数据的保密性。
对于许多商业业务而言,缺乏保密性就会有问题。例如,在供应链合作伙伴组成的网络中,作为巩固关系或促进额外销售的手段,某些消费者可能会获得优惠利率。如果每个参与者都可以看到每个合约和交易,在一个完全透明的网络中就不可能维持这种商业关系,因为每个消费者都会想要优惠利率。
第二个例子考虑到证券行业,无论一个交易者建仓(或出仓)都会不希望她的竞争对手知道,否则他们将会试图入局,进而影响交易者的策略。
加密数据是提供保密性的一种方法;然而,在利用 PoW 达成共识的非许可网络中,加密数据位于每个节点上。如果有足够的时间和计算资源,加密可能会被破解。对于许多企业业务而言,不能接受信息可能受损的风险。
现代主流算法(例如 AES-128/AES-256、RSA-2048/4096、ECC-256/384)设计目标就是让穷举在现实可行性上“不可能”。当前计算与资源水平下,用暴力破解这些算法不可行——即使是具备强大算力的国家级对手,也需要天文数字量级的时间/能量。
零知识证明(Zero Knowledge Proofs,ZKP)是正在探索解决该问题的另一个研究领域。目前这里的权衡是计算 ZKP 需要相当多的时间和计算资源。因此,在这种情况下需要权衡资源消耗与保密性能。
Hyperledger Fabric 是一个许可平台,通过其通道架构和 私有数据特性实现保密。在通道方面,Fabric 网络中的成员组建了一个子网络,在子网络中的成员可以看到其所参与到的交易。因此,参与到通道的节点才有权访问智能合约(链码)和交易数据,以此保证了隐私性和保密性。私有数据通过在通道中的成员间使用集合,实现了和通道相同的隐私能力并且不用创建和维护独立的通道。

可插拔共识

具体来说,就是排序服务。由于共识是模块化的,可以根据特定部署或解决方案的信任假设来定制其实现。
Fabric 目前提供了一种基于etcd库Raft 协议 的 CFT 排序服务的实现。更多当前可用的排序服务请查阅排序服务概念文档

共识

交易必须按照发生的顺序写入账本,即使它们可能位于网络中不同的参与者集合之中。为此,必须建立交易的顺序,且必须采用一种方法来拒绝错误(或恶意)插入到账本中的非法交易。

共享账本

Hyperledger Fabric 有一个账本子系统,包括两个组件: 世界状态 交易日志 。每个参与者都拥有他们所属的每个 Hyperledger Fabric 网络的账本副本。
世界状态组件描述了在给定时间点的账本的状态。它是账本的数据库。交易日志组件记录产生世界状态中当前值的所有交易;这是世界状态的更新历史。然后,账本包括世界状态数据库和交易日志历史记录。

Hyperledger Fabric 模型

资产

资产可以涵盖有形(房地产和硬件)和无形资产(合同和知识产权)。Hyperledger Fabric 提供使用链码交易来实现修改资产的功能。
资产在 Hyperledger Fabric 中被表示为键值对的集合,状态更改记录为 Channel 账本上的交易。资产可以用二进制或 JSON 表示

链码

链码是定义单项或多项资产,和能修改资产的交易指令的软件;换句话说,它是业务逻辑。链码强制执行读取或更改键值对或其他状态数据库信息的规则。链码函数针通过交易提案启动,并使用账本的当前状态数据库进行执行。链码执行后会产生一组用于写入的键值对(写集),可以被提交到网络并应用于所有节点的账本。

账本特性

账本是 Fabirc 中对所有状态转换的记录,是有序并防篡改的。状态转换是参与者提交链码调用(“交易”)的结果。每个交易都会生成一组资产键值对,这些键值对以创建、更新或删除形式提交到账本。

隐私

Hyperledger Fabric 的每个通道上都会有一个不可更改的账本,以及可操纵和修改资产当前状态(即更新键值对)的链码。
如果应用场景需要在完全透明和隐私之间寻求平衡,可以仅在那些需要访问资产状态来进行读取和写入操作的节点上安装链码(换句话说,如果一个节点没有安装链码,它将无法与账本正常交互的)。
为了进一步模糊数据,在将交易发送到排序服务并将区块附加到账本之前,可以使用诸如 AES 之类的通用加密算法对链码内的值进行(部分或全部)加密。一旦加密数据被写入账本,它就只能由拥有用于生成密文的相应密钥的用户解密。

安全和成员服务

Hyperledger Fabric 支持一个交易网络,在这个网络中,所有参与者都拥有已知的身份公钥基础设施用于生成与组织、网络组件以及终端用户或客户端应用程序相关联的加密证书。因此,可以在更广泛的网络和通道级别上实现操纵和管理数据访问控制。Hyperledger Fabric 的这种“许可”概念,加上通道的存在和其功能,有助于解决隐私和机密性要求较高的场景。

共识

最近,在分布式账本技术中,共识已成为单个函数内特定算法的同义词。共识被定义为组成区块的一组交易的正确性的闭环验证。在提交一个交易之前,节点会使用系统链码来确保存在足够的背书,并且来自适当的实体。此外,在将包含此交易的任何区块附加到账本之前,都会进行版本检查,以确保在此期间,账本的当前状态是能与交易中的信息达成共识的。最终检查可防止双重花费操作和可能危及数据完整性的其他威胁,并让使用非静态变量来执行函数成为可能。

区块链网络

区块链网络是一个为应用程序提供账本及智能合约(chaincode)服务的技术基础设施。
在大多数的情况下,多个组织 会聚集到一起作为一个[通道],在通道上,交易在链码上被调用。而他们的权限是由一套在通道最初配置的时候联盟成员都同意的规则来决定的。
R1、R2、R0 三个组织共同决定建立网络。该网络有一个配置 CC1,所有组织都同意该配置,其中列出了组织的定义以及定义每个组织将在频道上扮演的角色的策略。
在此通道上,R1 和 R2 将把名为 P1 和 P2 的对等节点连接到通道 C1,而 R0 拥有通道的排序服务 O。所有这些节点都将包含通道账本 (L1) 的副本,这是记录交易的地方。请注意,排序服务保留的账本副本不包含状态数据库。R1 和 R2 还将通过他们拥有的应用程序 A1 和 A2 与通道进行交互。这三个组织都有一个证书颁发机构,该颁发机构为其组织的节点、管理员、组织定义和应用程序生成了必要的证书。

创建网络

通道配置 CC1 已得到组织 R1、R2 和 R0 的同意,并包含在称为“配置块”的块中,该块通常由 <span style="color: #DF2A3F; font-weight: bold;">configtxgen</span> 工具从 <span style="color: #DF2A3F; font-weight: bold;">configtx.yaml</span> 文件创建。虽然一个组织可以单方面创建此频道,然后邀请其他组织加入该频道(我们将在将组织添加到现有频道中探讨这一点),但现在我们假设组织希望从一开始就在频道上进行协作。一旦配置块存在,就可以说通道在逻辑上存在 ,即使没有组件物理连接到它。
这些组织的定义及其管理员的身份必须由与每个组织关联的证书颁发机构 (CA) 创建。在我们的示例中,组织 R1、R2 和 R0 的认证和组织定义分别由 CA1、CA2 和 CA0 创建。

证书颁发机构

区块链网络的不同组件使用证书来相互标识自己来自特定组织。这就是为什么通常有多个 CA 支持区块链网络的原因——不同的组织通常使用不同的 CA。我们将在通道中使用三个 CA;每个组织一个。事实上,CA 非常重要,以至于 Hyperledger Fabric 为您提供了一个内置的 CA(称为 Fabric-CA来帮助您开始工作,尽管在实践中,组织会选择使用自己的 CA。
证书与成员组织的映射是通过称为成员服务提供程序 (MSP) 的结构实现的,该结构通过创建与根 CA 证书绑定的 MSP 来定义组织,以标识组件和身份是由根 CA 创建的。然后,通道配置可以通过策略向组织分配某些权限(这将赋予特定组织(例如 R1)向通道添加新组织的权限)。我们不会在这些图表上显示 MSP,因为它们会让它们变得混乱,但因为它们定义了组织,所以它们非常重要。

将节点加入通道

评论

hyperledger-fabric概念 | Niutr's Blog | Niutr's Blog