超总帐会计管理系统
Hyperledger 不是区块链,但它是 Linux 基金会在 2015 年 12 月发起的一个项目,旨在推进区块链技术。该项目是其成员的合作成果,旨在构建一个开源分布式分类帐框架,该框架可用于开发和实现跨行业的区块链应用程序和系统。主要重点是开发和运行支持全球商业交易的平台。该项目还致力于提高区块链系统的可靠性和性能。
Hyperledger 下的项目经历不同的发展阶段,从提出到孵化,再到逐渐进入活跃状态。项目也可能被弃用或处于生命周期结束状态,不再被积极开发。对于一个能够进入孵化阶段的项目来说,它必须有一个完整的工作代码库以及一个活跃的开发人员社区。
Hyperledger 下的项目
Hyperledger 下有两类项目。第一类是区块链项目,第二类是支持这些区块链的相关工具或模块。
目前,Hyperledger 旗下有五个区块链框架项目: Fabric 、锯齿湖、 Iroha 、 Burrow 和 Indy 。在模块下,有 Hyperledger Cello 、 Hyperledger Composer 、 Hyperledger Explorer 和 Hyperledger Quilt 。Hyperledger 项目目前有 200 多个成员组织,有许多积极的贡献者,定期在全球各地组织会议和会谈。
下面是对所有这些项目的简要介绍,之后我们将看到更多关于 Fabric 和锯齿湖的设计、架构和实现的细节。
构造
fabric 是由 IBM 和 DAH ( 数字资产控股)提出的区块链项目。该区块链框架实施旨在为模块化架构的区块链解决方案的开发提供基础。它基于一个可插入的架构,其中各种组件,如共识引擎和成员服务,可以根据需要插入到系统中。它还利用了容器技术,该技术用于在隔离的封闭环境中运行智能合约。目前,它的状态是活动并且它是第一个从孵化到活动状态的项目。
源代码可以在https://github.com/hyperledger/fabric获得。
锯齿湖
锯齿湖是英特尔在 2016 年 4 月提出的一个区块链项目,其中一些关键创新专注于将分类账与交易分离,使用交易家族在多个业务领域中灵活使用,以及可插拔共识。
通过使用一个叫做事务族的新概念,可以更精确地解释去耦。交易不是单独与分类帐耦合,而是使用交易系列,这允许更大的灵活性、丰富的语义和业务逻辑的开放设计。事务遵循事务族中定义的模式和结构。
英特尔推出的一些创新元素包括缩写为 PoET 、耗时证明的新颖共识算法,该算法利用英特尔软件卫士扩展 ( 英特尔的 SGX )提供的可信执行环境 ( TEE )来提供安全、随机的领导者选举过程。它还支持有权限和无权限设置。
该项目在https://github.com/hyperledger/sawtooth-core可用。
伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃伊洛娃
Iroha 由 Soramitsu、日立、NTT Data 和 Colu 于 2016 年 9 月提供。Iroha 的目标是建立一个可重用组件库,用户可以选择在自己的基于 Hyperledger 的分布式分类账上运行。
Iroha 的主要目标是通过提供用 C++编写的可重用组件来补充其他 Hyperledger 项目,重点是移动开发。该项目还提出了一种新的一致性算法,称为 Sumeragi ,这是一种基于链的拜占庭容错一致性算法。
Iroha 在 https://github.com/hyperledger/iroha 有售。
Iroha 已经提出并正在开发各种库,包括但不限于数字签名库(ed25519)、阿沙-3 哈希库、事务序列化库、P2P 库、API 服务器库、iOS 库、Android 库和 JavaScript 库。
挖掘
该项目目前处于孵化状态。Hyperledger Burrow 由 Monax 提供,Monax 为企业开发区块链开发和部署平台。Hyperledger Burrow 引入了模块化的区块链平台和基于以太坊虚拟机 ( EVM )的智能合同执行环境。陋居使用利益证明、拜占庭容错 Tendermint 共识机制。因此,Burrow 提供了高吞吐量和事务终结性。
源代码可以在https://github.com/hyperledger/burrow获得。
印第车赛
这个项目正在 Hyperledger 下孵化。Indy 是一个分布式分类帐,用于构建分散的身份。它提供了工具、实用程序库和模块,可用于构建基于区块链的数字身份。这些身份可以跨多个区块链、域和应用程序使用。Indy 有自己的分布式账本,并使用冗余拜占庭容错 ( RBFT )来达成共识。
源代码可以在https://github.com/hyperledger/indy-node获得。
探险家
该项目旨在为 Hyperledger 结构构建一个区块链浏览器,可用于查看和查询来自区块链的事务、块和关联数据。它还提供网络信息和与链代码交互的能力。
目前,很少有其他项目正在 Hyperledger 下孵化。这些项目旨在提供工具和实用程序来支持区块链网络。下一节将介绍这些项目。
源代码可以在https://github.com/hyperledger/blockchain-explorer获得。
大提琴
Cello 背后的目标是让区块链容易部署。这将提供允许区块链服务的“即服务”部署的能力。目前,该项目正处于孵化阶段。
Cello 的源代码可以在https://github.com/hyperledger/cello获得。
设计者
该实用程序允许用业务语言描述业务流程,同时抽象出低级智能合约开发细节,从而简化了区块链解决方案的开发。
Hyperledger composer 在https://hyperledger.github.io/composer/有售。
被子
该实用程序实施了 Interledger 协议,该协议有助于不同分布式和非分布式分类帐网络之间的互操作性。
被子在https://github.com/hyperledger/quilt有售。
目前,所有提到的项目都处于不同的发展阶段。
随着越来越多的成员加入 Hyperledger 项目并为区块链技术的发展做出贡献,该列表预计将会增长。在下一节中,我们将看到 Hyperledger 的参考架构,它提供了构建新的 Hyperledger 项目时可以遵循的一般原则和设计理念。
作为协议的超级账本
Hyperledger 的目标是建立由行业用例驱动的新区块链平台。由于社区对 Hyperledger 项目做出了许多贡献,Hyperledger 区块链平台正在发展成为一种商业交易协议。与早期的区块链解决方案相比,Hyperledger 也正在发展成为一种规范,可用作构建区块链平台的参考,早期的解决方案仅解决特定类型的行业或需求。
在下一节中,将介绍 Hyperledger 项目发布的参考架构。由于这项工作正处于持续和严格的开发中,预计会有一些变化,但核心服务预计将保持不变。
参考架构
Hyperledger 发布了一份白皮书,可从 https://docs . Google . com/document/d/1Z4M _ qwillrehpbvrusj 3 of 8 IIR-gqS-ZYe7W-le 9 gne/edit # heading = h . m 6 IML 6 hqrnm 2 获取。
本文档提供了一个参考架构,可作为构建许可分布式分类账的指南。参考架构由构成业务区块链的各种组件组成。这些高级组件显示在此处显示的参考体系结构图中:
参考架构-来源:Hyperledger 白皮书
从左边开始,我们看到有五个顶级组件提供各种服务。我们将详细探讨所有这些组件。
首先是身份,它在成员服务下提供授权、标识和认证服务。
然后是策略组件,它提供策略服务。
在这之后,分类账和交易出现了,它包括分布式分类账、订购服务、网络协议以及认可和验证服务。该分类账只能通过区块链网络参与者之间的共识进行更新。
最后,我们有智能合同层,它在 Hyperledger 中提供链码服务,并利用安全容器技术来托管智能合同。我们将在 Hyperledger Fabric 一节中更详细地了解所有这些内容。
通常,从组件的角度来看,Hyperledger 包含以下描述的各种元素:
- 共识层:这些服务负责促进区块链网络上的参与者之间的协议过程。需要达成共识,以确保交易的顺序和状态在区块链网络中得到验证和认可。
- 智能合约层:这些服务负责按照用户的需求实现业务逻辑。基于驻留在区块链上的智能合约中定义的逻辑来处理交易。
- 通信层:该层负责区块链网络上节点之间的消息传输和交换。
- 安全和加密层:这些服务负责提供允许各种加密算法或模块提供隐私、保密和不可否认服务的能力。
- 数据存储:这一层提供了使用不同的数据存储来存储分类帐状态的能力。这意味着数据存储也是可插拔的,并允许使用任何数据库后端。
- 策略服务:这组服务提供了管理区块链网络所需的不同策略的能力。这包括认可政策和共识政策。
- API 和 SDK:这一层允许客户端和应用程序与区块链交互。SDK 用于提供在区块链上部署和执行链代码、查询块和监控事件的机制。
区块链服务有一些特定的要求。在下一节中,我们将讨论 Hyperledger Fabric 的设计目标。
Hyperledger Fabric 的需求和设计目标
区块链服务有一些特定的要求。参考架构是由 Hyperledger 项目参与者提出的需求和要求驱动的,并且是在研究了行业用例之后提出的。从对工业用例的研究中可以推断出几类需求,在下面的章节中会进行讨论。
模块化方法
Hyperledger 的主要要求是模块化结构。预计作为跨行业的织物(区块链),它将用于许多商业场景。因此,与存储、策略、链码、访问控制、共识和许多其他区块链服务相关的功能应该是模块化和可插拔的。规范建议模块应该是即插即用的,用户应该能够容易地移除和添加满足业务需求的不同模块。
隐私和保密
这个要求是最关键的因素之一。由于传统的区块链是无权限的,在像 Hyperledger Fabric 这样的有权限模型中,网络上的交易只对那些被允许查看的人可见是至关重要的。
交易和合同的隐私和保密性在商业区块链中是绝对重要的。因此,Hyperledger 的愿景是为各种加密协议和算法提供支持。我们在第五章、对称密码和第六章、公钥密码中讨论了密码学。
预计用户将能够根据其业务需求选择适当的模块。例如,如果业务区块链只需要在已经信任的各方之间运行,并且执行非常基本的业务操作,那么可能就不需要为机密性和隐私提供高级加密支持。因此,用户应该能够删除该功能(模块)或者用更适合他们需要的模块来替换它。
类似地,如果用户需要运行跨行业的区块链,那么保密性和隐私可能是最重要的。在这种情况下,用户应该能够将高级加密和访问控制机制(模块)插入区块链(结构),这甚至可以允许使用安全模块 ( HSMs )的硬件。
此外,区块链应该能够在不影响性能的情况下处理复杂的加密算法。除了前面提到的情形之外,由于业务中的法规要求,还应该有一项规定,允许实施符合法规和合规性要求的隐私和保密政策。
可量测性
这是另一个主要需求,一旦满足,将允许合理的事务吞吐量,这将足以满足所有业务需求以及大量用户。
确定性交易
这在任何区块链中都是一个核心要求,因为如果不管交易是由谁和在哪里执行的,每次执行交易都不会产生相同的结果,那么达成共识是不可能的。因此,确定性事务成为任何区块链网络的关键要求。我们在第 4 章、智能合约中讨论了这些概念。
身份
为了提供隐私和保密服务,还需要一个灵活的 PKI 模型来处理访问控制功能。加密机制的强度和类型也应该根据用户的需要和要求而变化。在某些情况下,用户可能需要隐藏自己的身份,因此,Hyperledger 有望提供这一功能。
可审计性
可审计性是 Hyperledger Fabric 的另一个要求。我们期望对所有身份、相关操作和任何更改进行不可变的审计跟踪。
互用性
目前,有许多可用的区块链平台,但它们不能相互通信,这可能是区块链全球商业生态系统增长的一个限制因素。据设想,许多区块链网络将根据具体需要在商业界运作,但重要的是它们能够相互通信。应该有一套所有区块链都可以遵循的通用标准,以便允许不同分类帐之间的通信。预计将开发一种协议,允许在许多结构之间交换信息。
轻便
可移植性需求关注的是跨多个平台和环境运行的能力,而不需要在代码级别做任何改变。Hyperledger Fabric 被设想为可移植的,不仅在基础设施级别,而且在代码、库和 API 级别,以便它可以支持跨 Hyperledger 的各种实现的统一开发。
丰富数据查询
区块链网络应该允许在网络上运行丰富的查询。这可用于使用传统查询语言来查询分类帐的当前状态,这将允许更广泛的采用和易用性。
上述各点描述了开发符合 Hyperledger 设计理念的区块链解决方案所需满足的要求。在下一节中,我们将了解 Hyperledger Fabric,这是 Hyperledger 下第一个升级到活动状态的项目。
构造
要了解 Hyperledger 项目中正在开发的各种项目,首先必须了解 Hyperledger 的基础。在向读者介绍更深入的材料之前,需要对一些特定于 Hyperledger 的术语进行澄清。
首先是面料的概念。结构可以定义为提供基础层的组件集合,可用于交付区块链网络。结构网络有各种类型和功能,但所有结构都有一些共同的属性,如不变性,并且都是共识驱动的。一些结构可以提供构建区块链网络的模块化方法。在这种情况下,区块链网络可以有多个可插拔模块来执行网络上的各种功能。
例如,一致性算法可以是区块链网络中的可插入模块,其中,根据网络的要求,可以选择适当的一致性算法并将其插入网络。这些模块可以基于结构的某些特定规范,并且可以包括 API、访问控制和各种其他组件。
结构还可以设计为私有或公共,并允许创建多个业务网络。举个例子,比特币是一个运行在其架构(区块链网络)之上的应用。正如之前在第一章、区块链 101 中讨论的,区块链可以是有许可的,也可以是无许可的。然而,Hyperledger Fabric 的目标是开发一个许可的分布式分类帐。
Fabric 也是 IBM 对 Hyperledger 基金会做出的代码贡献的名称,正式名称为 Hyperledger Fabric。IBM 还通过其 IBM 云服务提供区块链即服务(IBM 区块链)。
在https://www.ibm.com/cloud/有售。
现在让我们来详细了解一下 Hyperledger Fabric。
超分类帐结构
这个结构最初是由 IBM 和 Digital Assets 对 Hyperledger 项目做出的贡献。这一贡献的目的是使模块化,开放,灵活的方法来建设区块链网络。
fabric 中的各种功能都是可插拔的,它还允许使用任何语言来开发智能合约。这种功能是可能的,因为它基于容器技术(Docker),可以承载任何语言。
Chaincode 放在一个安全的容器中,其中包括安全的操作系统、chaincode 语言、运行时环境以及 Go、Java 和 Node.js 的 SDK。如果需要,将来也可以支持其他语言,但需要一些开发工作。智能合约在结构中称为链码。与以太坊中特定领域的语言或比特币中有限的脚本语言相比,这种能力是一种引人注目的功能。这是一个许可的网络,旨在解决可扩展性、隐私和机密性等问题。这背后的基本思想是模块化,这将允许设计和实施业务区块链的灵活性。这可以实现可伸缩性、隐私和其他期望的属性,并根据需求对它们进行微调。
对于普通用户来说,fabric 中的交易是私有的、保密的和匿名的,但是授权的审计员仍然可以跟踪和联系到用户。作为许可网络,所有参与者都需要向会员服务注册才能访问区块链网络。该分类帐还提供了可审计功能,以满足用户的监管和合规需求。
会员服务
这些服务用于为结构网络的用户提供访问控制能力。下面的列表显示了成员资格服务执行的功能:
- 用户身份验证
- 用户注册
- 根据用户的角色为其分配适当的权限
成员服务利用认证机构来支持身份管理和授权操作。此 CA 可以是内部的(结构 CA),这是 Hyperledger 结构中的默认接口,或者组织可以选择使用外部证书颁发机构。Fabric CA 颁发注册证书 ( 电子证书,由注册证书颁发机构 ( 电子证书)制作。一旦向对等体发放了身份,他们就被允许加入区块链网络。也有称为 T-Certs 的临时证书,用于一次性交易。
所有对等体和应用程序都使用证书颁发机构进行标识。认证服务由认证机构提供。MSP 还可以与现有的身份服务(如 LDAP)进行交互。
区块链服务
区块链服务是 Hyperledger 结构的核心。该类别中的组件如下。
共识服务
共识服务负责提供共识机制的接口。它充当一个可插入的模块,从其他 Hyperledger 实体接收交易,并根据所选机制类型的标准执行交易。
Hyperledger V1 中的共识被实现为一个名为order的对等体,它负责将事务按顺序排序到一个块中。订购方不持有智能合同或分类账。共识是可插入的,目前在 Hyperledger Fabric 中有两种类型的订购服务:
- SOLO:这是一个基本的订购服务,旨在用于开发和测试目的。
- Kafka :这是 Apache Kafka 的一个实现,提供订购服务。需要注意的是,目前 Kafka 只提供崩溃容错,不提供拜占庭容错。这在许可的网络中是可以接受的,在该网络中恶意行为者的机会几乎为零。
除了这些机制之外,基于简单拜占庭容错 ( SBFT )的机制也正在开发中,将在 Hyperledger Fabric 的后续版本中提供。
分布式分类帐
区块链和世界状态是分布式账本的两个主要元素。区块链只是一个密码链接的区块列表(如第一章、区块链 101 中介绍的那样),世界状态是一个键值数据库。智能合约使用此数据库来存储事务执行期间的相关状态。区块链由包含事务的块组成。这些事务包含 chaincode,它运行可能导致更新世界状态的事务。每个节点将世界状态保存在磁盘上的 LevelDB 或 CouchDB 中,这取决于实现。由于 Fabric 允许可插拔数据存储,因此您可以选择任何数据存储进行存储。
块由三个主要部分组成,称为块头、事务(数据)和块元数据。
下图显示了 Hyperledger Fabric 1.0 中具有相关字段的典型块:
方块图
块头由三个字段组成,分别是编号、先前哈希和数据哈希。
事务由多个字段组成,例如事务类型、版本、时间戳、通道 ID、事务 ID、时期、有效载荷可见性、链码路径、链码名称、链码版本、创建者身份、签名、链码类型、输入、超时、背书者身份和签名、提议散列、链码事件、响应状态、名称空间、读取集、写入集、开始键、结束键、读取列表和 Merkle 树查询摘要。
块元数据由创建者身份、相关签名、最后一个配置块号、块中包含的每个事务的标志以及最后一个持久偏移量(kafka)组成。
对等协议
Hyperledger Fabric 中的 P2P 协议是使用 google RPC ( gRPC )构建的。它使用协议缓冲区来定义消息的结构。
消息在节点之间传递,以便执行各种功能。Hyperledger 结构中有四种主要类型的消息:发现、事务、同步和一致。当启动时,在节点之间交换发现消息,以便发现网络上的其他对等体。事务消息用于部署、调用和查询事务,共识消息在共识期间交换。同步消息在节点之间传递,以同步并保持所有节点上的区块链更新。
分类帐存储
为了保存分类帐的状态,默认情况下,使用 LevelDB,它在每个对等点上都可用。另一种方法是使用 CouchDB,它提供了运行丰富查询的能力。
链码服务
这些服务允许创建用于执行链代码的安全容器。此类别的组件如下:
- 安全容器(Secure container):chain code 部署在 Docker 容器中,这些容器为智能契约的执行提供了一个锁定的沙箱环境。目前,Golang 作为主要的智能合约语言受到支持,但如果需要,可以添加和启用任何其他主流语言。
- 安全注册:这提供了包含智能合同的所有图像的记录。
事件
区块链上的事件可以由代言人和智能合约触发。外部应用程序可以监听这些事件,并在需要时通过事件适配器对它们做出反应。
API 和 CLI
应用程序编程接口通过公开各种 REST APIs 来提供到结构中的接口。此外,命令行接口提供了 REST APIs 的子集,允许快速测试和与区块链的有限交互。
织物的成分
Hyperledger 结构区块链包含各种组件。这些组件包括但不限于分类帐、链码、共识机制、访问控制、事件、系统监控和管理、钱包和系统集成组件。
凝视
对等体参与维护分布式分类帐的状态。他们还持有分布式分类账的本地副本。对等体通过八卦协议进行通信。Hyperledger 结构网络中有三种类型的对等方:
- 签署对等方或签署方,模拟交易执行并生成读写集。Read 是交易从分类帐中读取数据的模拟,write 是在交易执行并提交到分类帐时对分类帐进行的一组更新。签署执行和签署交易。应该注意的是,背书人也是委托人。背书策略通过链码实现,并指定交易背书的规则。
- 接收由背书者背书的交易的委托对等方或委托方,验证它们,然后用读写集更新分类帐。提交者验证由签署者生成的读写集以及事务验证。
- 提交者是还没有实现的第三类对等体。它已经在开发路线图上,并将得到实施
有序节点
排序节点接收来自签署者的事务以及读写集,按顺序排列它们,并将它们发送给提交对等体。然后,提交对等方执行验证并提交到分类帐。
所有对等体都使用成员服务颁发的证书。
客户
客户端是利用 API 与 Hyperledger 结构进行交互并提出交易的软件。
通道
通道允许机密事务在网络上的不同方之间流动。它们允许使用同一个区块链网络,但使用不同的区块链。渠道只允许渠道成员查看与他们相关的交易,网络中的所有其他成员都不能查看这些交易。
世界状态数据库
世界状态反映了区块链上所有提交的事务。这基本上是一个键值存储,随着事务和链代码的执行而更新。为此,可以使用 LevelDB 或 CouchDB。LevelDB 是一个键值存储,而 CouchDB 将数据存储为 JSON 对象,这允许针对数据库运行丰富的查询。
处理
事务消息可以分为两种类型:部署事务和调用事务。前者用于将新的链码部署到分类帐,后者用于从智能合约调用函数。交易可以是公开的,也可以是保密的。公开交易是公开的,所有参与者都可以参与,而保密交易只能在对参与者开放的渠道中看到。
会员服务提供商(MSP)
MSP 是一个模块化组件,用于管理区块链网络上的身份。此提供程序用于鉴定想要加入区块链网络的客户端。我们在本章前面已经讨论了证书颁发机构的一些细节。MSP 使用 CA 来提供身份验证和绑定服务。
智能合同
我们在第 4 章、智能合约中详细讨论了智能合约。在 Hyperledger Fabric 中,实现了相同的智能合同概念,但它们被称为链码,而不是智能合同。它们包含执行交易和更新分类账的条件和参数。Chaincode 通常用 Golang 和 Java 编写。
加密服务提供商
顾名思义,这是一项为区块链网络提供加密算法和标准的服务。该服务提供密钥管理、签名和验证操作以及加密-解密机制。此服务与成员资格服务一起使用,为区块链的元素(如签署者、客户端以及其他节点和对等方)提供加密操作支持。
在介绍了 Hyperledger Fabric 的这个组件之后,在下一节中,我们将看到一个应用程序在 Hyperledger 网络上的样子。
区块链的应用
Fabric 上的典型应用程序只是由一个用户界面组成,通常用 JavaScript/HTML 编写,通过 API 层与存储在分类帐上的后端链码(智能合同)进行交互:
典型的织物应用
Hyperledger 提供了各种 API 和命令行界面来实现与分类帐的交互。这些 API 包括用于身份、交易、链码、分类帐、网络、存储和事件的接口。
链码实现
Chaincode 通常是用 Golang 或者 Java 编写的。链码可以是公开的(对网络上的所有人可见)、保密的或访问受控的。这些代码文件充当用户可以通过 API 与之交互的智能契约。用户可以在链码中调用导致状态变化的函数,从而更新分类账。
还有一些功能只是用来查询总账,不会导致任何状态变化。通过首先在代码中创建 chaincode shim 接口来执行 Chaincode 实现。Shim 提供了访问链代码的状态变量和事务上下文的 API。它可以是 Java 或 Golang 代码。
为了实现链码,需要以下四个函数:
Init()
:当链码部署到台账上时,调用该功能。这将初始化链码并导致状态改变,从而更新分类帐。Invoke()
:该功能在合同执行时使用。它接受一个函数名作为参数以及一个参数数组。该函数导致状态改变并写入分类帐。Query()
:该功能用于查询已部署链码的当前状态。此功能不会对分类帐进行任何更改。4()
: 当对等体部署其自己的链码副本时,执行该函数。使用此函数向对等方注册链码。
下图说明了 Hyperledger Fabric 的一般概述,请注意,顶部的对等群集包括所有类型的节点,如签署者、提交者、订购者等。
Hyperledger 结构的高级概述
上图显示,中上部显示的对等体相互通信,并且每个节点都有一个区块链副本。在右上角,显示了成员服务,其通过使用认证机构 ( CA )来验证和认证网络上的对等体。在图像的底部,显示了区块链的放大视图,其中现有系统可以为区块链生成事件,也可以侦听区块链事件,然后可以选择性地触发操作。在右下角,显示了用户与应用程序的交互,该应用程序通过invoice()
方法与智能合约对话,智能合约可以查询或更新区块链的状态。
应用程序模型
Hyperledger Fabric 的任何区块链应用程序都遵循 MVC-B 架构。这是基于流行的 MVC 设计模式。该模型中的组件包括模型、视图、控制和区块链:
- 视图逻辑:与用户界面有关。它可以是桌面、web 应用程序或移动前端。
- 控制逻辑:这是用户界面、数据模型和 API 之间的协调器。
- 数据模型:该模型用于管理链外数据。
- 区块链逻辑:用于通过控制器管理区块链,通过交易管理数据模型。
IBM 云服务在其区块链即服务产品下为区块链提供了示例应用程序。在https://www.ibm.com/blockchain/platform/有售。这项服务允许用户在一个易于使用的环境中创建自己的区块链网络。
超分类帐结构中的共识
Hyperledger Fabric 中的共识机制包括三个步骤:
- 交易背书:该流程模拟交易执行过程,对交易进行背书。
- 订购:这是由订购者集群提供的一项服务,它接受已签署的交易,并决定将交易写入分类账的顺序。
- 验证和提交:该流程由提交对等方执行,提交对等方首先验证从订购方收到的交易,然后将该交易提交到分类账。
以下流程图显示了这些步骤:
共识流
Hyperledger 结构中的事务生命周期
Hyperledger Fabric 中的事务处理流程包括几个步骤。这些步骤如下图所示
下图显示了该过程的快速总结:
事务生命周期
这些步骤详细描述如下:
- 客户的交易建议。这是第一步,由客户提出交易,并将其发送给分布式分类帐网络上的背书对等方。所有客户都需要通过会员服务注册,然后才能提议交易。
- 交易由生成读写(RW)集的背书者模拟。这是通过执行链码来实现的,但不是更新分类帐,而是仅创建描述对分类帐的任何读取或更新的读写集。
- 被认可的交易被发送回应用程序。
- 应用程序向订购服务提交已签署的交易和读写(RW)集。
- 订购服务将所有认可的事务和读写集按顺序组装到一个块中,并按通道 ID 对它们进行排序。
- 订购服务将组装的块广播给所有提交对等方。
- 提交对等方验证事务。
- 提交对等方更新分类帐。
- 最后,提交对等体的事务成功或失败的通知被发送回客户端/应用。
下图从交易流程的角度展示了上述步骤和结构体系结构:
事务流架构
如上图所示,第一步是建议客户通过 SDK 进行的交易。在此之前,假设所有客户端和对等体都向成员资格服务提供者注册。
至此,我们对 Hyperledger Fabric 的介绍就完成了。在下一节中,我们将看到另一个名为锯齿湖的 Hyperledger 项目。
锯齿湖
锯齿湖可以在许可和非许可模式下运行。这是一个分布式账本,它提出了两个新颖的概念:第一个是引入了一个新的共识算法,称为经过时间的证明 ( 诗人);二是事务科的想法。
以下各节介绍了这些新颖的建议。
诗人
PoET 是一种新颖的一致性算法,它允许根据节点在提出阻塞之前等待的时间来随机选择节点。这一概念与其他领导人选举和基于彩票的工作证明算法形成对比,如比特币中使用的 PoW,其中使用了大量的电力和计算机资源,以便被选为分组提议者;例如在比特币的情况下。PoET 是一种工作证明算法,但它不消耗计算机资源,而是使用可信计算模型来提供一种机制来满足工作证明要求。PoET 利用英特尔的 SGX 架构(软件保护扩展)来提供可信执行环境(TEE ),以确保进程的随机性和加密安全性。
应该注意,锯齿湖的当前实现不需要基于 SGX 的真实硬件 TEE,因为它只是出于实验目的而模拟的,因此不应在生产环境中使用。PoET 的基本思想是通过随机等待被选举为提出新事务的领导者来提供一种领导者选举机制。
然而,诗人也有其局限性,伊塔·埃亚尔强调了这一点。这种限制被称为过期芯片问题。
研究论文可在https://eprint.iacr.org/2017/179.pdf获得。
这种限制导致硬件浪费,从而导致资源浪费。还有一种可能性是黑客入侵芯片的硬件,这可能导致系统妥协和矿工的不当激励。
交易系列
传统的智能合约范式提供了一种基于适用于所有领域的通用指令集的解决方案。例如,在以太坊的情况下,已经为 EVM 开发了一组操作码,可用于构建智能合约,以满足任何行业的任何类型的要求。
虽然这种模型有其优点,但越来越明显的是,这种方法不是很安全,因为它提供了一个使用强大且富有表现力的语言的单一界面,这可能会为恶意代码提供更大的攻击面。这种复杂性和通用虚拟机范例导致了一些漏洞,这些漏洞最近被黑客发现和利用。最近的一个例子是 DAO hack 和进一步的拒绝服务 ( DoS )攻击,它们利用了一些 EVM 操作码中的限制。DAO hack 在第 4 章、智能合约中讨论。
下图所示的模型描述了传统的智能合约模型,其中使用通用虚拟机为所有域提供进入区块链的接口:
传统的智能合同模式
为了解决这个问题,锯齿湖提出了事务族的思想。通过将逻辑层分解为一组规则和一个特定领域的组合层,可以创建一个事务族。关键思想是业务逻辑是在事务家族中组成的,这为构建智能契约提供了一种更安全、更强大的方式。事务系列包含特定于域的规则和允许为该域创建事务的另一层。从另一个角度来看,事务系列是数据模型和事务语言的组合,实现了特定领域的逻辑层。数据模型表示区块链(分类帐)的当前状态,而交易语言修改分类帐的状态。预计用户将根据自己的业务需求构建自己的事务系列。
下图展示了这种模式,其中每个特定的领域,如金融服务、数字版权管理 ( DRM )、供应链和医疗行业,都有自己的逻辑层,由特定于该领域的运营和服务组成。这使得逻辑层同时具有限制性和功能性。事务族确保控制逻辑中只存在与所需域相关的操作,从而消除了执行不必要的、任意的和潜在有害的操作的可能性:
锯齿(交易系列)智能合约范例
英特尔为锯齿提供了三个交易系列:端点注册、Integerkey 和 MarketPlace。
- 端点注册中心用于注册分类服务
- Integerkey 用于测试已部署的总账
- 市场用于销售、购买和交易运营和服务
sawtoon _ bond是作为一个概念验证而开发的,用于演示债券交易平台。
可在https://github . com/hyperledger/sawtoon-core/tree/master/extensions/bond获得。
锯齿共识
锯齿波有两种基于网络选择的共识机制。如前所述,PoET 是可信执行的基于环境的抽奖功能,其基于节点等待阻塞提议的时间来随机选举领导者。
还有另一种共识类型叫做法定人数投票,是 Ripple 和 Stellar 构建的共识协议的改编。这种一致性算法允许即时事务终结,这在许可网络中通常是可取的。
开发环境–锯齿湖
在这一节中,将简要介绍如何为锯齿湖建立一个开发环境。设置开发环境需要一些先决条件。
本节中的示例假设运行 Ubuntu 系统和以下内容:
- 漫游,至少版本 1.9.0,可用于:/w【a】【g】【r】【a】/dn【m】【l】。
- VirtualBox,至少 5.0.10 r104061,可用于:/wv【I】【r】l或【r】【g】/w【I】【k】I
一旦成功下载并安装了这两个先决条件,下一步就是克隆存储库。
$ git clone https://github.com/IntelLedger/sawtooth-core.git
这将产生类似于以下屏幕截图所示的输出:
GitHub 锯齿克隆体
一旦锯齿被正确克隆,下一步就是启动环境。首先,运行以下命令,将目录更改到正确的位置,然后启动 travel box:
$ cd sawtooth-core/tools
$ vagrant up
这将产生类似于以下屏幕截图的输出:
流浪者站起来命令
如果在任何时候需要停止流浪,可以使用以下命令:
$ vagrant halt
或者:
$ vagrant destroy
halt
将停止流浪机器,而destroy
将停止并删除流浪机器。
最后,可以使用以下命令启动事务验证器。第一个ssh
进入流浪锯齿箱:
$ vagrant ssh
当 travel 提示符可用时,运行以下命令。首先使用以下命令构建锯齿湖核心:
$ /project/sawtooth-core/bin/build_all
当构建成功完成时,为了运行事务验证器,发出以下命令:
$ /project/sawtooth-core/docs/source/tutorial/genesis.sh
这将创建 genesis 块并清除任何现有的数据文件和密钥。该命令应该显示类似于以下屏幕截图的输出:
创世块和密钥生成
下一步是运行事务验证器,并如下所示更改目录:
$ cd /project/saw-toothcore
运行交易验证程序:
$ ./bin/txnvalidator -v -F ledger.transaction.integer_key --config
/home/ubuntu/sawtooth/v0.json
运行交易验证程序
可以通过按下 Ctrl + C 来停止验证器节点。一旦验证程序启动并运行,就可以在另一个终端窗口中启动各种客户机,与交易验证程序通信并提交交易。
例如,在下面的屏幕截图中,启动市场客户端与交易验证器进行通信。请注意,/keys/mkt.wif
下的键是使用以下命令创建的:
./bin/sawtooth keygen --key-dir validator/keys mkt
市场交易系列的 mktclient
这就完成了我们对锯齿的基本介绍。上面显示的例子也很基本,但是演示了锯齿湖是如何工作的。
锯齿湖也在持续开发中,因此,建议读者关注 http://intelledger.github.io/上的可用文档,以跟上最新的发展。
有一个很好的在线页面提供了锯齿湖的官方例子。该页面可在https://sawtooth.hyperledger.org/examples/获得。鼓励读者访问该页面并探索这些示例项目。
现在,在下一部分,我们将看到对 Corda 的介绍。需要注意的是,Corda 还不是 Hyperledger 下的正式项目;不过,它可能很快就会成为会员。所以,就目前而言,这是在 Hyperledger 下讨论的,但在未来,可能不会成为 Hyperledger 的一部分。
金色琴弦
根据定义,Corda 不是区块链,因为它不包含捆绑交易块,但它属于分布式分类账类别。它提供了区块链能提供的所有好处。如前所述,传统的区块链解决方案的概念是将事务捆绑在一个块中,每个块都以加密方式链接回其父块,从而提供不可变的事务记录。Corda 就不是这样了。
Corda 完全是从零开始设计的,采用新的模式提供所有区块链的优点,但没有传统的区块链。它完全是为金融行业开发的,用于解决由于每个组织管理自己的分类账而产生的问题,因此对真相有自己的看法,这导致了矛盾和运营风险。此外,每个组织还会复制数据,这导致管理单个基础架构的成本和复杂性增加。Corda 旨在通过构建一个分散的数据库平台来解决金融行业中的这类问题。
Corda 源代码可在https://github.com/corda/corda获得。它是用一种叫做 Kotlin 的语言编写的,这是一种针对 Java 虚拟机 ( JVM )的静态类型语言。
体系结构
Corda 平台的主要组件包括状态对象、合同代码、法律散文、交易、共识和流程。我们现在将更详细地探讨它们。
状态对象
状态对象代表表示财务协议的最小数据单元。它们是作为事务执行的结果而创建或删除的。他们指的是合同代码和法律条文。法律条文是可选的,为合同提供法律约束力。但是,为了管理对象的状态,合同代码是必需的。它是必需的,以便根据契约代码中定义的业务逻辑为节点提供状态转换机制。状态对象包含表示对象当前状态的数据结构。状态对象可以是当前的(活动的)或历史的(不再有效)。
例如,在下图中,状态对象表示对象的当前状态。在这种情况下,这是甲方和乙方之间的一个简单的模拟协议,其中方 ABC 支付方 XYZ 1000 英镑。这表示对象的当前状态;但是,引用的合同代码可以通过事务改变状态。状态对象可以被认为是一个状态机,事务使用它来创建更新的状态对象。
一个示例状态对象
处理
事务用于执行不同状态之间的转换。例如,上图中显示的状态对象是作为事务的结果而创建的。Corda 使用比特币风格的基于 UTXO 的模型进行交易处理。交易状态转换的概念与比特币相同。与比特币类似,交易可以有零个、单个或多个输入,以及单个或多个输出。所有交易都经过数字签名。
此外,Corda 没有采矿的概念,因为它不使用区块来安排区块链中的交易。相反,使用公证服务是为了提供交易的时间排序。在 Corda 中,可以使用 JVM 字节码开发新的事务类型,这使得它非常灵活和强大。
共识;一致
Corda 中的共识模型非常简单,它基于公证服务,这将在本章的后面部分讨论。一般的想法是,由公证服务评估事务的唯一性,如果它们是唯一的(即,唯一的事务输入),则由共识服务签名为有效。Corda 网络上可以运行单个或多个集群公证服务。各种共识算法,如 PBFT 或 Raft,可以被公证人用来达成共识。
Corda 中关于一致性有两个主要概念:关于状态有效性的一致性和关于状态唯一性的一致性。第一个概念与交易的验证有关,确保所有必需的签名都可用并且状态正确。第二个概念是检测重复消费攻击的方法,并确保交易尚未被消费并且是唯一的。
流
Corda 中的流是一个新颖的想法,它允许开发分散的工作流。Corda 网络上的所有通信都由这些流处理。这些是交易构建协议,可用于使用代码定义任何复杂性的任何财务流。流作为异步状态机运行,它们与其他节点和用户交互。在执行过程中,可以根据需要暂停或恢复它们。
成分
Corda 网络有多个组件。所有这些组件都将在接下来的章节中介绍。
节点
Corda 网络中的节点在无信任模式下运行,并由不同的组织运行。节点作为经过身份验证的对等网络的一部分运行。节点使用高级消息队列协议 ( AMQP )直接相互通信,该协议是一种经认可的国际标准(ISO/IEC 19464),可确保不同节点间的消息安全可靠地传输。AMQP 负责 Corda 中的传输层安全 ( TLS ),从而确保节点间通信数据的私密性和完整性。
节点还利用本地关系数据库进行存储。网络上的消息以紧凑的二进制格式编码。它们通过使用 Apache Artemis 消息代理 ( 活动 MQ )来交付和管理。节点可以充当网络地图服务、公证人、Oracle 或常规节点。下图显示了两个相互通信的节点的高级视图:
在 Corda 网络中通信的两个节点
在上图中,节点 1 正在使用 AMQP 协议通过 TLS 通信信道与节点 2 通信,这些节点有一个本地关系数据库用于存储。
许可服务
许可服务用于为安全性提供 TLS 证书。为了加入网络,参与者需要具有由根认证机构颁发的签名身份。身份要求在网络上是唯一的,许可服务用于签署这些身份。用于识别参与者的命名约定基于 X.500 标准。这确保了名称的唯一性。
网络地图服务
该服务用于以文档的形式提供网络上所有节点的网络图。该服务发布 IP 地址、身份证书和节点提供的服务列表。所有节点在第一次启动时通过向该服务注册来宣布它们的存在,并且当节点接收到连接请求时,首先在网络图上检查请求节点的存在。换句话说,该服务将参与者的身份解析到物理节点。
公证服务
在传统的区块链中,挖掘用于确定包含事务的块的顺序。在 Corda 中,公证服务用于提供事务排序和时间戳服务。在一个网络中可以有多个公证人,并且他们通过复合公钥来识别。公证人可以根据申请的要求使用不同的共识算法,如 BFT 或 Raft。公证服务对交易进行签名,以表明交易的有效性和终结性,然后将交易保存到数据库中。
出于性能原因,公证人可以在负载平衡的配置中运行,以便将负载分散到各个节点上;此外,为了减少延迟,建议在物理上更靠近事务参与者的地方运行节点。
Oracle 服务
Oracle 服务要么签署包含事实(如果它是真实的)的事务,要么自己提供事实数据。它们允许将真实世界的信息输入分布式分类账。甲骨文在第 4 章、智能合约中讨论。
处理
Corda 网络中的事务从不在全球范围内传输,而是在半私有网络中传输。它们只在与交易相关的参与者的子集之间共享。这与以太坊和比特币等传统区块链解决方案形成了鲜明对比,在这些解决方案中,所有交易都会向全球整个网络广播。事务被数字签名,并且消耗状态或创建新状态。
Corda 网络上的交易由以下要素组成:
- 输入引用:这是对交易将要消耗的状态的引用,并用作输入。
- 输出状态:这些是事务创建的新状态。
- Attachments :这是一个附加 ZIP 文件的散列列表。ZIP 文件可以包含与交易相关的代码和其他相关文档。文件本身不是事务的一部分,而是被单独传输和存储。
- Commands:command 表示关于交易的预期操作的信息,作为契约的参数。每个命令都有一个公钥列表,它代表签署交易所需的所有各方。
- 签名:表示交易需要的签名。所需的签名总数与命令的公钥数成正比。
- 类型:有两种交易类型,即普通或公证变更。公证人变更事务用于为州重新分配公证人。
- 时间戳:该字段表示交易发生的时间段。这些由公证机构核实和执行。此外,如果需要严格的计时,这在许多金融服务场景中是可取的,那么公证人应该与原子钟同步。
- 摘要:描述交易操作的文字描述。
地下室
金库在一个节点上运行,类似于比特币中的钱包概念。由于事务不是全局广播的,所以每个节点在其存储库中只有被认为与它们相关的那部分数据。Vaults 将其数据存储在标准关系数据库中,因此可以使用标准 SQL 进行查询。保管库可以包含分类帐数据和分类帐外数据,这意味着它也可以包含分类帐以外的部分数据。
coreapp
Corda 的核心模型由状态对象、事务和事务协议组成,当它们与契约代码、API、钱包插件和用户界面组件结合时,会导致构建一个 Corda 分布式应用 ( CorDapp )。
Corda 中的智能合约是使用 Kotlin 或 Java 编写的。代码是针对 JVM 的。
JVM 已经被稍微修改,以便获得 JVM 字节码执行的确定性结果。Corda 智能合同有以下三个主要组成部分:
- 定义验证逻辑以验证对状态对象的更改的可执行代码。
- 状态对象表示协定的当前状态,可以由事务使用,也可以由事务产生(创建)。
- 命令用于描述定义如何验证交易的操作和验证数据。
开发环境——Corda
Corda 的开发环境可以通过以下步骤轻松设置。所需软件包括以下内容:
- JDK 8 (8u131),可从http://www . Oracle . com/tech network/Java/javase/downloads/index . html获得。
- IntelliJ IDEA 社区版,可在https://www.jetbrains.com/idea/download免费获得。
- 独立于 H2 数据库平台的 ZIP,并可在http://www.h2database.com/html/download.html获得。
- Git,可在https://git-scm.com/downloads买到。
- 可用于 IntelliJ 的 Kotlin 语言,更多信息可在https://kotlinlang.org/找到。
Gradle 是用于构建 Corda 的另一个组件。在https://gradle.org有售。
一旦安装了所有这些工具,就可以开始智能合同开发了。CorDapps 可以利用在https://github.com/corda/cordapp-template提供的示例模板进行开发。
关于如何开发合同代码的详细文档可在https://docs.corda.net/获得。
可以使用以下命令从 GitHub 本地克隆 Corda:
$ git clone https://github.com/corda/corda.git
克隆成功后,您应该会看到类似以下内容的输出:
Cloning into 'corda'...
remote: Counting objects: 74695, done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 74695 (delta 17), reused 0 (delta 0), pack-reused 74591 Receiving objects: 100% (74695/74695), 51.27 MiB | 1.72 MiB/s, done. Resolving deltas: 100% (42863/42863), done.
Checking connectivity... done.
一旦存储库被克隆,就可以在 IntelliJ 中打开它进行进一步的开发。存储库中有多个可用的示例,如 bank of Corda、利率互换、演示和交易者演示。读者可以在corda
下的/samples
目录下找到它们,并且可以使用 IntelliJ IDEA IDE 来研究它们。
摘要
在本章中,我们已经介绍了 Hyperledger 项目。首先,讨论了 Hyperledger 项目背后的核心思想,并简要介绍了 Hyperledger 下的所有项目。详细讨论了三个主要的 Hyperledger 项目,即 Hyperledger Fabric、锯齿湖和 Corda。所有这些项目都在不断改进,预计在下一个版本中会有变化。然而,上述所有项目的核心概念预计将保持不变或仅略有变化。鼓励读者访问本章中提供的相关链接以查看最新更新。
很明显,这个领域正在发生很多事情,像 Linux 基金会的 Hyperledger 这样的项目在区块链技术的进步中发挥着举足轻重的作用。本章讨论的每个项目都有新颖的方法来解决各种行业面临的问题,区块链技术中的任何当前限制也正在得到解决,如可扩展性和隐私。预计 Hyperledger 项目将很快提出更多的项目,预计通过这种合作和开放的努力,区块链技术将取得巨大进步,并将使整个社区受益。
在下一章中,将介绍替代的区块链解决方案和平台。随着区块链技术的快速发展,吸引了大量的研究兴趣,最近出现了许多新项目。我们将在下一章讨论那些项目。