原文:
zh.annas-archive.org/md5/64e2728fdd6fa177d97883a45d7dec42
译者:飞龙
第十三章:Hyperledger
Hyperledger 不是一个区块链,而是一个由 Linux 基金会于 2015 年 12 月发起的项目,旨在推进区块链技术。这个项目是其成员的合作努力,旨在构建一个开源的分布式账本框架,可用于开发和实施跨行业的区块链应用和系统。主要关注点是开发和运行支持全球业务交易的平台。该项目还专注于提高区块链系统的可靠性和性能。
Hyperledger 旗下的项目经历了从提案到孵化再到转入活跃状态的各个阶段。项目也可能被弃用或处于生命周期结束状态,不再积极开发。要使项目能够进入孵化阶段,必须具有完全可工作的代码库以及活跃的开发人员社区。
Hyperledger 旗下的项目
Hyperledger 旗下有两类项目。第一类是 区块链项目,第二类是 支持这些区块链的相关工具或模块。
目前,Hyperledger 旗下有五个区块链框架项目:Fabric、Sawtooth Lake、Iroha、Burrow 和 Indy。在模块下,有 Hyperledger Cello、Hyperledger Composer、Hyperledger Explorer 和 Hyperledger Quilt。Hyperledger 项目目前拥有超过 200 个成员组织,非常活跃,有许多贡献者,并在全球范围内组织定期的见面会和讲座。
接下来简要介绍所有这些项目,之后我们将看到有关 Fabric 和 Sawtooth Lake 的设计、架构和实施的更多详细信息。
Fabric
Fabric 是由 IBM 和 DAH (Digital Asset Holdings) 提出的一个区块链项目。该区块链框架实现旨在为具有模块化架构的区块链解决方案的开发提供基础。它基于可插拔架构,各种组件,如共识引擎和成员服务,可以根据需要插入系统。它还利用容器技术,在隔离的容器化环境中运行智能合约。目前,它的状态是 活跃,是第一个从孵化阶段毕业到活跃状态的项目。
源代码可在 github.com/hyperledger/fabric
获得。
锯齿湖
Sawtooth Lake 是由英特尔于 2016 年 4 月提出的一个区块链项目,它具有一些关键创新,重点是将分类账与交易解耦,使用交易家族在多个业务领域灵活使用,并提供可插拔的共识机制。
解耦可以更精确地解释为通过使用称为事务族的新概念将事务与共识层解耦。不再单独将事务与分类帐耦合,而是使用事务族,这允许更灵活、更丰富的语义和业务逻辑的开放设计。事务遵循事务族中定义的模式和结构。
英特尔引入的一些创新元素包括一种名为PoET的新型共识算法,即Proof of Elapsed Time,它利用英特尔提供的受信执行环境(TEE)提供的英特尔软件保护扩展(Intel’s SGX)来提供安全和随机的领导者选举过程。它还支持有权限和无权限的设置。
该项目可在 github.com/hyperledger/sawtooth-core
上找到。
Iroha
Iroha 由 Soramitsu、Hitachi、NTT Data 和 Colu 在 2016 年 9 月贡献。Iroha 的目标是构建一个可重复使用的组件库,用户可以选择在自己的基于 Hyperledger 的分布式分类帐上运行。
Iroha 的主要目标是通过提供用 C++ 编写的重复使用的组件,重点放在移动开发上,来补充其他 Hyperledger 项目。该项目还提出了一种称为Sumeragi的新型共识算法,这是一种基于链的拜占庭容错共识算法。
Iroha 可在 github.com/hyperledger/iroha
上找到。
Iroha 已提出并正在研究各种库,包括但不限于数字签名库(ed25519)、SHA-3 哈希库、事务序列化库、P2P 库、API 服务器库、iOS 库、Android 库和 JavaScript 库。
Burrow
该项目目前处于孵化状态。Hyperledger Burrow 由 Monax 贡献,他们为企业开发区块链开发和部署平台。Hyperledger Burrow 引入了一个模块化的区块链平台和基于以太坊虚拟机(EVM)的智能合约执行环境。Burrow 使用权益证明、拜占庭容错 Tendermint 共识机制。因此,Burrow 提供了高吞吐量和交易最终性。
源代码可在 github.com/hyperledger/burrow
上找到。
Indy
该项目正在 Hyperledger 的孵化过程中。Indy 是为构建去中心化身份而开发的分布式分类帐。它提供了用于构建基于区块链的数字身份的工具、实用库和模块。这些身份可以跨多个区块链、域和应用程序使用。Indy 有自己的分布式分类帐,并使用冗余拜占庭容错(RBFT)进行共识。
源代码可在此处找到:github.com/hyperledger/indy-node
。
Explorer
该项目旨在为 Hyperledger Fabric 构建一个区块链浏览器,可用于查看和查询来自区块链的交易、区块和相关数据。它还提供网络信息和与链码交互的能力。
目前,还有其他几个项目正在 Hyperledger 的孵化中。这些项目旨在提供支持区块链网络的工具和实用程序。这些项目将在接下来的章节中介绍。
源代码可在此处找到:github.com/hyperledger/blockchain-explorer
。
Cello
Cello 的目标是允许轻松部署区块链。这将提供一种能力,允许区块链服务的“即服务”部署。目前,该项目处于孵化阶段。
Cello 的源代码可在此处找到:github.com/hyperledger/cello
。
Composer
该实用工具使区块链解决方案的开发变得更加容易,它允许使用业务语言描述业务流程,同时将低级智能合约开发细节抽象化。
Hyperledger composer 可在此处找到。
Quilt
该实用工具实现了跨不同分布式和非分布式账本网络的互操作性的 Interledger 协议。
Quilt 可在此处找到:github.com/hyperledger/quilt
。
目前,所有提及的项目都处于不同阶段的开发中。
随着越来越多的成员加入 Hyperledger 项目并为区块链技术的发展做出贡献,此列表预计会不断增长。现在,在下一节中,我们将看到 Hyperledger 的参考架构,该架构提供了可以遵循以构建新的 Hyperledger 项目的一般原则和设计理念。
超级账本协议
超级账本旨在构建由行业用例驱动的新区块链平台。由于社区对 Hyperledger 项目做出了许多贡献,因此 Hyperledger 区块链平台正在演变为一种用于业务交易的协议。Hyperledger 还正在演变为可用作参考的规范,以构建区块链平台,与早期仅解决特定行业或需求的区块链解决方案相比。
在接下来的章节中,我们将介绍一个由 Hyperledger 项目发布的参考架构。由于这项工作正在不断而严格地发展,因此其中可能会有一些变化,但核心服务预计将保持不变。
参考架构
Hyperledger 已经发表了一份白皮书,可在docs.google.com/document/d/1Z4M_qwILLRehPbVRUsJ3OF8Iir-gqS-ZYe7W-LE9gnE/edit#heading=h.m6iml6hqrnm2
获取。
本文提供了一个参考架构,可作为构建许可分布式分类账的指南。这个参考架构由形成业务区块链的各种组件组成。这些高级组件在以下这个参考架构图中显示:
参考架构 - 来源:Hyperledger 白皮书
从左边开始,可以看到我们有五个顶层组件,它们提供各种服务。我们将详细探讨所有这些组件。
首先是身份,它在成员服务下提供授权、识别和认证服务。
接着是策略组件,它提供策略服务。
随后是分类账和交易,其中包括分布式分类账、排序服务、网络协议,以及认可和验证服务。分类账只能通过区块链网络参与者之间的共识来更新。
最后,我们有智能合约层,它在 Hyperledger 中提供链码服务,并利用安全容器技术来托管智能合约。我们稍后将更详细地看到Hyperledger Fabric部分中的所有这些内容。
一般来说,从组件的角度来看,Hyperledger 包含了这里描述的各种元素:
-
共识层:这些服务负责促进区块链网络参与者之间的协议达成过程。共识是必须的,以确保交易的顺序和状态在区块链网络中得到验证和达成一致。
-
智能合约层:这些服务负责根据用户的需求实现业务逻辑。交易是基于区块链上的智能合约中定义的逻辑来处理的。
-
通信层:这一层负责在区块链网络中的节点之间进行消息传输和交换。
-
安全和加密层:这些服务负责提供能力,允许使用各种加密算法或模块来提供隐私、保密和不可抵赖的服务。
-
数据存储:这一层提供了使用不同数据存储来存储分类账状态的能力。这意味着数据存储也是可插拔的,并允许使用任何数据库后端。
-
策略服务:这组服务提供管理区块链网络所需的不同策略的能力。这包括认可策略和共识策略。
-
APIs 和 SDKs:该层允许客户端和应用程序与区块链进行交互。SDK 用于提供机制来部署和执行链码,查询区块并监视区块链上的事件。
区块链服务有一定的要求。在下一节中,我们将讨论 Hyperledger Fabric 的设计目标。
Hyperledger Fabric 的需求和设计目标
区块链服务有一定的要求。参考架构是由 Hyperledger 项目的参与者提出的需求和要求驱动的,并在研究行业用例后进行了讨论。从对工业用例的研究中推导出了几类需求,这些需求将在以下部分进行讨论。
模块化方法
Hyperledger 的主要要求是模块化结构。预计作为跨行业面料(区块链),它将在许多业务场景中使用。因此,与存储、策略、链码、访问控制、共识等其他区块链服务相关的功能应该是模块化和可插拔的。规范建议模块应该是即插即用的,用户应该能够轻松地移除和添加满足业务需求的不同模块。
隐私和保密性
此需求是最关键的因素之一。传统的区块链是无许可的,而在 Hyperledger Fabric 这样的许可模型中,网络上的交易对于只有被允许查看的人可见非常重要。
在业务区块链中,交易和合同的隐私和保密性至关重要。因此,Hyperledger 的愿景是支持全面的加密协议和算法。我们在第五章和第六章中讨论了密码学,对称密码学和公钥密码学。
预计用户将能够根据其业务需求选择适当的模块。例如,如果业务区块链只需要在已经信任的各方之间运行并执行非常基本的业务操作,则可能无需为保密性和隐私提供先进的加密支持。因此,用户应该能够移除该功能(模块)或将其替换为更合适的模块以满足其需求。
同样,如果用户需要运行跨行业区块链,则保密性和隐私可能非常重要。在这种情况下,用户应该能够将先进的加密和访问控制机制(模块)插入到区块链(面料)中,甚至可以允许使用安全模块的硬件(HSMs)。
此外,区块链应能够处理复杂的加密算法,而不会影响性能。除了上述场景外,由于业务中的监管要求,还应该能够按照监管和合规要求的隐私和保密政策来执行。
可扩展性
这是另一个重要的需求,一旦满足,将允许合理的交易吞吐量,这将足以满足所有业务需求,也足够为大量用户提供服务。
确定性交易
这是任何区块链的核心需求,因为如果交易无论何时执行产生相同的结果,无论交易由谁在何处执行,共识都是不可能实现的。因此,在任何区块链网络中,确定性交易成为关键要求。我们在第四章 智能合同 中讨论了这些概念。
身份
为了提供隐私和保密服务,还需要一个灵活的 PKI 模型来处理访问控制功能。加密机制的强度和类型也预计会根据用户的需求和要求而变化。在某些场景中,可能需要用户隐藏他们的身份,因此,期望 Hyperledger 提供这一功能。
审计性
审计性是 Hyperledger Fabric 的另一个需求。预期保留所有身份、相关操作和任何更改的不可变审计跟踪。
互操作性
目前有许多可用的区块链平台,但它们之间无法进行通信,这可能限制了区块链全球业务生态系统的发展。预计许多区块链网络将在业务世界中为特定需求而运行,但它们能够相互通信非常重要。应该有一套所有区块链都可以遵循的共同标准,以便允许不同分类账之间的通信。预计将开发一个协议,允许在多个链之间交换信息。
可移植性
可移植性要求关注的是在不需要在代码级别更改任何内容的情况下能够在多个平台和环境中运行。预期 Hyperledger Fabric 在基础设施级别以及代码、库和 API 级别都是可移植的,这样可以支持在各种 Hyperledger 实现中进行统一开发。
丰富的数据查询
区块链网络应允许在网络上运行丰富的查询。这可以用于使用传统查询语言查询总账的当前状态,从而实现更广泛的采用和使用便利。
所有上述点描述了开发符合 Hyperledger 设计理念的区块链解决方案所需满足的要求。在接下来的部分中,我们将看一下 Hyperledger Fabric,这是首个在 Hyperledger 下获得活跃状态的项目。
Fabric
要了解 Hyperledger 项目中正在开发的各种项目,首先需要了解 Hyperledger 的基础知识是很重要的。在向读者介绍更深入的材料之前,需要对一些特定于 Hyperledger 的术语进行一些澄清。
首先,有一个“fabric”的概念。Fabric 可以定义为提供基础层的组件集合,可用于交付区块链网络。Fabric 网络有各种类型和功能,但所有 fabric 都共享诸如不可变性和共识驱动等共同属性。一些 fabric 可以提供一种模块化方法来构建区块链网络。在这种情况下,区块链网络可以具有多个可插拔模块,用于在网络上执行各种功能。
例如,共识算法可以是区块链网络中的可插拔模块,根据网络的要求,可以选择适当的共识算法并将其插入网络中。这些模块可以基于 fabric 的某些特定规范,并且可以包括 API、访问控制和各种其他组件。
Fabric 也可以设计为私有或公开的,并且可以允许创建多个业务网络。例如,比特币就是在其 fabric(区块链网络)上运行的应用程序。正如前文第一章讨论的那样,区块链 101,区块链可以是许可的或无许可的。然而,Hyperledger Fabric 的目标是开发一个许可的分布式分类账。
Fabric 也是 IBM 向 Hyperledger 基金会提供的代码贡献的名称,正式称为 Hyperledger Fabric。IBM 还通过其IBM 云服务提供区块链即服务(IBM Blockchain)。
它可以在www.ibm.com/cloud/
找到。
现在让我们详细看一下 Hyperledger Fabric。
Hyperledger Fabric
该框架最初是由 IBM 和 Digital Assets 对 Hyperledger 项目的贡献。这一贡献旨在实现一种模块化、开放和灵活的方法,用于构建区块链网络。
Fabric 中的各种功能都是可插拔的,并且它还允许使用任何语言来开发智能合约。这种功能是可能的,因为它基于容器技术(Docker),可以托管任何语言。
Chaincode 在安全容器中进行沙盒化处理,其中包括安全操作系统、chaincode 语言、运行时环境以及用于 Go、Java 和 Node.js 的 SDK。如果需要,将来还可以支持其他语言,但需要进行一些开发工作。智能合约在 Fabric 中被称为 chaincode。与以太坊中的领域特定语言或比特币中的有限脚本语言相比,这种能力是一个引人注目的特性。这是一个有权限的网络,旨在解决可扩展性、隐私和机密性等问题。其背后的基本思想是模块化,这将允许在业务区块链的设计和实现中灵活性。这样可以实现可扩展性、隐私和其他所需特性,并根据要求对其进行微调。
Fabric 中的交易对于普通用户是私有的、保密的和匿名的,但它们仍然可以被授权的审计员追踪和与用户关联。作为一个有权限的网络,所有参与者都需要在成员服务中注册才能访问区块链网络。此分类帐还提供了审计功能,以满足用户所需的监管和合规性需求。
成员服务
这些服务用于为 Fabric 网络的用户提供访问控制功能。以下列出了成员服务执行的功能:
-
用户身份验证
-
用户注册
-
根据用户角色分配适当的权限
成员服务利用证书机构来支持身份管理和授权操作。这个 CA 可以是内部的(Fabric CA),它是 Hyperledger Fabric 中的默认接口,或者组织可以选择使用外部证书机构。Fabric CA 发布注册证书(E-Certs),这些证书由注册证书机构(E-CA)生成。一旦对等体被授予身份,它们就被允许加入区块链网络。还有临时证书称为 T-Certs,用于一次性交易。
所有对等体和应用程序都使用证书机构进行识别。证书机构提供认证服务。MSP 还可以与现有的身份服务(如 LDAP)进行接口。
区块链服务
区块链服务是 Hyperledger Fabric 的核心。此类别中的组件如下。
共识服务
共识服务负责提供与共识机制的接口。这充当了一个可插拔的模块,接收来自其他 Hyperledger 实体的交易,并根据选择的机制类型执行它们的标准。
Hyperledger V1 中的共识是作为一个称为订购者的节点实现的,负责将交易按顺序组成一个区块。订购者不持有智能合约或账本。共识是可插拔的,目前 Hyperledger Fabric 中有两种类型的排序服务可用:
-
SOLO:这是一个基本的排序服务,用于开发和测试目的。
-
Kafka:这是 Apache Kafka 的一种实现,提供排序服务。需要注意的是,目前 Kafka 只提供了崩溃容错性,但并没有提供拜占庭容错性。这在准许网络中是可以接受的,因为恶意行为的可能性几乎为零。
除了这些机制之外,基于简单拜占庭容错(SBFT)的机制也正在开发中,将在后续版本的 Hyperledger Fabric 中提供。
分布式账本
区块链和世界状态是分布式账本的两个主要元素。区块链简单来说是一个由区块构成的加密链接列表(如第一章介绍的,区块链 101),而世界状态是一个键值数据库。这个数据库被智能合约用来在执行过程中存储相关状态。区块链由包含交易的区块组成。这些交易包含链码,运行这些交易可以导致更新世界状态。每个节点将世界状态保存在硬盘上,使用的是 LevelDB 或 CouchDB,具体取决于实现。由于 Fabric 允许可插拔的数据存储,你可以选择任何数据存储方式进行存储。
区块由三个主要组件组成,称为区块头、交易(数据)和区块元数据。
以下图示展示了 Hyperledger Fabric 1.0 中典型区块的相关字段:
区块结构
区块头 包括三个字段,即编号、前一个哈希和数据哈希。
交易 由多个字段组成,例如交易类型、版本、时间戳、通道 ID、交易 ID、时代、有效载荷可见性、链码路径、链码名称、链码版本、创建者身份、签名、链码类型、输入、超时、背书者身份和签名、建议哈希、链码事件、响应状态、命名空间、读集、写集、起始键、结束键、读取列表和 Merkle 树查询摘要。
区块元数据 包括创建者身份、相关签名、最后配置区块编号、每个包含在区块中的交易的标志,以及最后持久化的偏移量(kafka)。
点对点协议
Hyperledger Fabric 中的 P2P 协议是使用 Google RPC(gRPC)构建的。它使用协议缓冲区来定义消息的结构。
节点之间传递消息以执行各种功能。Hyperledger Fabric 中有四种主要类型的消息:发现、交易、同步 和 共识。发现消息在启动时在节点之间交换,以发现网络上的其他对等节点。交易消息用于部署、调用和查询交易,共识消息在共识期间交换。同步消息在节点之间传递以保持区块链在所有节点上同步更新。
分类账存储
为了保存分类账的状态,默认情况下使用 LevelDB,该数据库在每个对等节点上都可用。另一种选择是使用 CouchDB,它提供了运行丰富查询的能力。
Chaincode 服务
这些服务允许创建用于执行链码的安全容器。此类别中的组件如下:
-
安全容器:Chaincode 部署在提供锁定的沙箱环境以供智能合约执行的 Docker 容器中。目前,Golang 被支持为主要的智能合约语言,但如果需要,可以添加和启用任何其他主流语言。
-
安全注册表: 这提供了包含智能合约的所有映像的记录。
事件
区块链上的事件可以由背书者和智能合约触发。外部应用程序可以通过事件适配器监听这些事件,并在需要时做出反应。
API 和 CLI
应用程序编程接口通过公开各种 REST API 提供了与织物的接口。此外,还提供了提供一组 REST API 子集并允许快速测试和与区块链有限交互的命令行界面。
组成部分的织物
有各种各样的组件可以成为 Hyperledger Fabric 区块链的一部分。这些组件包括但不限于分类账、链码、共识机制、访问控制、事件、系统监控和管理、钱包以及系统集成组件。
对等节点
对等节点参与维护分布式分类账的状态。它们还持有分布式分类账的本地副本。对等节点通过八卦协议进行通信。在 Hyperledger Fabric 网络中有三种类型的对等节点:
-
背书对等节点 或背书者模拟交易执行并生成读写集。读取是模拟交易从分类账中读取数据,写入是在交易执行和提交到分类账时将要对分类账进行的更新集。背书者执行和背书交易。值得注意的是,背书者也是提交者。背书策略是用链码实现的,并指定交易背书的规则。
-
提交对等方或提交者接收由背书者背书的交易,对其进行验证,然后使用读写集更新分类帐。提交者验证背书者生成的读写集以及交易验证。
-
提交者是尚未实现的第三种类型的对等方。它在开发路线图上,并将被实现。
订购节点
订购节点从背书者那里接收交易以及读写集,将它们按顺序排列,并将其发送给提交对等方。提交对等方随后执行验证并将其提交到分类帐。
所有对等方都使用成员服务发放的证书。
客户端
客户端是利用 API 与 Hyperledger Fabric 进行交互并提出交易的软件。
通道
通道允许网络上不同方之间的保密交易流动。它们允许在相同的区块链网络中使用不同的区块链。通道只允许通道成员查看与他们相关的交易,网络的所有其他成员将无法查看这些交易。
世界状态数据库
世界状态反映了区块链上所有已提交的交易。这基本上是一个键值存储,随着交易和链码执行的结果而更新。为此,通常使用 LevelDB 或 CouchDB。LevelDB 是一个键值存储,而 CouchDB 将数据存储为 JSON 对象,允许对数据库运行丰富的查询。
交易
交易消息可分为两种类型:部署交易和调用交易。前者用于将新的链码部署到分类帐上,而后者用于从智能合约调用函数。交易可以是公开的或保密的。公开交易对所有参与者开放并可用,而保密交易仅在对其参与者开放的频道中可见。
成员服务提供商(MSP)
MSP 是用于管理区块链网络上身份的模块化组件。此提供程序用于验证想要加入区块链网络的客户端的身份。我们在本章前面已经详细讨论了证书颁发机构。CA 在 MSP 中用于提供身份验证和绑定服务。
智能合约
我们在第四章中详细讨论了智能合约,智能合约。在 Hyperledger Fabric 中,实现了相同的智能合约概念,但称为链代码而不是智能合约。它们包含条件和参数以执行交易并更新分类帐。链代码通常用 Golang 和 Java 编写。
加密服务提供商
顾名思义,这是一个提供加密算法和标准以供区块链网络使用的服务。此服务提供密钥管理、签名和验证操作以及加密解密机制。此服务与成员服务一起使用,为区块链的元素(如认可者、客户端和其他节点和对等体)提供加密操作支持。
在介绍了 Hyperledger Fabric 的这个组件之后,在下一节中,我们将看到在 Hyperledger 网络上运行的应用程序是什么样子的。
区块链上的应用程序
Fabric 上的典型应用程序通常仅由一个用户界面组成,通常使用 JavaScript/HTML 编写,该用户界面通过 API 层与存储在账本上的后端链码(智能合约)进行交互:
典型的 Fabric 应用程序
Hyperledger 提供了各种 API 和命令行接口,以实现与账本的交互。这些 API 包括身份、交易、链码、账本、网络、存储和事件接口。
链码实现
链码通常是用 Golang 或 Java 编写的。链码可以是公共的(在网络上对所有人可见)、机密的或受访控制的。这些代码文件充当了用户可以通过 API 与之交互的智能合约。用户可以调用链码中的函数来导致状态更改,从而更新账本。
还有一些仅用于查询账本且不会导致任何状态更改的函数。链码实现是通过首先在代码中创建链码 shim 接口来完成的。Shim 提供了用于访问链码的状态变量和事务上下文的 API。它可以是 Java 或 Golang 代码。
为了实现链码,需要以下四个函数:
-
Init()
: 当链码部署到账本上时,将调用此函数。这会初始化链码并导致状态更改,相应地更新账本。 -
Invoke()
: 当执行合约时使用此函数。它将一个函数名称和参数数组作为参数。此函数会导致状态更改并写入账本。 -
Query()
: 此函数用于查询已部署链码的当前状态。此函数不会对账本进行任何更改。 -
4()
: 当对等体部署自己的链码副本时执行此函数。使用此函数向对等体注册链码。
以下图示了 Hyperledger Fabric 的一般概述,请注意,顶部的对等体集群包括各种类型的节点,如认可者、提交者、Orderers 等。
Hyperledger Fabric 的高层概述
上述图表显示,位于顶部中间的对等体相互通信,每个节点都有区块链的副本。在图像的右上角,显示了成员服务,通过证书颁发机构(CA)对网络上的对等方进行验证和认证。在图像的底部,放大了区块链的视图,现有系统可以为区块链产生事件,也可以监听区块链的事件,然后可以选择性地触发操作。在图像的右下方,显示了用户与应用程序的交互,该应用程序通过invoice()
方法与智能合约交互,并且智能合约可以查询或更新区块链的状态。
应用程序模型
超级账本 Fabric 的任何区块链应用程序都遵循 MVC-B 架构。这是基于流行的 MVC 设计模式。该模型中的组件包括模型、视图、控制和区块链:
-
视图逻辑:与用户界面有关。可以是桌面、Web 应用程序或移动前端。
-
控制逻辑:这是用户界面、数据模型和 API 之间的协调者。
-
数据模型:该模型用于管理链下数据。
-
区块链逻辑:这用于通过控制器管理区块链和通过交易管理数据模型。
IBM 云服务提供区块链示例应用,作为其区块链即服务的一部分。该服务可在www.ibm.com/blockchain/platform/
获取。该服务允许用户在易于使用的环境中创建自己的区块链网络。
超级账本 Fabric 中的共识
超级账本 Fabric 中的共识机制包括三个步骤:
-
交易认可:这个过程通过模拟交易执行过程对交易进行认可。
-
排序:这是由订购者集群提供的服务,它接受认可的交易并决定交易将被写入分类帐的顺序。
-
验证和承诺:这个过程由提交对等方执行,首先验证来自订购者的交易,然后将该交易提交到分类帐上。
这些步骤在下面的流程图中显示:
共识流程
超级账本 Fabric 中的交易生命周期
在超级账本 Fabric 中,交易流程涉及几个步骤。这些步骤在下面的图表中显示如下
过程的快速概述可以在下面的图表中看到:
交易生命周期
以下是详细描述的步骤:
-
客户端提出交易建议。这是第一步,客户端提出交易并将其发送到分布式分类帐网络上的背书节点。所有客户端在提出交易之前都需要通过成员服务进行注册。
-
背书者模拟交易,生成读写(RW)集。这是通过执行链码来实现的,但是不是更新分类帐,而是仅创建一个读写集,其中包含对分类帐的任何读取或更新。
-
背书的交易发送回应用程序。
-
应用程序将背书的交易和读写(RW)集提交给排序服务。
-
排序服务将所有背书交易和读写集按照通道 ID 排序,组装成一个区块。
-
排序服务将组装好的区块广播给所有提交节点。
-
提交节点验证交易。
-
提交节点更新分类帐。
-
最后,提交节点向客户端/应用程序发送交易成功或失败的通知。
以下图表代表了上述步骤和超级账本架构从交易流程的角度:
交易流程架构
如前图所示,第一步是提出交易,客户端通过 SDK 执行此操作。在此之前,假设所有客户端和节点都已在成员服务提供商那里注册。
关于这个主题,我们对超级账本(Hyperledger Fabric)的介绍已经完成。在下一节中,我们将看到另一个名为 Sawtooth Lake 的超级账本项目。
Sawtooth Lake
Sawtooth Lake 可以在受控和非受控模式下运行。它是一个分布式账本,提出了两个新颖的概念:第一个是介绍了一种称为Proof of Elapsed Time(PoET)的新型共识算法;第二个是事务家族的概念。
这些新提议的描述在以下部分给出。
PoET
PoET 是一种新颖的共识算法,允许根据节点在提出区块之前等待的时间随机选择节点。这个概念与其他基于领导者选举和抽奖的工作证明算法相反,例如比特币中使用的 PoW,其中使用了大量的电力和计算资源来选举区块提议者;例如在比特币的情况下。 PoET 是一种工作证明算法,但是,它不是使用计算机资源,而是使用可信计算模型来提供一种满足工作证明要求的机制。 PoET 利用 Intel 的 SGX 架构(软件保护扩展)提供受信任的执行环境(TEE)以确保进程的随机性和密码学安全性。
应该注意的是,Sawtooth Lake 的当前实现不需要真实的硬件 SGX 基于 TEE,因为它仅为实验目的模拟,并且因此不应在生产环境中使用。 PoET 的基本理念是通过随机等待的方式来提供领导者选举的机制,以便被选举为提议新交易的领导者。
但是,PoET 存在一个被 Ittay Eyal 强调的限制。 这个限制被称为陈旧芯片问题。
研究论文可在eprint.iacr.org/2017/179.pdf
上获得。
这种限制导致硬件浪费,可能导致资源的浪费。 也存在黑客攻击芯片硬件的可能性,这可能导致系统妥协和给矿工不当的激励。
交易家族
传统的智能合约范式提供了一个基于通用指令集的解决方案,适用于所有领域。 例如,在以太坊的情况下,已经开发了一组用于 EVM 的操作码,可以用来构建智能合约以满足任何行业的任何类型需求。
虽然这个模型有其优点,但显然这种方法不太安全,因为它为账本提供了一个单一接口,使用了一个强大且富有表现力的语言,这可能为恶意代码提供了更大的攻击面。 这种复杂性和通用虚拟机范式导致了一些漏洞的发现和最近黑客攻击的利用。 一个最近的例子是DAO hack和进一步的拒绝服务(DoS)攻击,这些攻击利用了一些 EVM 操作码的限制。 DAO hack 在第四章“智能合约”中进行了讨论。
下图中显示的模型描述了传统的智能合约模型,其中使用了通用虚拟机提供了所有领域的区块链接口:
传统的智能合约范式
为解决这个问题,Sawtooth Lake 提出了交易族的概念。交易族通过将逻辑层分解为特定领域的一组规则和一个组合层来创建。关键思想是业务逻辑嵌入在交易族中,从而提供了一种更安全、更强大的构建智能合约的方式。交易族包含特定领域的规则和另一层,允许为该领域创建交易。另一种看待它的方式是,交易族是实施特定领域逻辑层的数据模型和交易语言的组合。数据模型代表区块链(分类帐)的当前状态,而交易语言修改了分类帐的状态。预计用户将根据其业务需求构建自己的交易族。
以下图表表示了该模型,其中每个特定领域,如金融服务、数字版权管理(DRM)、供应链和医疗行业,都有自己的逻辑层,包括特定于该领域的操作和服务。这使逻辑层同时具有限制性和强大性。交易族确保只有与所需领域相关的操作存在于控制逻辑中,从而消除了执行不必要的、任意的和潜在有害的操作的可能性:
Sawtooth(交易族)智能合约范式
英特尔为 Sawtooth 提供了三个交易族:端点注册表、Integerkey 和 MarketPlace。
-
端点注册表用于注册分类帐服务
-
Integerkey用于测试已部署的分类帐
-
MarketPlace用于销售、购买和交易操作和服务
Sawtooth_bond已开发为证明概念,演示了债券交易平台。
可在github.com/hyperledger/sawtooth-core/tree/master/extensions/bond
找到。
Sawtooth 中的共识
Sawtooth 有两种基于网络选择的共识机制。正如之前讨论的那样,PoET 是一种基于可信执行环境的抽奖功能,根据节点等待区块提案的时间随机选举领袖。
还有一种名为quorum voting的共识类型,这是由 Ripple 和 Stellar 构建的共识协议的一种改编。该共识算法允许即时的交易最终性,通常在获准网络中是可取的。
开发环境 - Sawtooth Lake
本节将简要介绍如何为 Sawtooth Lake 设置开发环境。设置开发环境需要满足一些先决条件。
本部分中的示例假定正在运行 Ubuntu 系统并具有以下内容:
-
至少版本为 1.9.0 的Vagrant可在https😕/www.vagrantup.com/downloads.html。
-
VirtualBox,至少是 5.0.10 r104061,可在https😕/www.virtualbox.org/wiki/Downloads.
一旦两个前提条件都成功下载并安装,下一步是克隆存储库。
$ git clone https://github.com/IntelLedger/sawtooth-core.git
这将产生类似以下屏幕截图所示的输出:
GitHub Sawtooth 克隆
一旦 Sawtooth 正确克隆,下一步是启动环境。首先,运行以下命令将目录更改为正确的位置,然后启动 vagrant 虚拟机:
$ cd sawtooth-core/tools
$ vagrant up
这将产生类似以下屏幕截图的输出:
vagrant up 命令
如果在任何时候需要停止 vagrant,则可以使用以下命令:
$ vagrant halt
或者:
$ vagrant destroy
halt
将停止 vagrant 虚拟机,而destroy
将停止并删除 vagrant 虚拟机。
最后,可以使用以下命令启动事务验证器。首先ssh
进入 vagrant Sawtooth 虚拟机:
$ vagrant ssh
当出现 vagrant 提示时,运行以下命令。首先使用以下命令构建 Sawtooth Lake 核心:
$ /project/sawtooth-core/bin/build_all
当构建成功完成时,为了运行事务验证器,请执行以下命令:
$ /project/sawtooth-core/docs/source/tutorial/genesis.sh
这将创建创世区块并清除任何现有的数据文件和密钥。此命令应显示类似以下屏幕截图的输出:
创世区块和密钥生成
下一步是运行交易验证器,并按照如下更改目录:
$ 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
这完成了我们对 Sawtooth 的基本介绍。上面显示的示例也相当基本,但演示了 Sawtooth Lake 的工作原理。
Sawtooth Lake 也在不断发展,因此建议读者留意intelledger.github.io/
上可用的文档,以了解最新的发展。
这里有一个非常好的在线页面,提供了官方的 Sawtooth Lake 示例。该页面可在sawtooth.hyperledger.org/examples/
访问。鼓励读者访问此页面,并探索这些样本项目。
现在在下一节中,我们将看到对 Corda 的介绍。需要注意的是,Corda 还不是 Hyperledger 的官方项目;但是,它可能很快就成为成员。因此,目前正在在 Hyperledger 下讨论这个问题,但将来可能不会成为 Hyperledger 的一部分。
Corda
根据定义,Corda 不是区块链,因为它不包含打包交易的区块,但它属于分布式分类账。它提供了区块链能提供的所有好处。传统的区块链解决方案,如前所述,具有将交易捆绑在一起形成区块的概念,每个区块都与其父区块在密码学上链接在一起,从而提供不可变的交易记录。Corda 与此不同。
Corda 是完全从头开始设计的,采用了一种新的模型来提供所有区块链的优点,但没有传统的区块链。它纯粹是为金融行业而开发的,以解决每个组织管理自己的分类账的问题,因此它们对真相有自己的看法,这导致矛盾和运营风险。此外,数据也在每个组织中重复,这导致管理个别基础设施的成本和复杂性增加。这些是 Corda 旨在通过构建分布式数据库平台解决的金融行业中的问题类型。
Corda 源代码可在 github.com/corda/corda
获取。它是用一种称为 Kotlin 的语言编写的,这是一种针对Java 虚拟机(JVM)的静态类型语言。
架构
Corda 平台的主要组件包括状态对象、合同代码、法律文本、交易、共识和流程。我们现在将对它们进行更详细的探讨。
状态对象
状态对象代表表示财务协议的最小数据单元。它们是作为交易执行的结果而创建或删除的。它们参考合同代码和法律文本。法律文本是可选的,并为合同提供法律约束。但是,合同代码是强制性的,以便管理对象的状态。根据在合同代码中定义的业务逻辑,它是必需的,以为节点提供状态转换机制。状态对象包含表示对象当前状态的数据结构。状态对象可以是当前的(活动的)或历史的(不再有效)。
举个例子,在下图中,状态对象代表对象的当前状态。在这种情况下,它是甲方和乙方之间的简单模拟协议,其中甲方 ABC已支付乙方 XYZ 1,000 英镑。这代表了对象的当前状态;然而,引用的合同代码可以通过交易改变状态。状态对象可以被看作是一个状态机,交易消耗它们以创建更新的状态对象。
一个状态对象示例
交易
交易用于在不同状态之间执行过渡。例如,前面图表中显示的状态对象是作为交易的结果创建的。Corda 使用基于比特币的 UTXO 模型进行交易处理。与比特币类似,交易的状态转换概念相同。与比特币类似,交易可以有零个、单个或多个输入,以及单个或多个输出。所有交易都经过数字签名。
此外,Corda 没有挖矿的概念,因为它不使用区块来安排区块链中的事务。而是使用公证服务来提供事务的时间顺序。在 Corda 中,可以使用 JVM 字节码开发新的事务类型,这使得它非常灵活和强大。
共识
Corda 中的共识模型非常简单,基于稍后在本章讨论的公证服务。一般的想法是通过公证服务对事务的唯一性进行评估,如果它们是唯一的(即唯一的事务输入),则由共识服务签署为有效。在 Corda 网络上可以运行单个或多个集群化的公证服务。公证人可以使用各种共识算法,如 PBFT 或 Raft,来达成共识。
Corda 中关于共识的两个主要概念是状态有效性共识和状态唯一性共识。第一个概念关注事务的验证,确保所有必需的签名都可用且状态适当。第二个概念是一种检测双重支付攻击的手段,确保事务尚未被花费且是唯一的。
流程
Corda 中的流程是一种新颖的概念,允许开发分散式工作流。Corda 网络上的所有通信都由这些流程处理。这些是可以使用代码定义任何复杂性的任何金融流动的事务构建协议。流程作为异步状态机运行,并与其他节点和用户交互。在执行过程中,它们可以根据需要暂停或恢复。
组件
Corda 网络有多个组件。所有这些组件将在接下来的部分中描述。
节点
Corda 网络中的节点采用了无信任模型,并由不同的组织运行。节点作为经过身份验证的点对点网络的一部分运行。节点使用Advanced Message Queuing Protocol (AMQP)直接相互通信,这是一个经过批准的国际标准(ISO/IEC 19464),确保不同节点之间的消息安全传输。在 Corda 中,AMQP 在Transport Layer Security (TLS) 上运行,因此确保节点之间传输的数据的隐私和完整性。
节点还利用本地关系数据库进行存储。网络上的消息以紧凑的二进制格式编码。它们通过Apache Artemis message broker (Active MQ)进行交付和管理。节点可以作为网络映射服务、公证人、Oracle 或普通节点。下图展示了两个节点之间通信的高级视图:
Corda 网络中两个节点的通信
在前图中,节点 1通过 TLS 通信频道使用 AMQP 协议与节点 2进行通信,并且节点具有用于存储的本地关系数据库。
许可服务
许可服务用于提供 TLS 证书以保障安全。为了参与网络,参与者需要有由根证书颁发机构签发的身份证明。在网络上,身份必须是唯一的,并且许可服务用于签署这些身份。用于识别参与者的命名约定基于 X.500 标准。这确保了名称的唯一性。
网络地图服务
此服务用于以文档形式提供网络地图,其中包含网络上所有节点的信息。该服务发布 IP 地址、身份证书以及节点提供的服务列表。所有节点在首次启动时通过注册到此服务来宣布自己的存在,当节点收到连接请求时,首先在网络地图上检查请求节点的存在。换句话说,该服务解析参与者的身份到物理节点。
公证服务
在传统区块链中,挖矿用于确定包含交易的区块的顺序。在 Corda 中,公证服务用于提供交易排序和时间戳服务。网络中可以有多个公证人,并且它们由复合公钥标识。公证人可以使用不同的共识算法,如 BFT 或 Raft,具体取决于应用程序的要求。公证服务签署交易以指示交易的有效性和最终性,然后将其持久化到数据库中。
为了性能原因,公证人可以以负载平衡配置运行,以在节点之间分散负载;为了减少延迟,建议节点在物理上距离交易参与者更近。
Oracle 服务
Oracle 服务要么签署包含事实的交易(如果它是真实的),要么可以自己提供事实数据。它们允许真实世界的信息输入到分布式分类帐中。关于 Oracle 的讨论可以在第四章中找到,即智能合约。
交易
Corda 网络中的交易永远不会全局传输,而是在半私有网络中进行。它们只在与交易相关的参与者子集之间共享。这与传统的区块链解决方案(如以太坊和比特币)形成对比,其所有交易都会全局广播给整个网络。交易经过数字签名,要么消耗状态,要么创建新状态。
Corda 网络上的交易由以下元素组成:
-
输入参考: 这是交易将要使用和消耗的状态的参考。
-
输出状态: 这些是交易创建的新状态。
-
附件:这是附加的 ZIP 文件哈希列表。ZIP 文件可以包含与交易相关的代码和其他相关文档。文件本身不作为交易的一部分,而是单独传输和存储。
-
命令:命令代表交易的预期操作信息,作为合同的参数。每个命令都有一个公钥列表,表示需要对交易进行签名的所有方。
-
签名:这表示交易所需的签名。所需签名总数与命令的公钥数量成正比。
-
类型:交易有两种类型,即普通或变更公证。变更公证交易用于重新分配状态的公证。
-
时间戳:此字段表示交易发生的时间段。这些由公证服务进行验证和强制执行。此外,如果需要严格的时间,这在许多金融服务方案中是可取的,公证应与原子钟同步。
-
摘要:这是描述交易操作的文本描述。
保险库
保险库在节点上运行,类似于比特币中钱包的概念。由于交易不会全球广播,因此每个节点的保险库只会包含对他们而言相关的数据部分。保险库将其数据存储在标准关系数据库中,因此可以使用标准 SQL 进行查询。保险库可以包含在账本上和账本之外的数据,这意味着它也可以具有一些不在账本上的数据部分。
CorDapp
Corda 的核心模型由状态对象、交易和交易协议组成,当与合同代码、API、钱包插件和用户界面组件结合使用时,结果是构建了一个Corda 分布式应用程序(CorDapp)。
Corda 中的智能合约是使用 Kotlin 或 Java 编写的。代码面向 JVM。
为了实现 JVM 字节码执行结果的确定性,对 JVM 进行了轻微修改。 Corda 智能合约的三个主要组成部分如下:
-
定义验证逻辑以验证对状态对象的更改的可执行代码。
-
状态对象表示合同的当前状态,可以由交易消耗,或者由交易生成(创建)。
-
命令用于描述操作和验证数据,以定义如何验证交易的方式。
开发环境 - Corda
使用以下步骤可以轻松设置 Corda 的开发环境。所需软件包括以下内容:
-
JDK 8(8u131),可在
www.oracle.com/technetwork/java/javase/downloads/index.html
获取。 -
IntelliJ IDEA Community 版本,免费可在
www.jetbrains.com/idea/download
.获取。 -
H2 数据库平台独立的 ZIP,在
www.h2database.com/html/download.html
获取。 -
Git,可在
git-scm.com/downloads
获取。 -
Kotlin 语言,可在 IntelliJ 中使用,更多信息请参见
kotlinlang.org/
。
Gradle 是用于构建 Corda 的另一个组件。它可以在gradle.org
获取。
安装了所有这些工具后,可以开始智能合约开发。可以使用github.com/corda/cordapp-template
中提供的示例模板来开发 CorDapps。
有关如何开发合同代码的详细文档可在docs.corda.net/
获取。
Corda 可以使用以下命令从 GitHub 本地克隆:
$ 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 中进一步开发。存储库中提供了多个示例,如 Corda 银行、利率互换、演示和交易者演示。读者可以在/samples
目录下的corda
下找到它们,并可使用 IntelliJ IDEA IDE 进行探索。
摘要
在本章中,我们介绍了 Hyperledger 项目的概述。首先,讨论了 Hyperledger 项目背后的核心思想,并提供了 Hyperledger 下所有项目的简要介绍。详细讨论了三个主要的 Hyperledger 项目,即 Hyperledger Fabric、Sawtooth Lake 和 Corda。所有这些项目都在不断改进,预计下一个版本会有变化。然而,上述所有项目的核心概念预计都将保持不变,或者只会轻微变化。鼓励读者访问章节中提供的相关链接,以了解最新动态。
显然,这个领域正在发生很多事情,像来自 Linux 基金会的 Hyperledger 项目发挥着推动区块链技术发展的关键作用。本章讨论的每个项目都对解决各行业面临的问题有新颖的方法,还在解决区块链技术的当前限制,如可扩展性和隐私等。预计很快将有更多项目提议给 Hyperledger 项目,预计随着这种合作和开放努力,区块链技术将得到极大发展,并将惠及整个社区。
在下一章中,我们将介绍替代的区块链解决方案和平台。由于区块链技术发展得非常迅速,并且吸引了许多研究兴趣,因此最近出现了许多新项目。我们将在下一章讨论这些项目。
第十四章:替代区块链
本章旨在介绍替代的区块链解决方案。随着比特币的成功以及对区块链技术潜力的逐渐认识,出现了一场寒武纪大爆发,导致了各种区块链协议、应用和平台的发展。一些项目并没有得到很大的发展,例如估计今年有 46%的 ICO 项目失败了,但许多项目已经成功在这一领域确立了自己的地位。
在本章中,读者将被介绍到像 Kadena、Ripple 和 Stellar 这样的替代区块链和平台。我们将探索那些要么是独立的新区块链,要么通过提供 SDK、框架和工具来支持其他现有区块链的项目,使得区块链解决方案的开发和部署变得更加容易。以太坊和比特币的成功导致了各种项目的出现,它们通过利用它们引入的底层技术和概念,通过增加用户友好的工具层来解决当前区块链的局限性或增强现有解决方案的价值。
区块链
在本节中,将介绍新的区块链解决方案,后续章节将涵盖各种平台和开发工具包,以补充现有的区块链。例如,Kadena 是一个具有创新理念的新私有区块链,其中引入了诸如可扩展 BFT 之类的概念。随着区块链技术的发展,也引入了诸如侧链、驱动链和挂钩等概念。本章将详细介绍所有这些技术和相关概念。当然,不可能涵盖所有的替代链(altchains)和平台,但本章包括了所有与区块链相关的、前几章涵盖的,或者预计很快会获得成功的平台。
我们将在本节中探讨 Kadena、Ripple、Stellar、Quorum 和其他各种区块链。
Kadena
Kadena 是一个私有区块链,成功解决了区块链系统中的可扩展性和隐私问题。Kadena 还引入了一种名为 Pact 的新的图灵不完备语言,允许智能合约的开发。Kadena 的一个关键创新是其可扩展的 BFT 共识算法,有潜力在不影响性能的情况下扩展到数千个节点。
可扩展 BFT 基于原始的 Raft 算法,是 Tangaroa 和 Juno 的后继者。Tangaroa 是 Raft 的一个实现,具有容错性(即 BFT Raft),旨在解决 Raft 算法中拜占庭节点行为引起的可用性和安全性问题,而 Juno 则是 JPMorgan 开发的 Tangaroa 的分支。共识算法在第一章的区块链 101中更详细地讨论。
这两个提案都有一个根本性的限制——在保持高性能的同时无法扩展。因此,Juno 无法获得太多的关注。私有区块链具有更理想的特性,即在节点数量增加时保持高性能,但上述提案缺乏这一特性。Kadena 通过其专有的可扩展 BFT 算法解决了这个问题,该算法预计能够在不降低性能的情况下扩展到数千个节点。
此外,保密性是 Kadena 的另一个重要方面,它能够在区块链上保护交易的隐私。这种安全服务通过使用密钥轮换、对称链上加密、增量哈希和双扳手协议的组合来实现。
密钥轮换是确保私有区块链安全性的标准机制。它作为一种最佳实践,通过定期更改加密密钥来防范任何攻击,如果密钥被泄露,则会被用来防范任何攻击。Pact 智能合约语言原生支持密钥轮换。
对称链上加密允许在区块链上加密交易数据。这些交易可以由特定私有交易的参与者自动解密。双扳手协议用于提供密钥管理和加密功能。
可扩展 BFT 共识协议确保在执行智能合约之前已经实现了足够的复制和共识。共识是通过以下流程实现的。
以下是交易在网络中的起源和流动方式:
-
首先,用户签署并广播一个新的交易到区块链网络,然后由一个领导节点接收并将其添加到其不可变日志中。在此时,还会为日志计算一个增量哈希。增量哈希是一种哈希函数,它允许在已经哈希过的原始消息稍微更改时计算哈希消息的情况下进行计算,这种方案比传统哈希函数更快且资源消耗更少,因为即使原始消息只有轻微更改,也需要生成一个全新的哈希消息。
-
一旦交易被领导节点写入日志,它就会对复制和增量哈希进行签名,并将其广播给其他节点。
-
其他节点在接收到交易后,验证领导节点的签名,将交易添加到自己的日志中,并将自己计算得到的增量哈希(法定证明)广播给其他节点。 最后,在收到其他节点的足够数量的证明后,交易将永久提交到分类帐中。
下图显示了这个过程的简化版,领导节点记录新交易然后复制到追随节点:
Kadena 中的共识机制
一旦达成共识,智能合同执行就可以开始,并经过一系列步骤,如下:
-
首先,验证消息的签名。
-
Pact 智能合同层接管。
-
Pact 代码经过编译。
-
启动交易并执行嵌入在智能合同中的任何业务逻辑。 如果出现任何失败,将立即启动回滚,将状态恢复为执行开始之前的状态。
-
最后,交易完成并更新相关日志。
Pact 已经被 Kadena 开源,并可在kadena.io/pact/downloads.html
下载。
这可以作为独立的二进制文件下载,提供 Pact 语言的 REPL。 这里显示了一个示例,Pact 在 Linux 控制台上通过发出./pact
命令来运行:
Pact REPL,显示示例命令和错误输出
Pact 语言中的智能合同通常由三部分组成:密钥集、模块和表格。 这些部分在这里描述:
-
密钥集: 这个部分定义了表格和模块的相关授权方案。
-
模块: 这个部分定义了智能合同代码,以函数和契约的形式包含业务逻辑。 模块内的契约由多个步骤组成,并按顺序执行。
-
表格: 这个部分是在模块内定义的受访问控制的结构。只有在 admin keyset 中定义的管理员才能直接访问这个表格。 默认情况下,模块中的代码被授予对表格的完全访问权限。
Pact 也允许多种执行模式。 这些模式包括合同定义、交易执行和查询。 这些执行模式在这里描述:
-
合同定义: 这种模式允许通过单个交易消息在区块链上创建合同。
-
交易执行: 这种模式涉及执行代表业务逻辑的智能合同代码的模块。
-
查询:此模式仅用于简单地探测合约数据,出于性能考虑在节点上本地执行。Pact 使用类似 LISP 的语法,并且在代码中准确表示将在区块链上执行的内容,因为它以人类可读的格式存储在区块链上。这与以太坊的 EVM 相反,后者将代码编译成字节码进行执行,这使得验证正在区块链上执行的代码变得困难。此外,它是图灵不完备的,支持不可变变量,并且不允许空值,这提高了交易代码执行的整体安全性。
在本章的有限长度内无法涵盖 Pact 的完整语法和功能;但是,这里展示了一个小例子,显示了使用 Pact 编写的智能合约的一般结构。此示例显示了一个简单的加法模块,定义了一个名为addition
的函数,该函数接受三个参数。当执行代码时,它将添加所有三个值并显示结果。
以下示例是使用在线 Pact 编译器开发的,可在kadena.io/try-pact/
上找到。
Pact 示例代码
运行代码时,会产生如下所示的输出:
代码的输出
如前面的示例所示,执行输出与代码布局和结构完全匹配,这样可以实现更大的透明度,并限制了恶意代码执行的可能性。
Kadena 是一种新型的区块链,引入了普遍确定性的新概念,在标准的基于公钥/私钥的数据来源安全性之外,还提供了另一层完全确定性的共识。它在区块链的所有层面,包括交易和共识层,提供了加密安全性。
Pact 的相关文档和源代码可以在github.com/kadena-io/pact
找到。
Kadena 还于 2018 年 1 月推出了一种公共区块链,这是构建具有大规模吞吐量的区块链的又一重大进步。该提案的新颖之处在于建立了一种 PoW 并行链架构。该方案通过将节点上的单独开采的链组合成单一网络来工作。结果是具有超过 10,000 笔交易处理能力的大规模吞吐量。
原始研究论文可在kadena.io/docs/chainweb-v15.pdf
找到。
Ripple
2012 年推出的 Ripple 是一种货币交换和实时毛额结算系统。在 Ripple 中,支付结算无需等待,与传统结算网络相比,传统结算网络可能需要数天时间才能完成结算。
它有一个称为瑞波币(XRP)的本地货币。它还支持非 XRP 支付。这个系统被认为类似于一个被称为哈瓦拉的传统老款转账机制。这个系统通过代理人接收汇款和密码,然后联系收款人的代理人,并指示他们向提供密码的人释放资金来运作。然后收款人联系当地代理人,告诉他们密码,并收取资金。代理人类比于瑞波中的网关。这只是一个非常简单的类比;实际的协议相当复杂,但原则上是相同的。
瑞波网络由各种节点组成,这些节点根据其类型可以执行不同的功能:
-
用户节点:这些节点用于支付交易,可以支付或接收支付。
-
验证节点:这些节点参与共识机制。每个服务器维护一组唯一节点,它在实现共识时需要查询这些节点。唯一节点列表(UNL)中的节点受到参与共识机制的服务器的信任,并且只会接受来自这个唯一节点列表的投票。
由于涉及网络运营商和监管机构,有时不认为瑞波是一个真正去中心化的网络。然而,它可以被认为是去中心化的,因为任何人都可以通过运行验证节点成为网络的一部分。此外,共识过程也是去中心化的,因为对账本提出的任何更改都必须遵循超级多数投票的方案来决定。然而,这是研究人员和爱好者之间的热门话题,对于每种思想流派都有支持和反对的论点。读者可以参考一些在线讨论进一步探索这些想法。
您可以在以下链接找到这些在线讨论:
Ripple 维护着一个由一种名为Ripple 协议共识算法(RPCA)的新型低延迟共识算法所管理的全球分布式账本,共识过程通过迭代地寻求验证服务器的验证和接受,直到获得足够数量的投票来就交易所在的开放账本的状态达成一致。一旦收到足够的投票(最初为 50%,随着每次迭代逐渐增加至至少 80%),变化就会被验证并且账本被关闭。在这一点上,会向整个网络发送警报,指示账本已关闭。
RPCA 的原始研究论文可在ripple.com/files/ripple_consensus_whitepaper.pdf
中找到。
总之,共识协议是一个三阶段的过程:
-
收集阶段:在此阶段,验证节点收集所有由账户所有者在网络上广播的交易并验证它们。一旦被接受,交易被称为候选交易,并根据验证标准接受或拒绝。
-
共识阶段:在收集阶段之后,共识过程开始,共识达成后账本被关闭。
-
账本关闭阶段:该过程每隔几秒钟异步运行一次,在轮次中,账本会相应地被打开和关闭(更新):
Ripple 共识协议阶段
在 Ripple 网络中,有许多组件共同工作,以实现共识并形成支付网络。这些组件在这里分别讨论:
-
服务器:该组件作为共识协议的参与者。为了能够参与共识协议,需要 Ripple 服务器软件。
-
账本:这是网络上所有账户余额的主要记录。账本包含各种元素,如账本编号、账户设置、交易、时间戳以及指示账本有效性的标志。
-
上一个关闭的账本:一旦验证节点达成共识,账本就会关闭。
-
开放账本:这是尚未验证且尚未就其状态达成共识的账本。每个节点都有自己的开放账本,其中包含了提议的交易。
-
唯一节点列表:这是验证服务器使用的一组唯一的受信任节点,以便寻求投票和随后的共识。
-
提议者:顾名思义,该组件提出要包含在共识过程中的新交易。通常是一个节点的子集(在前面的点中定义的 UNL),可以向验证服务器提议交易。
交易
交易由网络用户创建以更新账本。为了被视为共识过程中的候选项,交易预期是数字签名和有效的。每个交易都需要支付少量 XRP,这充当了防止因垃圾邮件而导致的拒绝服务攻击的保护机制。
Ripple 网络中有不同类型的交易。Ripple 交易数据结构中的一个字段称为TransactionType
,用于表示交易的类型。交易通过四个步骤执行:
-
首先,通过遵循标准创建未签名的交易,准备交易
-
第二步是签名,交易被数字签名以授权它
-
然后,通过连接的服务器实际提交到网络
-
最后,执行验证以确保交易成功验证
大致而言,交易可以分为三种类型,即与支付相关的、与订单相关的和与帐户和安全相关的。所有这些类型都在下一节中描述。
与支付相关的
此类别中有几个字段会导致某些操作。所有这些字段如下所述:
-
Payment
: 此交易最常用,允许一个用户向另一个用户发送资金。 -
PaymentChannelClaim
: 该操作用于从支付通道中索取瑞波币(XRP)。支付通道是一种允许各方进行重复且单向支付的机制。它还可用于设置支付通道的过期时间。 -
PaymentChannelCreate
: 此交易创建一个新的支付通道,并以滴的形式添加 XRP。一个滴相当于 0.000001 个 XRP。 -
PaymentChannelFund
: 此交易用于向现有通道添加更多资金。与PaymentChannelClaim
交易类似,这也可用于修改支付通道的过期时间。
与订单相关的
此类型的交易包括以下两个字段:
-
OfferCreate
: 该交易表示限价订单,代表了货币交换的意向。如果订单无法完全执行,则会在共识账本中创建一个报价节点。 -
OfferCancel
: 用于从共识账本中删除先前创建的报价节点,表示撤销订单。
帐户和安全相关
此类型的交易包括以下列出的字段。每个字段负责执行特定的功能:
-
AccountSet
: 此交易用于修改 Ripple 共识账本中帐户的属性。 -
SetRegularKey
: 用于更改或设置帐户的交易签名密钥。帐户是使用从帐户的主公钥派生的 Base-58 Ripple 地址来识别的。 -
SignerListSet
: 可用于创建用于多重签名交易的签名者集合。 -
TrustSet
: 这用于创建或修改账户之间的信任线。
Ripple 中的交易由各种对所有交易类型通用的字段组成。这些字段如下所示,并附有描述:
-
Account
: 这是交易发起者的地址。 -
AccountTxnID
: 这是一个可选字段,包含另一个交易的哈希值。它用于将交易链接在一起。 -
Fee
: 这是 XRP 的金额。 -
Flags
: 这是一个可选字段,用于指定交易的标志。 -
LastLedgerSequence
: 这是交易可以出现的账本中的最高序列号。 -
Memos
: 这代表可选的任意信息。 -
SigningPubKey
: 这代表公钥。 -
Signers
: 这代表多重签名交易中的签名者。 -
SourceTag
: 这代表交易的发送方或原因。 -
SourceTag
: 这代表交易的发送方或原因。 -
TxnSignature
: 这是交易的验证数字签名。
Interledger
Interledger 是一个由四层组成的简单协议:应用层、传输层、Interledger 层和账本层。每一层负责在某些协议下执行各种功能。这些功能和协议在以下部分描述。
此协议的规范可在以下链接找到:interledger.org/rfcs/0003-interledger-protocol/draft-9.html
应用层
运行在这一层上的协议管理支付交易的关键属性。应用层协议的示例包括简单支付设置协议(SPSP)和开放网络支付方案(OWPS)。SPSP 是一种 Interledger 协议,通过在它们之间创建连接器,允许在不同账本之间进行安全支付。OWPS 是另一种方案,允许在不同网络之间进行消费者支付。
一旦这一层上的协议成功运行,将按顺序调用传输层的协议以启动支付流程。
传输层
这一层负责管理支付交易。目前可用的协议有乐观传输协议(OTP)、通用传输协议(UTP)和原子传输协议(ATP)。OTP 是最简单的协议,它在没有任何托管保护的情况下管理支付转账,而 UTP 则提供托管保护。ATP 是最先进的协议,它不仅提供托管传输机制,还利用可信的公证人进一步确保了支付交易的安全性。
Interledger 层
该层提供互操作性和路由服务。该层包含诸如Interledger 协议(ILP)、Interledger 报价协议(ILQP)和Interledger 控制协议(ILCP)等协议。ILP 数据包提供了传输中的最终目标(目的地)。ILQP 用于在实际转账之前由发送方发起的报价请求。ILCP 用于在支付网络上的连接器之间交换与路由信息和支付错误相关的数据。
分类帐层
该层包含了使连接器之间进行通信和支付交易执行的协议。连接器基本上是实现在不同分类帐之间转发支付的协议的对象。它可以支持各种协议,如简单分类帐协议、各种区块链协议、传统协议和不同的专有协议。
Ripple 连接由各种即插即用的模块组成,通过使用 ILP 实现分类帐之间的连接。它使各方在交易之前交换所需数据成为可能,包括可见性、费用管理、交付确认和使用传输层安全性进行安全通信。第三方应用程序可以通过各种连接器连接到 Ripple 网络,这些连接器在不同分类帐之间转发支付。
在前述章节中描述的所有层构成了 Interledger 协议的架构。总的来说,Ripple 是一个针对金融行业的解决方案,使实时支付成为可能,而无需任何结算风险。由于这是一个非常功能丰富的平台,在本章节中无法覆盖所有方面。
Ripple 平台的文档可在ripple.com/
找到。
星际
Stellar 是基于区块链技术的支付网络,采用了一种新颖的共识模型称为联邦拜占庭协议(FBA)。FBA 通过创建信任方的法定人数来工作。Stellar 共识协议(SCP)是 FBA 的一种实现。
Stellar 白皮书中指出的关键问题是当前金融基础设施的成本和复杂性。这种限制需要一个全球金融网络,解决这些问题而不损害金融交易的完整性和安全性。这一要求导致了 SCP 的发明,这是一种可证明安全的共识机制。
SCP 的原始研究论文可在www.stellar.org/papers/stellar-consensus-protocol.pdf
找到。
它具有以下四个主要属性:
-
去中心化控制:这允许任何人参与,没有中央方
-
低延迟:这解决了快速交易处理的迫切要求
-
灵活信任:这使用户可以选择他们信任的特定目的方
-
渐进式安全性:这利用数字签名和哈希函数来为网络提供所需的安全级别。
Stellar 网络允许通过其原生数字货币来传输和表示资产的价值,称为Lumens,缩写为XLM。当交易在网络上广播时,Lumens 会被消耗,这也作为阻止服务拒绝攻击的一种威慑手段。
在其核心,Stellar 网络维护着一个分布式分类账,记录着每一笔交易,并在每个 Stellar 服务器(节点)上复制。共识是通过验证服务器之间的交易并使用更新更新分类账来实现的。Stellar 分类账也可以充当分布式交易所订单簿,允许用户存储他们的购买或出售货币的报价。
有各种工具、SDK 和软件构成了 Stellar 网络。
核心软件可在 github.com/stellar/stellar-core
获取。
Rootstock
在详细讨论Rootstock(RSK)之前,重要的是定义并介绍一些对 Rootstock 设计至关重要的概念。这些概念包括侧链、驱动链和双向锚定。侧链的概念最初是由 Blockstream 开发的。
Blockstream 的在线存在位于 blockstream.com
。
双向锚定是一种机制,通过该机制价值(硬币)可以在一个区块链之间传输到另一个区块链,反之亦然。实际上没有硬币在链之间转移。这个想法围绕着在比特币区块链(主链)中锁定相同数量和价值的硬币,并在次要链中解锁等值的令牌的概念。
牢记这个定义,侧链可以如下部分所述定义。
侧链
这是一个与主区块链并行运行的区块链,允许在它们之间传输价值。这意味着一个区块链中的代币可以在侧链中使用,反之亦然。这也被称为锚定侧链,因为它支持双向锚定资产。
Drivechain
这是一个相对较新的概念,其中对于解锁在主链中的锁定比特币的控制被给予了矿工,他们可以投票何时解锁它们。这与侧链相反,在侧链中,共识是通过简单支付验证机制来验证的,以便将硬币转回主链。
Rootstock 是一个智能合约平台,它在比特币区块链中具有双向钉住。其核心思想是增加比特币系统的可扩展性和性能,并使其能够与智能合约一起使用。Rootstock 运行一个名为Rootstock 虚拟机(RVM)的图灵完备确定性虚拟机。它还兼容 EVM,并允许以太坊智能合约在 Rootstock 上运行。智能合约也可以在比特币区块链的经过时间测试的安全性下运行。Rootstock 区块链通过与比特币合并挖矿来工作。这使得 Rootstock 区块链能够实现与比特币相同的安全级别。特别是防止双重支付和实现结算终局性。由于更快的区块时间和其他设计考虑因素,它可以实现可扩展性,每秒高达 400 笔交易。
如果你想进一步探索,可在uploads.strikinglycdn.com/files/ec5278f8-218c-407a-af3c-ab71a910246d/RSK%20White%20Paper%20-%20Overview.pdf
上查阅研究论文。
RSK 已发布了名为 Bamboo 的主网络,RSK MainNet 目前还处于测试阶段。
可在www.rsk.co/
上找到。
Quorum
这是通过增强现有以太坊区块链构建的区块链解决方案。Quorum 引入了几项改进,如交易隐私和新的共识机制。Quorum 引入了一种名为 QuorumChain 的新共识模型,它基于大多数投票和基于时间的机制。另一个名为“星座”(Constellation)的功能也被引入,它是一个通用机制,用于提交信息并允许节点之间的加密通信。此外,节点级别的权限受智能合约的管理。与公共以太坊区块链相比,它还提供了更高层次的性能。
几个组件构成了 Quorum 区块链生态系统。这些列在以下小节中。
交易管理器
该组件可访问加密的交易数据。它还管理节点上的本地存储,并与网络上的其他交易管理器进行通信。
加密飞地
正如其名称所示,该组件负责提供加密服务以确保交易隐私。它还负责执行密钥管理功能。
QuorumChain
这是 Quorum 的关键创新。这是一种 BFT 共识机制,允许通过区块链网络上的交易验证和流通投票。在这个方案中,使用智能合约来管理共识过程,并且节点可以被赋予投票权来投票哪个新区块应该被接受。一旦投票者收到了足够数量的选票,该区块被视为有效。节点可以担任两种角色,即投票者或制造者。投票者节点有权投票,而制造者节点是创建新区块的节点。按设计,一个节点可以具有权利、无权利或只有一种。
网络管理器
此组件为权限网络提供了访问控制层。
Quorum 网络中的节点可以担任多种角色,例如,允许创建新区块的制造者节点。使用密码学和某些交易仅供相关参与者查看的概念提供交易隐私。这个想法类似于 Corda 在 第十三章中讨论过的私有交易的概念,Hyperledger。由于它允许在区块链上进行公共和私有交易,因此状态数据库已分为代表私有和公共交易的两个数据库。因此,有两个单独的 Patricia-Merkle 树来表示网络的私有状态和公共状态。私有合同状态哈希用于在交易参与方之间的私有交易中提供共识证据。
Quorum 网络中的交易包括多种元素,如收件人、发送者的数字签名(用于识别交易发起者)、可选的以太数量、允许查看交易的参与者的可选列表,以及在私有交易情况下包含哈希的字段。
交易在达到目的地之前要经过几个步骤。这些步骤如下所述:
-
用户应用程序(DApps)通过区块链网络提供的 API 将交易发送到 Quorum 节点。这还包括接收地址和交易数据。
-
然后,API 加密有效负载并应用任何其他必要的加密算法,以确保交易的隐私,并发送给交易管理器。此步骤还计算了加密有效负载的哈希值。
-
在接收到交易后,交易管理器验证交易发送者的签名并存储消息。
-
先前加密的有效负载的哈希被发送到 Quorum 节点。
-
一旦 Quorum 节点开始验证包含私有交易的区块,它会从交易管理器请求更多相关数据。
-
一旦交易管理器收到此请求,它将加密的有效负载和相关的对称密钥发送给请求者的 Quorum 节点。
-
一旦 Quorum 节点拥有所有数据,它就会解密有效负载并将其发送到 EVM 进行执行。这就是 Quorum 如何在区块链上使用对称加密实现隐私,同时能够使用原生以太坊协议和 EVM 分别进行消息传输和执行的方式。
一个类似的概念,在几个方面有所不同,之前以HydraChain的形式提出过,它基于以太坊区块链,并允许创建许可的分布式账本。
Quorum 可以在 github.com/jpmorganchase/quorum
下载。
Tezos
Tezos 是一个通用的自修改的加密账本,这意味着它不仅允许就区块链状态达成分散共识,还允许就协议和节点随时间演变达成共识。Tezos 已经开发出来解决比特币协议的局限性,比如由于 PoW 导致的硬分叉问题、成本问题和挖矿算力集中问题、脚本能力有限和安全问题。它是用一种纯函数语言 OCaml 开发的。
原始研究论文可在 www.tezos.com/static/papers/white_paper.pdf
获取。
Tezos 分布式账本的架构分为三层:网络层、共识层和交易层。这种分解允许协议以去中心化的方式演变。为此,在 Tezos 中实现了一个通用网络外壳,负责维护区块链,该区块链由共识层和交易层的组合表示。该外壳提供了网络和协议之间的接口层。
也引入了种子协议的概念,用作允许网络上的利益相关者批准协议的任何更改的机制。
Tezos 区块链从一个种子协议开始,而传统区块链是从创世区块开始的。
这个种子协议负责定义区块链中的修正程序,甚至修正协议本身。Tezos 的奖励机制基于 PoS 算法,因此没有挖矿需求。
Tezos 开发了一个合约脚本语言用于编写智能合约,这是一种基于堆栈的图灵完备语言。Tezos 中的智能合约是经过形式验证的,这允许对代码进行数学上的正确性验证。
Tezos 最近通过 ICO 完成了 2.32 亿美元的众筹。他们的公共网络预计将于 2018 年第一季度发布。
Tezos 代码可以在 github.com/tezos/tezos
获取。
Storj
云存储的现有模型都是集中式解决方案,可能或可能不像用户期望的那样安全。需要一个安全、高度可用且最重要的是分散化的云存储系统。Storj 旨在提供基于区块链的、分散化的和分布式存储。它是由社区共享的云,而不是一个中央组织。它允许在充当自治代理的节点之间执行存储合同。这些代理(节点)执行各种功能,如数据传输、验证和执行数据完整性检查。
核心概念基于称为分布式哈希表(DHTs)的Kademlia,但是在 Storj 中通过添加新的消息类型和功能来增强此协议。它还实现了点对点的发布/订阅(pub/sub)机制,称为Quasar,该机制确保消息成功到达对存储合同感兴趣的节点。这是通过称为topics的基于布隆过滤器的存储合同参数选择机制来实现的。
Storj 在网络中以加密格式存储文件。在文件存储在网络上之前,它会使用 AES-256-CTR 对称加密进行加密,然后以分布式方式逐片存储在网络上。将文件分解为片段的过程称为sharding,这会增加网络的可用性、安全性、性能和隐私。此外,如果节点失败,则该片段仍然可用,因为默认情况下,在网络上的三个不同位置存储单个片段。
它维护了一个区块链,作为一个共享账本,并实现了标准的安全功能,如公钥/私钥加密和哈希函数,类似于任何其他区块链。由于该系统基于节点之间的硬盘共享,任何人都可以通过共享其额外的硬盘空间并使用 Storj 的加密货币Storjcoin X(SJCX)获得报酬。SJCX 被开发为 Counterparty 资产,并使用 Counterparty(基于比特币区块链)进行交易。这已经迁移到了以太坊。
可以在 blog.storj.io/post/158740607128/migration-from-counterparty-to-ethereum
中找到详细的讨论。
Storj 代码可在 github.com/Storj/
获取。
MaidSafe
这是另一个类似于 Storj 的分布式存储系统。用户通过为网络贡献存储空间而获得 Safecoin 报酬。支付机制受到 资源证明 的管理,该机制确保用户提交给网络的磁盘空间可用,如果不可用,则相应的 Safecoin 支付将下降。文件在传输到网络进行存储之前会被加密和分割成小部分。
与 MaidSafe 一起引入了机会性缓存的概念,这是一种创建经常访问数据的副本物理上更接近访问请求来源的机制,这导致了网络的高性能。SAFE 网络的另一个新颖特性是,它会自动删除网络上的任何重复数据,从而减少存储需求。
而且,还引入了翻本的概念,基本上意味着数据不断在网络中移动,以便恶意对手无法针对数据。它还在网络中保留了数据的多个副本,以提供冗余备份,以防节点离线或失败。
BigchainDB
这是一个可扩展的区块链数据库。它本身并不严格算是一个区块链,而是通过提供一个分散式数据库来补充区块链技术。从本质上说,它是一个分布式数据库,但具有区块链的附加属性,例如分散化、不可变性和处理数字资产。它还允许使用 NoSQL 来查询数据库。
它旨在在分散式生态系统中提供数据库,其中不仅处理是分散的(区块链)或文件系统是分散的(例如 IPFS),而且数据库也是分散的。这使整个应用生态系统变得分散。
这可以在www.bigchaindb.com/
找到。
MultiChain
MultiChain 已经作为私有区块链的开发和部署平台而开发。它基于比特币代码,解决了安全性、可扩展性和隐私问题。它是一个高度可配置的区块链平台,允许用户设置不同的区块链参数。它支持通过细粒度许可层进行控制和隐私保护。MultiChain 的安装非常快捷。
安装文件的链接可在www.multichain.com/download-install/
找到。
Tendermint
Tendermint 是一个为应用程序提供 BFT 共识机制和状态机复制功能的软件。它的主要动机是开发一个通用、安全和高性能的复制状态机。
Tendermint 有两个组件,在下一节描述。
Tendermint Core
这是一个共识引擎,可以在网络中的每个节点上安全地复制交易。
Tendermint Socket Protocol (TMSP)
这是一个应用程序接口协议,允许与任何编程语言进行接口,以处理交易。
Tendermint 允许应用程序过程和共识过程解耦,这使得任何应用都可以从共识机制中受益。
Tendermint 共识算法是一种基于轮次的机制,其中验证节点在每个轮次提出新的区块。使用锁定机制来确保防止在同一高度的区块链上选择了两个不同的区块用于提交的情况。每个验证节点维护一个包含交易的完整本地复制的区块账本。每个区块包含一个标头,其中包括前一个区块哈希、区块提议的时间戳、当前区块高度和区块中所有交易的 Merkle 根哈希。
最近,Tendermint 已经被用于Cosmos(cosmos.network
),这是一个区块链网络,允许不同链之间在 BFT 共识算法上运行的互操作性。这个网络上的区块链被称为区域。Cosmos 中的第一个区域称为 Cosmos Hub,实际上是一个公共区块链,负责为其他区块链提供连接服务。为此,Hub 使用了跨区块链通信(IBC)协议。IBC 协议支持两种类型的交易,称为IBCBlockCimmitTx
和IBCPacketTx
。第一种类型用于向任何一方提供区块链中最新块哈希的证明,而后一种类型用于提供数据原始认证。从一个区块链到另一个区块链的数据包首先通过向目标链发布证明来发布。接收(目标)链检查此证明以验证发送链是否确实发布了数据包。此外,它有自己的本地货币叫做 Atom。这个方案通过允许多个区块链连接到 Hub 来解决可扩展性和互操作性问题。
Tendermint 可以在tendermint.com/
找到。
平台和框架
本节涵盖了各种已开发的平台,旨在增强现有区块链解决方案的体验。
Eris
Eris 不是单一的区块链,它是由 Monax 开发的用于开发基于区块链的生态系统应用程序的开放模块化平台。它提供了各种框架、SDK 和工具,可以加速区块链应用程序的开发和部署。
Eris 应用平台背后的核心思想是通过区块链后端实现生态系统应用程序的开发和管理。它允许与多个区块链集成,并使各种第三方系统能够与其他各种系统交互。
该平台使用用 Solidity 语言编写的智能合约。它可以与以太坊或比特币等区块链进行交互。交互可以包括连接命令、启动、停止、断开连接和创建新区块链。在 Eris 中,与区块链的设置和交互相关的复杂性已被抽象化。所有命令对不同的区块链都是标准化的,在平台上可以使用相同的命令,而不管目标区块链类型如何。
一个生态系统应用可以包括 Eris 平台,从而实现 API 网关,以允许传统应用连接到密钥管理系统、共识引擎和应用引擎。Eris 平台提供了各种工具包,用于为开发人员提供各种服务。这些模块描述如下:
-
Chains: 这允许创建和与区块链进行交互。
-
Packages: 这允许开发智能合约。
-
Keys: 用于密钥管理和签名操作。
-
Files: 这允许与分布式数据管理系统一起工作。它可用于与 IPFS 和数据湖等文件系统进行交互。
-
Services: 这提供了一组服务,允许管理和整合生态系统应用程序。
Eris 还开发了几个 SDK,允许开发和管理生态系统应用程序。这些 SDK 包含经过完全测试并满足业务特定需求和要求的智能合约。例如,金融 SDK、保险 SDK 和物流 SDK。还有一个基本 SDK,作为管理生态系统应用程序生命周期的基本开发工具包。
Monax 开发了自己的权限区块链客户端,称为eris:db
。这是一个基于 PoS 的区块链系统,允许与多种不同的区块链网络集成。eris:db
客户端由四个组件组成:
-
Consensus: 这基于前面讨论过的 Tendermint 共识机制
-
Virtual machine: Eris 使用 EVM,因此支持 Solidity 编译的合约
-
Permissions layer: 作为权限账本,Eris 提供了一个可以用于在网络上分配不同实体的特定角色的访问控制机制
-
Interface: 这提供了各种命令行工具和 RPC 接口,以便与后端区块链网络进行交互
以太坊区块链和eris:db
之间的关键区别在于eris:db
使用了一个实用拜占庭容错(PBFT)算法,该算法实施为基于存款的权益证明(DPOS 系统),而以太坊使用 PoW。此外,eris:db
使用了 ECDSA ed22519
曲线方案,而以太坊使用了secp256k1
算法。最后,它是有权限访问控制层的,而以太坊是公共区块链。
Eris 是一个功能丰富的应用平台,提供了大量的工具包和服务来开发基于区块链的应用程序。
它可以在monax.io/
上找到。
总结
本章以替代区块链的介绍开始,分为讨论区块链和平台两个主要部分。区块链技术是一个非常繁荣的领域,因此现有解决方案的变化非常迅速,几乎每天都会引入新的相关技术或工具。在本章中,介绍了精心挑选的平台和区块链。考虑了一些与前几章涵盖的材料相辅相成的解决方案,例如支持区块链开发的 Eris。还讨论了新的区块链,如 Kadena,各种新的协议,如 Ripple,以及侧链和驱动链等概念。
本章涵盖的材料旨在为读者感兴趣的领域提供更深入研究的坚实基础。正如前面所说,区块链是一个发展迅猛的领域,还有许多其他区块链提议项目,如 Tau-Chain、HydraChain、Elements、CREDITS 等等,本章未涉及。鼓励读者关注该领域的发展,以及迅速增长的区块链技术的进步,以保持自己的更新。
在下一章中,我们将探讨区块链如何在其原始用途之外使用,即加密货币。我们将涵盖各种用例,特别是区块链在物联网中的使用。
第十五章:区块链 - 货币之外
数字货币是区块链技术的首次应用,可以说并没有意识到其真正的潜力。随着比特币的发明,区块链的概念首次被引入,但直到 2013 年才意识到了区块链技术在许多不同行业中的真正潜力,而不仅仅是加密货币。从那时起,人们提出了区块链技术在各个行业的许多用例,包括但不限于金融、物联网、数字版权管理、政府和法律。
在本章中,通过使用案例,选择了四个主要行业,即物联网、政府、卫生和金融,进行讨论。
2010 年,开始讨论 BitDNS,一个互联网域名的分散命名系统。然后,Namecoin (wiki.namecoin.org/index.php?title=History
)于 2011 年 4 月开始,其愿景与比特币不同,比特币的唯一目的是提供电子现金。这可以被认为是除了纯粹的加密货币之外第一个区块链用途的例子。
从 2013 年开始,许多想法涌现出来。自 2013 年以来,这一趋势呈指数级增长。
物联网
物联网(IoT)简称最近因其改变商业应用和日常生活的潜力而受到了很多关注。物联网可以被定义为一个由计算智能物理对象(如汽车、冰箱、工业传感器等任何物体)组成的网络,这些对象能够连接到互联网,感知现实世界的事件或环境,对这些事件做出反应,收集相关数据,并通过互联网进行通信。
这个简单的定义具有巨大的影响,并引发了令人兴奋的概念,如可穿戴设备、智能家居、智能电网、智能联网汽车和智能城市,这些概念都基于物联网设备的这一基本概念。在剖析物联网的定义之后,四个功能浮出水面,这些功能由物联网设备执行。这些功能包括感知、反应、收集和通信。所有这些功能都是通过物联网设备上的各种组件执行的。
感知由传感器执行。反应或控制由执行器执行,收集是各种传感器的功能,通信是由提供网络连接的芯片执行的。值得注意的是,物联网中所有这些组件都可以通过互联网访问和控制。物联网设备本身可能在某种程度上有用,但如果它是更广泛的物联网生态系统的一部分,则更有价值。
典型的物联网可以由许多物理对象相互连接和连接到集中的云服务器组成。如下图所示:
典型的物联网网络
出处:IBM
物联网的元素分布在多个层中,且存在可用于开发物联网系统的各种参考架构。可使用五层模型来描述物联网,其中包含物理对象层,设备层,网络层,服务层和应用层。每个层级负责各种功能,并包含多个组件。这些显示在以下图中:
物联网五层模型
现在我们将详细检查每个层。
物理对象层
这些对象包括任何现实世界中的物体。包括人、动物、汽车、树木、冰箱、火车、工厂、家庭,实际上任何需要监控和控制的东西都可以连接到物联网。
设备层
此层包含构成物联网的东西,如传感器、传感器、执行器、智能手机、智能设备和射频识别(RFID)标签。传感器可以有许多类别,如体感传感器、家庭传感器和基于其执行的工作类型的环境传感器。该层是物联网生态系统的核心,各种传感器用于感知现实环境。该层包括可以监测温度、湿度、液体流动、化学物质、空气、压力等的传感器。通常,设备上需要模拟至数字转换器(ADC)将现实世界的模拟信号转换为微处理器可以理解的数字信号。
此层的执行器提供了启用对外部环境进行控制的手段,例如启动电机或打开门。这些组件还需要数字模拟转换器,以将数字信号转换为模拟信号。当物联网设备需要控制机械部件时,这种方法尤其重要。
网络层
该层由用于在物联网生态系统中设备之间和与云端或服务器之间提供互联网连接的各种网络设备组成。这些设备可以包括网关、路由器、集线器和交换机。该层可以包括两种通信类型。
首先是水平通信手段,包括无线电,蓝牙,Wi-Fi,以太网,局域网,Zigbee 和个人局域网(PAN),可用于提供物联网设备之间的通信。其次,我们有与下一层的通信,通常是通过互联网,提供机器与人或其他上层之间的通信。第一层可以选择性地包含在设备层,因为它实际上是位于设备层上的,设备可以在同一层相互通信。
管理层
该层为物联网生态系统提供管理层。这包括能够处理从物联网设备收集的数据并将其转化为有意义的洞见的平台。此外,设备管理、安全管理和数据流管理也包括在此层中。它还管理设备与应用层之间的通信。
应用层
此层包括在物联网网络顶部运行的应用程序。根据需求,此层可以包含许多应用程序,如交通运输、医疗保健、金融、保险或供应链管理。当然,这个列表并不是任何想象力的完整列表;有许多物联网应用可以归入此层。
随着廉价传感器、硬件和带宽的可用性,物联网近年来在各个领域获得了广泛的应用,目前在许多不同领域都有应用,包括医疗保健、保险、供应链管理、家庭自动化、工业自动化和基础设施管理。此外,技术的进步,如 IPv6 的可用性、更小更强大的处理器和更好的互联网接入,也在物联网的普及中发挥了关键作用。
物联网的好处从节省成本到使企业能够根据物联网设备提供的数据做出关键决策并因此提高绩效。即使在家庭使用中,物联网设备配备的家用电器也可以提供有价值的节能数据。例如,用于能源监测的智能电表可以提供有关能源使用情况的宝贵信息,并将其传达回服务提供商。来自数百万物品(物联网设备)的原始数据被分析并提供有意义的见解,有助于及时和有效地做出业务决策。
通常的物联网模型基于中心化范式,物联网设备通常连接到云基础设施或中央服务器以报告和处理相关数据。这种集中化带来了某些利用可能性,包括黑客攻击和数据盗窃。此外,对个人数据在单一中心化服务提供商上缺乏控制也增加了安全和隐私问题的可能性。虽然有方法和技术可以构建基于普通物联网模型的高度安全的物联网生态系统,但区块链对物联网可以带来特定且更加可取的好处。基于区块链的物联网模型不同于传统的物联网网络范式。
根据 IBM 的说法,区块链对物联网的作用在于帮助建立信任、降低成本并加速交易。此外,区块链技术的核心——去中心化,可以消除物联网网络中的单点故障。例如,一个中央服务器可能无法应对数十亿个物联网设备(物)以高频率产生的数据量。此外,区块链提供的点对点通信模型可以帮助降低成本,因为无需建立高成本的集中式数据中心或实施复杂的公钥基础设施来保障安全。设备可以直接或通过路由器相互通信。
据各种研究机构和公司的估计,到 2020 年,将有大约 220 亿台设备连接到互联网。随着数十亿台设备连接到互联网,很难想象集中式基础设施将能够满足对带宽、服务和可用性的高需求而不会产生过多的支出。基于区块链的物联网将能够解决当前物联网模型中的可扩展性、隐私性和可靠性问题。
区块链使“物”能够直接通信和交易,而且在智能合约的可用性下,谈判和金融交易也可以直接在设备之间进行,而无需中间商、权威或人工干预。例如,如果酒店中的一个房间空置,它可以出租自己,谈判租金,并为支付了足够资金的人打开门锁。另一个例子可能是,如果洗衣机用完了洗涤剂,它可以在智能合约中编程的逻辑基础上找到最优价格和价值后在线订购洗涤剂。
上述的五层物联网模型可以通过在网络层之上添加一个区块链层来适应基于区块链的模型。该层将运行智能合约,并为物联网生态系统提供安全性、隐私性、完整性、自主性、可扩展性和去中心化服务。在这种情况下,管理层可以仅由与分析和处理相关的软件组成,而安全性和控制可以移至区块链层。该模型可以在以下图表中可视化:
基于区块链的物联网模型
在这个模型中,其他层可能保持不变,但会引入一个额外的区块链层作为物联网网络所有参与者之间的中间件。
在摘除了前面提到的所有层之后,它也可以被视为点对点的物联网网络。在这个模型中,所有设备都在没有中央指挥和控制实体的情况下相互通信和协商,如下图所示:
基于区块链的直接通信模型,来源:IBM
采用基于区块链的去中心化方法,还可以实现成本节约。通过区块链,设备管理变得更容易。可以通过使用区块链优化物联网网络的性能。在这种情况下,不需要为数百万台设备集中存储物联网数据,因为存储和处理要求可以分布到区块链上的所有物联网设备上。这可以完全消除处理和存储物联网数据的大型数据中心的需求。
基于区块链的物联网还可以防止服务拒绝攻击,黑客可以更有效地针对集中服务器或数据中心,但使用区块链的分布式和去中心化性质,此类攻击不再可能。此外,如果按估计,很快将有数十亿台设备连接到互联网,从传统的集中式服务器管理所有这些设备的安全性和更新几乎是不可能的。区块链可以通过允许设备以安全的方式直接相互通信,甚至从彼此请求固件和安全更新来解决此问题。在区块链网络上,这些通信可以被记录下来,保证不可变性和安全性,从而为系统提供了可审计性、完整性和透明度。这种机制在传统的点对点系统中是不可能的。
总之,物联网和区块链的融合可以带来明显的好处,学术界和工业界已经在进行大量的研究和工作。已经提出了各种提供基于区块链的物联网解决方案的项目。例如,IBM 蓝色地平线和 IBM Bluemix 是支持区块链物联网平台的物联网平台。各种初创公司如 Filament 已经提出了关于如何构建使物联网设备能够直接和自主地通过智能合约进行交易的分散网络的新颖想法。
在接下来的部分,提供了一个实际的例子,说明了如何构建一个简单的物联网设备并将其连接到以太坊区块链。这个物联网设备连接到以太坊区块链,当区块链上的用户发送了适当数量的资金时,用于打开一扇门(在本例中,门锁由 LED 表示)。这只是一个简单的例子,需要一个更严格测试的版本才能将其投入生产,但它演示了如何将物联网设备连接、控制和响应于以太坊区块链上的某些事件。
物联网区块链实验
本示例使用了树莓派设备,树莓派是一种单板计算机(SBC)。树莓派是一种低成本的计算机,旨在促进计算机教育,但也因其作为构建物联网平台的首选工具而广受欢迎。以下图片显示了树莓派 3 型 B 型。您也可以使用早期型号,但尚未经过测试:
树莓派 Model B
在接下来的部分中,将讨论一个例子,其中树莓派将作为连接到以太坊区块链的 IoT 设备,并响应智能合约调用的示例。
首先,需要设置树莓派。这可以通过使用 NOOBS 来完成,NOOBS 提供了一个安装 Raspbian 或其他操作系统的简单方法。
可以从链接www.raspberrypi.org/downloads/noobs/
下载并安装。
或者,你可以从链接www.raspberrypi.org/downloads/raspbian/
安装 Raspbian。
另一个可用的选择在github.com/debian-pi/raspbian-ua-netinst
也可以用来安装 Raspbian OS 的最小非 GUI 版本。
对于本例,已经使用 NOOBS 来安装 Raspbian,因此,其余的操作假设 Raspbian 已经安装在树莓派的 SD 存储卡上。下面截图中的命令输出显示了操作系统正在运行的架构。在这种情况下,它是armv71
;因此,将下载适用于 ARM 的 Geth 二进制文件。
可以通过在 Raspberry Pi Raspbian 操作系统的终端窗口中运行命令uname -a
来确认平台。
树莓派架构
安装了 Raspbian 操作系统后,下一步是为树莓派 ARM 平台下载适当的 Geth 二进制文件。
下载和安装步骤详细描述如下:
- Geth 下载。请注意,在下面的示例中下载了特定版本,但也有其他可下载的版本,可以从
geth.ethereum.org/downloads/
下载。
我们可以使用wget
来下载geth
客户端映像:
$ wget https://gethstore.blob.core.windows.net/builds/geth-linux- arm7-1.5.6-2a609af5.tar.gz
也可以使用其他版本,但建议你下载此版本,因为这是本章示例中使用的版本。
- 解压缩并提取到一个目录。使用下面显示的
tar
命令将自动创建名为geth-linux-arm7-1.5.6-2a609af5
的目录:
$ tar -zxvf geth-linux-arm7-1.5.6-2a609af5.tar
此命令将创建一个名为geth-linux-arm7-1.5.6-2a609af5
的目录,并将 Geth 二进制文件和相关文件解压缩到该目录中。Geth 二进制文件可以复制到/usr/bin
或 Raspbian 上的适当路径中,以便在操作系统中的任何地方都可用。下载完成后,下一步是创建创世区块。
- 需要使用创世区块。可以从网络上的其他节点复制创世文件。下图显示了这一点。或者,也可以生成一个全新的创世区块。
{
"nonce": "0x0000000000000042",
"timestamp": "0x00",
"parentHash":
"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"gasLimit": "0x8000000",
"difficulty": "0x0400",
"mixhash":
"0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {
},
"config": {
"chainId": 786,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
}
}
- 将
genesis.json
文件复制到树莓派后,可以运行以下命令来生成起源块。重要的是使用先前生成的相同起源块,否则节点将实际上在不同的网络上运行:
$ ./geth init genesis.json
将显示类似于以下截图中所示的输出:
初始化起源文件
- 创建起源块后,有必要向网络中添加对等节点。可以通过创建一个名为
static-nodes.json
的文件来实现,其中包含供树莓派上的geth
用于同步连接的对等方的 enode ID:
静态节点配置
可以通过在 Geth JavaScript 控制台上运行以下命令来获取此信息,此命令应该在树莓派要连接的对等方上运行:
> admin.nodeInfo
这将显示类似于以下截图中所示的输出:
geth nodeInfo
完成这一步之后,可以按照以下部分中提供的进一步说明来连接树莓派到私有网络上的其他节点。在本示例中,树莓派将连接到网络 ID 786
. 关键是使用先前创建的相同起源文件和不同的端口号。相同的起源文件将确保客户端连接到与起源文件相同的网络。
不同的端口不是严格要求的,但是,如果两个节点在私有网络下运行,并且需要从网络外部访问,则将使用 DMZ、路由器和端口转发的组合。因此,建议使用不同的 TCP 端口以确保端口转发工作正常。第一次节点设置中显示的--identity
开关在以前并未介绍过,它允许为节点指定一个标识名称。
第一个节点设置
首先,需要使用以下命令在第一个节点上启动geth
客户端:
$ geth --datadir .ethereum/privatenet/ --networkid 786 --maxpeers 5 --rpc --rpcapi web3,eth,debug,personal,net --rpcport 9001 --rpccorsdomain "*" -- port 30301 --identity "drequinox"
这将产生类似于以下内容的输出:
第一个节点上的 geth
启动后,应保持其运行,并应从树莓派节点上启动另一个geth
实例。
树莓派节点设置
在树莓派上,需要运行以下命令来启动geth
并将其与其他节点进行同步(在本例中仅一个节点)。以下是命令:
$ ./geth --networkid 786 --maxpeers 5 --rpc --rpcapi web3,eth,debug,personal,net --rpccorsdomain "*" --port 30302 --identity "raspberry"
这应产生类似于以下屏幕截图中显示的输出。当输出中包含显示区块同步已启动
的行时,这意味着节点已成功连接到其对等节点。
树莓派上的 geth。
这可以通过在两个节点上的 geth
控制台中运行命令来进一步验证,如下面的截图所示。只需在树莓派上运行以下命令即可连接到 geth
客户端:
$ geth attach
这将打开用于与 geth
节点交互的 JavaScript geth
控制台。我们可以使用 admin.peers
命令来查看连接的对等节点:
在树莓派上运行的 geth 控制台 admin peers 命令
类似地,可以通过在第一个节点上运行以下命令来连接到 geth
实例:
$ geth attach ipc:.ethereum/privatenet/geth.ipc
一旦控制台可用,可以运行 admin.peers
命令来显示其他连接节点的详细信息,如下面的截图所示:
在其他对等节点上运行的 geth 控制台 admin peers 命令
一旦两个节点都启动,可以安装进一步的先决条件来设置实验。需要安装 Node.js 和相关的 JavaScript 库。
安装 Node.js
这里列出了所需的库和依赖项。首先需要在树莓派 Raspbian 操作系统上更新 Node.js 和 npm。为此,可以按照以下步骤进行操作:
- 使用以下命令在树莓派上安装最新的 Node.js:
$ curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
这应该显示类似以下的输出。输出内容相当多,因此以下截图仅显示了输出的顶部部分:
安装 Node.js
- 通过
apt-get
运行更新:
$ sudo apt-get install nodejs
可通过运行以下命令执行验证,以确保正确安装了 Node.js 和 npm 的正确版本,如下面的截图所示:
npm 和 node 安装验证
需要注意的是,这些版本并非必须;最新版本的 npm 和 Node.js 中的任何版本都应该可以使用。但是,本章的示例使用 npm 4.0.5 和 node v7.4.0,因此建议读者使用相同版本,以避免任何兼容性问题。
- 安装以启用 JavaScript 代码访问以太坊区块链的 Ethereum
web3
npm:
确保安装了截图中显示的特定版本的 web3
或类似版本,例如 0.20.2。这很重要,因为默认情况下将安装 1.0.0-beta.26 版本(写作时的版本),该版本为 beta 版本,正在开发中。因此,本例应使用 web3
0.20.2 或 0.18.0 稳定版本。读者可以通过 $ npm install web3@0.20.2
命令安装此版本。
npm install web3
- 类似地,可以安装 npm
onoff
,以与树莓派进行通信并控制 GPIO:
$ npm install onoff
安装 Onoff
安装了所有先决条件之后,可以进行硬件设置。为此,可以使用面包板和一些电子元件构建一个简单的电路。
硬件组件列示如下:
-
LED: 轻发光二极管的缩写,可以用作事件的视觉指示。
-
电阻: 需要一个 330 欧姆的元件,根据其额定值对通过的电流提供阻力。对于本实验无需了解其背后的理论;任何标准的电子工程文本都详细介绍了所有这些主题。
-
面包板: 这提供了一种不需要焊接就可以建立电子电路的方法。
-
T 形导线: 此导线如下图所示插入到面包板上,并提供了树莓派的通用输入/输出(GPIO)管脚的标记视图。
-
排线连接器: 这只是用于通过 GPIO 在树莓派和面包板之间提供连通性。所有这些组件如下图所示:
所需组件
电路
如下图所示,LED 的正腿(长腿)连接到 GPIO 的21管脚,负腿(短腿)连接到电阻,然后连接到 GPIO 的地(GND)管脚。一旦连接设置好,可以简单地使用排线连接到树莓派的 GPIO 连接器。
面包板上的组件连接
一旦连接正确设置,并且树莓派已经更新了适当的库和 Geth,下一步就是开发一个简单的智能合同,该合同期望一个值。如果提供给它的值不是它期望的,它就不会触发一个事件。然而,如果传递的值与正确的值匹配,事件就会触发,这个事件可以被在通过 Node.js 运行的客户端 JavaScript 程序读取。当然,Solidity 合同可能非常复杂,也可以处理发送到它的以太,如果以太的数量等于所需数量,那么事件就能触发。然而,在这个例子中,目标是展示使用智能合同来触发事件,然后通过 Node.js 上运行的 JavaScript 程序读取这些事件,然后借此可以使用各种库来触发物联网设备上的操作。
智能合同源代码如下:
简单 IOT 的 Solidity 代码
可以使用在线 Solidity 编译器(Remix IDE)来运行和测试本合同。与该合同交互所需的应用二进制接口(ABI)也可在详情部分找到,如下截图所示:
来自 Remix IDE 的 ABI
以下是合同的 ABI:
[
{
"constant": false,
"inputs": [
{
"name": "x",
"type": "uint8"
}
],
"name": "getRent",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "returnValue",
"type": "bool"
}
],
"name": "roomRented",
"type": "event"
}
]
树莓派节点可以通过web3
接口连接到私有区块链有两种方法。第一种是树莓派设备在本地运行自己的geth
客户端并维护其分类账,但对于资源受限的设备,在某些情况下,不可能运行完整的geth
节点甚至是轻节点。在这种情况下,可以使用第二种方法,该方法使用web3
提供程序连接到适当的 RPC 通道。这将在客户端 JavaScript Node.js 程序中稍后显示。
这两种方法的比较如下图所示:
房屋租赁物联网应用程序的应用架构(带本地分类账的物联网设备)
房屋租赁物联网应用程序的应用架构(不带本地分类账的物联网设备)
公开 RPC 接口会引发明显的安全问题;因此,建议仅在私有网络上使用此选项,如果需要在公共网络上使用,则应采取适当的安全措施,例如仅允许已知 IP 地址连接到geth
RPC 接口。可以通过禁用对等发现机制和 HTTP-RPC 服务器监听接口的组合来实现这一点。
可以使用geth help
获取有关此的更多信息。传统的网络安全措施,如防火墙、传输层安全性(TLS)和证书也可以使用,但在本示例中未讨论。现在,Truffle 可以用于将合同部署到私有网络 ID 786
,此时树莓派连接到该网络。可以通过使用以下显示的命令简单执行 Truffle 部署;
$ truffle migrate
应该产生类似以下截图的输出:
Truffle 部署
一旦合同正确部署,可以开发 JavaScript 代码,该代码将通过web3
连接到区块链,监听区块链中智能合同的事件,并通过树莓派点亮 LED。index.js
文件的 JavaScript 代码如下所示:
var Web3 = require('web3');
if (typeof web3 !== 'undefined')
{
web3 = new Web3(web3.currentProvider);
}else
{
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:9002"));
//http-rpc-port
}
var Gpio = require('onoff').Gpio;
var led = new Gpio(21,'out');
var coinbase = web3.eth.coinbase;
var ABIString = '[{"constant":false,"inputs":[{"name":"x","type":"uint8"}],"name":"getRent","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"returnValue","type":"bool"}],"name":"roomRented","type":"event"}]';
var ABI = JSON.parse(ABIString);
var ContractAddress = '0x975881c44fbef4573fef33cccec1777a8f76669c';
web3.eth.defaultAccount = web3.eth.accounts[0];
var simpleiot = web3.eth.contract(ABI).at(ContractAddress);
var event = simpleiot.roomRented( {}, function(error, result) { if (!error)
{
console.log("LED On");
led.writeSync(1);
}
});
请注意,在上面的示例中,变量var ContractAddress
的合同地址'0x975881c44fbef4573fef33cccec1777a8f76669c'
是特定于部署的,当读者运行此示例时将会不同。只需在文件中将地址更改为部署合同后看到的内容即可。
还要注意树莓派上启动的 Geth 的 HTTP-RPC 服务器监听端口。默认情况下,它是 TCP 端口8545
。记得根据您的树莓派设置和 Geth 配置更改此端口。在上面的示例代码中,它设置为9002
,因为树莓派上运行的 Geth 在该示例中正在监听9002
。如果您的树莓派上的监听端口不同,请将其更改为该端口:
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:9002"));
当 Geth 启动时,它会显示它正在监听的 HTTP 端口。这也可以通过在 geth
中使用 --rpcport
并将端口号值作为标志的参数来配置。
这段 JavaScript 代码可以放在树莓派上的一个文件中,例如 index.js
。它可以通过以下命令运行:
$ node index.js
这将启动程序,该程序将在 Node.js 上运行,并监听来自智能合约的事件。一旦程序正确运行,就可以使用 Truffle 控制台调用智能合约,如下图所示。
在这种情况下,将调用 getRent
函数,并传入参数 10
,这是预期的值:
与合约的交互
合约被挖出后,将触发 roomRented
,从而打开 LED 灯。
在这个例子中,它是一个简单的 LED 灯,但它可以是任何可以通过执行器控制的物理设备,比如房间锁。如果一切顺利,LED 将在智能合约函数调用的结果下打开,如下图所示:
带有 LED 控制的 Raspberry Pi
另外,在节点端,它会显示类似于下图的输出:
$ node index.js
LED On
正如前面的例子所示,可以建立一个私有网络的物联网设备,每个节点上运行一个 geth
客户端,并可以监听来自智能合约的事件,并相应地触发一个动作。所示的例子故意简单,但演示了使用物联网设备以及智能合约驱动的物理设备控制来构建以太坊网络的基本原理。
在下一节中,将讨论区块链技术在政府、金融和卫生等领域的其他应用。
政府
目前正在研究区块链的各种应用,可以支持政府职能,并将当前的电子政府模式提升到一个新的水平。首先,在本节中,将提供一些电子政府的背景信息,然后将讨论一些用例,如电子投票、国土安全(边境控制)和电子身份证(公民身份证)等。
政府或电子政府是一种利用信息和通信技术向公民提供公共服务的范例。这个概念并不新鲜,并已在世界各国实施,但是随着区块链的出现,一条新的探索途径已经打开。许多政府正在研究利用区块链技术管理和提供公共服务的可能性,包括但不限于身份证、驾驶证、各个政府部门之间的安全数据共享和合同管理。区块链的透明度、可审计性和完整性是可以有效管理各种政府职能的属性。
边境控制
自动边境管制系统已经使用了几十年,以阻止非法入境并防止恐怖主义和人口贩卖。
机读旅行证件,特别是生物识别护照,为自动边境管制铺平了道路;但是当前系统在某种程度上受到限制,区块链技术可以提供解决方案。国际民航组织(ICAO)在文件 ICAO 9303(www.icao.int/publications/pages/publication.aspx?docnum=9303
)中定义了机读旅行证件(MRTD)标准,并已被世界上许多国家实施。
每个护照都包含各种安全和身份属性,可用于识别护照持有人,并且可以防止篡改护照的尝试。这些包括生物特征,如视网膜扫描、指纹、面部识别,以及标准的国际民航组织指定的特征,包括机读区(MRZ)和其他可在护照第一页看到的文本属性。
当前边境管制系统的一个关键问题是数据共享,其中系统由单一实体控制,数据不会被立即共享给执法机构。这种无法共享数据的能力使得跟踪疑似旅行文件或个人变得具有挑战性。另一个问题与立即实施旅行文件黑名单相关,例如,当有必要立即跟踪和控制疑似旅行文件时。目前,没有可用的机制立即将疑似护照列入黑名单或撤销,并将其广播到全球边境管制口岸。
区块链可以通过在智能合约中维护黑名单来解决这个问题,该黑名单可以根据需要进行更新,并且任何更改都将立即对所有机构和边境管制点可见,从而实现对疑似旅行文件移动的即时控制。可以说,传统的机制,如公钥基础设施(PKIs)和点对点网络,也可以用于此目的,但它们不能提供区块链可以提供的好处。使用区块链,整个系统可以简化,而不需要复杂的网络和 PKI 设置,这也将导致成本降低。此外,基于区块链的系统将提供加密保证的不可变性,有助于审计并遏制任何欺诈行为。
由于可扩展性问题,目前可能无法将所有旅行文件的完整数据库存储在区块链上,但可以使用后端分布式数据库,如 BigchainDB、IPFS 或 Swarm。在这种情况下,可以在简单的智能合约中存储一个旅行文件的哈希,其中包含个人的生物特征 ID 的哈希,然后可以使用文件系统(如 IPFS)中可用的详细数据的文件哈希来引用文档的哈希。这样,当网络中的任何地方将旅行文件列入黑名单时,该信息将立即可用,并具有整个分布式分类帐的真实性和完整性的密码保证。这种功能也可以在反恐活动中提供足够的支持,从而在政府的国土安全职能中发挥重要作用。
Solidity 中的一个简单合约可以定义一个用于存储身份和相关生物识别记录的数组。这个数组可以用来存储关于护照的识别信息。身份可以是护照或旅行文件的 MRZ 的哈希,与 RFID 芯片的生物识别记录连接起来。一个简单的布尔字段可以用来识别被列入黑名单的护照。一旦这个初始检查通过,传统系统可以执行进一步详细的生物识别验证,最终当对护照持有人的入境决定做出时,该决定可以传播回区块链,从而使网络上的所有参与者可以立即分享决定的结果。
建立基于区块链的边境控制系统的高级方法可以可视化如下图所示。在这种情况下,护照被提供给 RFID 和页面扫描仪进行扫描,后者读取数据页面并提取机器可读信息以及存储在 RFID 芯片中的生物识别数据的哈希值。在这个阶段,还会拍摄护照持有者的实时照片和视网膜扫描。然后,将此信息传递给区块链,其中一个智能合约负责通过首先检查其黑名单护照列表来验证旅行文件的合法性,然后从后端 IPFS 数据库请求更多数据进行比较。请注意,诸如照片或视网膜扫描之类的生物识别数据不存储在区块链上,而是只在后端(IPFS 或 BigchainDB)存储对此数据的引用。
如果所呈现的护照数据与 IPFS 中的文件或 BigchainDB 中持有的数据匹配,并且通过智能合约的逻辑检查,则可以打开边境闸门。
使用区块链的自动边境控制
经过验证,此信息在整个区块链上传播,并立即对边境控制区块链上的所有参与者可用。这些参与者可以是各国国土安全部门的全球联盟。
投票
在任何政府中投票是一个关键功能,允许公民参与民主选举过程。尽管投票已经发展成为一个更加成熟和安全的过程,但它仍然存在需要解决的限制以达到期望的成熟水平。通常,当前投票系统的限制围绕欺诈、运营流程的弱点以及尤其是透明度展开。多年来,已经建立了安全投票机制(机器),使用了承诺安全和隐私的专用投票机,但它们仍然存在可以被利用来颠覆这些机器安全机制的漏洞。这些漏洞可能对整个投票过程产生严重影响,并导致公众对政府的不信任。
基于区块链的投票系统可以通过引入端到端的安全性和透明度来解决这些问题。安全性以公钥加密的形式提供,这是区块链的标准。此外,区块链保证的不可变性确保了一旦投票就不能再次投票。这可以通过使用生物特征和智能合约维护已经投票列表来实现。例如,智能合约可以维护一个已经投票的列表,其中包含生物特征 ID(例如指纹),并可以使用该列表来检测和阻止重复投票。其次,零知识证明(ZKPs)也可以在区块链上用于保护选民的隐私。
一些公司已经提供了这样的服务,一个例子是 polys.me/blockchain/online-voting-system
。
最近,塞拉利昂通过区块链技术举行了总统选举,使其成为第一个使用区块链技术进行选举的国家(www.coindesk.com/sierra-leone-secretly-holds-first-blockchain-powered-presidential-vote/
)。
公民身份识别(身份证)
当前,各国发行电子身份证或国民身份证。这些卡片安全,并具有许多安全功能,可防止复制或篡改企图。然而,随着区块链技术的出现,可以对此过程进行多项改进。
数字身份不仅限于政府发行的身份证,它也适用于在线社交网络和论坛。可以为不同目的使用多个身份。基于区块链的在线数字身份允许控制个人信息的分享。用户可以看到谁使用了他们的数据以及出于什么目的,并可以控制对其访问。这是目前由中心控制的基础设施无法实现的。关键好处在于政府发放的单一身份可以通过单一政府区块链轻松、透明地用于多项服务。在这种情况下,区块链充当平台,政府为多项服务,如养老金、税收或福利,提供了永久的记录。通过数字身份进行的每一次更改和交易都有永久记录,从而确保了系统的完整性和透明性。此外,公民可以在区块链上公证出生证明、结婚证书、契约等许多其他文件,并将其与数字身份关联作为存在的证明。
目前,各个国家都有成功实施的身份计划,运作良好,有人认为也许身份管理系统并不需要区块链。尽管目前区块链技术还不够成熟,但可能并未准备好用于现实世界的身份系统。然而,各国政府正在进行研究,探索区块链在身份管理方面的应用。
此外,像被遗忘权这样的法律可能因为区块链的不可变特性而很难整合。
其他杂项
区块链技术可以用于改善各种政府功能的成本和效率,包括税收征收、福利管理和发放、土地所有权记录管理、生活事件登记(婚姻、出生)、机动车登记和许可证等。这并不是一个详尽的清单,随着时间的推移,政府的许多功能和流程都可以适应基于区块链的模式。区块链的关键好处,比如不可变性、透明性和去中心化,有助于改善大多数传统政府系统。
健康
医疗行业也被确定为另一个可以通过采用区块链技术获益的主要行业。区块链提供了一个传统点对点网络无法提供的不可变、可审计和透明的系统。此外,与传统的复杂 PKI 网络相比,区块链提供了一种成本效益高、基础设施更简单的基础设施。在医疗保健领域,主要问题包括隐私泄露、数据泄露、高成本和欺诈,这些问题都是由于互操作性、过度复杂的流程、透明度、可审计性和控制不足而引起的。另一个迫切的问题是假药;尤其是在发展中国家,这是一个主要的关注点。
随着区块链在医疗领域的适应性,可以实现多种好处,从节约成本、增加信任、理赔处理速度更快、高可用性、由于操作程序复杂性而导致的没有操作错误,到预防假药的分发。
从另一个角度来看,提供数字货币作为挖矿激励的区块链可以用来提供处理能力以解决可以帮助找到某些疾病治愈方法的科学问题。例如,FoldingCoin 就是一个例子,它通过奖励其挖矿者 FLDC 代币来共享其计算机的处理能力,以解决需要异常大计算量的科学问题。
FoldingCoin 的网址为 foldingcoin.net/
。
另一个类似的项目叫做 CureCoin,网址为 www.curecoin.net/
。目前还不清楚这些项目在实现其目标方面将会有多成功,但这个想法非常有前途。
金融
区块链在金融行业有许多应用。区块链在金融领域是目前行业内最热门的话题,主要银行和金融组织正在研究如何适应区块链技术,主要是因为它具有极具潜力的节省成本的潜力。
保险
在保险行业,区块链技术可以帮助阻止欺诈性索赔,提高理赔处理速度,并实现透明度。想象一下,所有保险公司之间共享的账本可以提供一个快速高效的机制来处理公司间的索赔。此外,随着物联网和区块链的融合,可以想象到一个智能设备生态系统,在这个生态系统中,所有这些设备可以通过区块链上的智能合约进行协商和管理其保险政策。
区块链可以减少处理索赔所需的总体成本和工作量。索赔可以通过智能合约自动验证和支付,以及与保险投保人的身份相关联。例如,借助 Oracle 和可能的物联网,智能合约可以确保在发生事故时记录相关遥测数据,并根据这些信息释放付款。如果智能合约在评估付款条件后得出结论认为不应释放付款,则还可以暂停付款。例如,在授权修车厂未修复车辆或在指定区域外使用等情况下等等。智能合约可以评估多种条件来处理索赔,选择这些规则取决于保险人,但总体想法是智能合约与物联网和 Oracle 结合起来可以自动化整个车辆保险行业。
几家初创公司,如 Dynamis,已提出基于以太坊区块链运行的智能合约的点对点保险平台。最初,这被建议用于失业保险,并不需要在模型中有承保人。
它可在 dynamisapp.com/
上获取。
交易后结算
这是区块链技术最受追捧的应用。目前,许多金融机构正在探索使用区块链技术简化、自动化和加速昂贵而耗时的交易后结算流程的可能性。
为了更好地理解问题,简要描述了交易生命周期。交易生命周期包括三个步骤:执行、清算和结算。执行涉及两个当事方之间的交易承诺,并可通过前台订单管理终端或交易所输入到系统中。清算是下一步,根据价格和数量等某些属性,将交易匹配给卖方和买方。在这个阶段,还会确定涉及付款的帐户。最后,结算是买方和卖方最终交换证券以换取付款的地方。
在传统的交易生命周期模型中,需要中央清算所来促进各方之间的交易,它承担了双方的信用风险。当前方案有些复杂,卖方和买方必须采取复杂的路径来进行交易。这包括各种公司、经纪人、结算所和托管人,但通过区块链,一个具有适当智能合约的单一分布式账本可以简化整个过程,并使买卖双方可以直接交流。
值得注意的是,交易后结算流程通常需要两到三天,并且依赖于中央清算机构和对账系统。通过共享账本的方法,区块链上的所有参与者可以立即看到有关交易状态的一个真实版本。此外,点对点结算是可能的,这将减少交易结算所需的复杂性、成本、风险和时间。最后,通过在区块链上使用适当的智能合同,可以消除中间人。此外,监管机构还可以查看区块链以进行审计和监管要求。
这在实施 MIFID-II 监管要求时可能非常有用(www.fca.org.uk/markets/mifid-ii
)。
金融犯罪预防
了解您的客户(KYC)和反洗钱(AML)是防范金融犯罪的关键因素。在 KYC 的情况下,目前,每个机构维护着自己的客户数据副本,并通过中心化数据提供商进行验证。这可能是一个耗时的过程,并可能导致新客户入职过程延迟。
区块链可以通过在所有金融机构之间安全地共享包含客户已验证和真实身份的分布式分类账来解决这一问题。只有通过参与者之间的共识才能更新这个分布式账本,从而提供透明性和可审计性。这不仅可以降低成本,还可以更好地、更一致地满足监管和合规要求。
在 AML 的情况下,由于区块链的不可变、共享和透明特性,监管机构可以轻松获准访问私有区块链,从中获取相关监管报告的数据。这还将减少与从各种传统和不同系统获取数据并将其聚合和格式化用于报告目的相关的成本和复杂性。区块链可以提供加密安全、真实验证、可审计的系统中所有金融交易的单一共享视图,从而降低当前采用的监管报告方法所带来的成本和复杂性。
媒体
媒体行业的关键问题围绕着内容分发、权利管理和向艺术家支付版税。例如,数字音乐可以无限制地复制,任何尝试应用复制保护的努力都以某种方式被破解。没有对音乐人或词曲作者制作的内容的分发进行控制;可以无限制地复制所需次数,并且对版税支付产生影响。此外,支付并不总是有保证的,并且是基于传统的播放时长数据。围绕复制保护和版税支付的所有这些问题可以通过将消费者、艺术家和行业中的所有参与者连接起来解决,从而实现透明和对流程的控制。区块链可以提供一个网络,数字音乐在密码学上被保证只由付费的消费者拥有。这种支付机制由智能合约而不是集中式媒体机构或管理机构控制。支付将根据嵌入在智能合约中的逻辑和下载次数自动进行。
最近的一个这样的倡议的例子是 Musicoin (musicoin.org
)。
此外,数字音乐文件的非法复制可以完全停止,因为一切都以透明的方式记录和不可变地拥有在区块链上。例如,音乐文件可以存储有所有者信息和时间戳,可以在整个区块链网络中进行跟踪。此外,拥有某些内容的合法副本的消费者与其所拥有的内容在密码学上是绑定的,除非得到所有者的许可,否则不能转移到另一个所有者名下。一旦所有数字内容都被不可变地记录在区块链上,版权和转移就可以通过区块链轻松管理。智能合约可以控制对所有相关方的分发和支付。
摘要
区块链技术有许多应用,正如在本章中讨论的那样,它们可以在各个行业中实施,为现有解决方案带来多重好处。本章讨论了可以从区块链中受益的五个主要行业。首先讨论了物联网(IoT),这是另一种革命性的技术;通过将其与区块链相结合,可以解决一些基本限制,为物联网行业带来巨大的好处。物联网受到更多关注,因为它是最突出、最准备好的适应区块链技术的候选者。
已经出现了实际的使用案例和平台,以平台即服务(PaaS)的形式出现,用于基于区块链的物联网,例如 IBM Watson IoT 区块链。IBM Blue Horizon 现在也可供实验使用,这是一个分散的基于区块链的物联网网络。其次,讨论了政府部门的应用,各种政府流程,如国土安全、身份证和福利发放可以变得更加透明、安全和强大。
此外,还讨论了金融领域的问题,以及区块链技术可能提供的解决方案。尽管金融行业正在充满热情和活力地探索使用区块链的可能性,但离生产就绪的基于区块链的系统还有很长的路要走。最后,还讨论了健康领域和音乐产业的某些方面。所有这些用例以及行业中更多的内容都依赖于区块链技术的核心属性,例如去中心化、透明度、可靠性和安全性。然而,在区块链技术完全适应之前,需要解决一些挑战;这些将在下一章中讨论。
第十六章:可扩展性及其他挑战
本章旨在介绍在区块链成为主流技术之前需要解决的各种挑战。尽管已经开发了各种用例和概念验证系统,并且该技术在许多场景下运行良好,但仍然需要解决一些存在于区块链中的根本性限制,以使这项技术更具适应性。
在这些问题清单的顶部是可扩展性,然后是隐私。这两者都是需要解决的重要限制,特别是在区块链被设想用于对隐私要求较高的行业时。在金融、法律和医疗等领域,对交易机密性有特定要求,而可扩展性通常是一个关注点,因为区块链未达到用户期望的充足性能水平。这两个问题正在成为阻碍区块链技术更广泛接受的因素。
将在本章中全面介绍当前提出的和正在进行的针对这两个特定领域的研究。除了隐私和安全性之外,其他挑战包括监管、整合、适应性和一般安全性。尽管在比特币区块链中安全性无懈可击,并经受住了时间的考验,但仍然存在一些情况可能会导致安全性在某些微妙的情景下受到损害的注意事项。此外,对于其他区块链,如以太坊,存在一些合理的安全性问题,涉及智能合约、拒绝服务攻击和大规模攻击面。所有这些将在下面的章节中详细讨论。
可扩展性
这个问题在过去几年中一直是激烈辩论、严格研究和媒体关注的焦点。
这是可能决定区块链更广泛适用性的最重要的问题之一,否则只能由财团限制性地进行个人使用。由于在这一领域进行了大量研究,提出了许多解决方案,这些解决方案将在下一节中讨论。
从理论上讲,解决可扩展性问题的一般方法通常围绕协议级别的增强。例如,解决比特币可扩展性的常见方法是增加其区块大小。其他提议包括将某些处理转移到链下网络的链下解决方案,例如链下状态网络。基于上述解决方案,一般而言,提议可以分为两类:链上解决方案,其基于改变区块链操作的基本协议的想法,以及链下解决方案,其利用链下的网络和处理资源以增强区块链。
最近,米勒等人在其位置论文关于扩展分散式区块链(doi.org/10.1007/978-3-662-53357-4_8
)中提出了解决区块链限制的另一种方法。在本文中,表明了区块链可以被划分为称为平面的各种抽象层。每个平面负责执行特定的功能。这些包括网络平面、共识平面、存储平面、视图平面和边平面。这种抽象允许在每个平面上单独且有条不紊地解决瓶颈和限制。下面的子节中简要概述了每个层,并参考了比特币系统。
网络平面
首先,讨论了网络平面。网络平面的一个关键功能是交易传播。在前述论文中已经确定,在比特币中,由于节点在传播和重复交易之前进行交易验证的方式,导致了网络带宽的低效利用,首先在交易广播阶段,然后在挖矿后的区块中。
应该注意到,BIP 152(Compact Block Relay,github.com/bitcoin/bips/blob/master/bip-0152.mediawiki
)已经解决了这个问题。
共识平面
第二层被称为共识平面。该层负责挖矿和达成共识。该层的瓶颈围绕着 PoW 算法的限制,增加共识速度和带宽会导致牺牲网络安全性,因为分叉数量增加。
存储平面
存储平面是第三层,用于存储总账。该层的问题围绕着每个节点需要保存整个总账的需求,这导致了某些效率低下,例如增加的带宽和存储需求。比特币有一种可用的方法叫做修剪,它允许节点在不需要保留完整区块链的情况下运行。修剪意味着当比特币节点下载并验证了区块链后,它会删除已经验证过的旧数据。这节省了存储空间。从存储角度来看,这项功能带来了重大改进。
视图平面
接下来是视图平面,提出了一个基于这样一个建议的优化,即比特币矿工不需要完整的区块链来运行,并且可以从完整的总账构建视图,作为系统整体状态的表示,这对于矿工的功能是足够的。视图的实现将消除挖矿节点存储完整区块链的需求。
最后,提出了前述研究论文的作者的旁观面。该面板代表着链下交易的概念,其中支付或交易通道的概念被用来卸载参与者之间的交易处理,但仍由主比特币区块链支持。
上述模型可用于以结构化的方式描述当前区块链设计的限制和改进。此外,过去几年中提出了几种可以解决当前以太坊和比特币等区块链设计限制的一般策略。这些方法也在以下部分中以个别方式进行特征化和讨论。
区块大小增加
这是增加区块链性能(交易处理吞吐量)最受争议的提案。目前,比特币每秒只能处理约三到七笔交易,这是适应比特币区块链处理微交易的主要限制因素。比特币的区块大小硬编码为 1 MB,但如果增加区块大小,它可以容纳更多交易并且可以缩短确认时间。有几个比特币改进提案(BIPs)支持增加区块大小。这些包括 BIP 100、BIP 101、BIP 102、BIP 103 和 BIP 109。
历史参考资料和讨论的优秀账户可在en.bitcoin.it/wiki/Block_size_limit_controversy
找到。
在以太坊中,区块大小不是通过硬编码来限制的;相反,它由燃气限制来控制。理论上,以太坊中的区块大小没有限制,因为它取决于燃气的数量,而燃气可以随着时间增加。这是可能的,因为如果在前一个区块中已经达到了限制,矿工被允许为后续区块增加燃气限制。比特币隔离见证通过将见证数据与交易数据分开处理来解决了这个问题,从而为交易提供了更多的空间。比特币的其他提案包括比特币无限制、比特币 XT 和比特币现金。读者可以参考第八章,介绍比特币,以获取更多详情。
获取更多信息,请参考以下链接:
区块间隔减少
另一个提案是减少每个区块生成之间的时间。可以减少区块之间的时间以实现更快的区块最终确认,但由于分叉数量的增加,可能会导致安全性降低。以太坊的区块时间已达到约 14 秒。
这是比特币区块链的重大改进,比特币区块链生成新区块需要 10 分钟的时间。在以太坊中,由于区块之间的时间较短导致的孤立区块问题通过使用贪婪最重观察子树(GHOST)协议得到缓解,即孤立区块(叔块)也被用于确定有效链。一旦以太坊转向股权证明(PoS),这将变得无关紧要,因为不再需要挖矿,几乎可以立即完成交易的最终确定。
可逆布隆查找表
这是另一种旨在减少比特币节点之间传输数据量的方法。可逆布隆查找表(IBLTs)最初是由加文·安德森提出的,这种方法的关键吸引力在于,如果实施,它不会导致比特币的硬分叉。其关键思想是基于这样一个事实:没有必要在节点之间传输所有交易;相反,只需传输那些尚未在同步节点的交易池中可用的交易。这样可以在节点之间更快地同步交易池,从而提高比特币网络的整体可扩展性和速度。
分片
分片并不是一种新技术,在可扩展性方面已经被分布式数据库如 MongoDB 和 MySQL 使用。分片背后的关键思想是将任务分割成多个块,然后由多个节点进行处理。这样做可以提高吞吐量并减少存储需求。在区块链中,采用了类似的方案,其中网络的状态被分成多个分片。状态通常包括余额、代码、nonce 和存储。分片是运行在同一网络上的区块链的松散耦合分区。关于分片间通信和每个分片历史的共识存在一些挑战。这是一个开放的研究领域。
状态通道
这是另一种用于加速区块链网络上交易的方法。基本思想是使用侧通道来更新状态并处理主链之外的交易;一旦状态被最终确定,它就会被写回主链,从而将耗时的操作从主区块链中卸载出来。
状态通道通过执行以下三个步骤工作:
-
首先,区块链状态的一部分被锁定在智能合约下,确保参与者之间的协议和业务逻辑。
-
现在开始参与者之间的链下交易处理和交互,暂时只在他们之间更新状态。在此步骤中,几乎可以执行任意数量的交易而无需区块链,这是使该过程快速并成为解决区块链可扩展性问题的最佳候选方案的原因。然而,可以说这不是真正的在区块链上的解决方案,例如,分片,但最终结果是一个更快,更轻,更健壮的网络,这可能在微支付网络,物联网网络和许多其他应用中非常有用。
-
一旦达到最终状态,状态通道将关闭,并将最终状态写回主区块链。在此阶段,区块链的锁定部分也将被解锁。
此过程如下图所示:
状态通道
这种技术已经在比特币闪电网络和以太坊的雷电网络中使用。
私有区块链
私有区块链本质上是快速的,因为不需要真正的去中心化,参与网络的成员也不需要挖矿;相反,他们只能验证交易。这可以被视为公共区块链中可扩展性问题的一种变通方法;然而,这并不是解决可扩展性问题的方法。另外,需要注意的是,私有区块链仅适用于特定领域和设置,例如所有参与者都已知的企业环境。
股权证明
与工作量证明(PoW)不同,基于 PoS 算法的区块链基本上更快。 PoS 在第十章 替代硬币中有更详细的解释。
侧链
通过允许许多侧链与主区块链一起运行,并允许使用可能相对不太安全且更快的侧链执行交易但仍与主区块链挂钩,侧链可以间接提高可扩展性。侧链的核心思想称为双向锚定,它允许从父链向侧链和反向传输币。
子链
这是由彼得·R·里宗最近提出的一种相对较新的技术,其基本思想是基于弱块的概念,这些弱块在层层叠加直到找到一个强块为止。弱块可以定义为那些未能通过标准网络难度标准进行挖掘但已经完成足够工作以满足另一个更弱难度目标的块。矿工可以通过将弱块层层叠加在一起来构建子链,除非找到符合标准难度目标的块。
在这一点上,子链被关闭并成为强块。这种方法的优点包括减少了对交易首次验证的等待时间。这种技术还减少了孤块的产生几率,并加快了交易处理速度。这也是间接解决可扩展性问题的一种方式。子链不需要任何软分叉或硬分叉来实现,但需要社区的接受。
子链研究论文可在www.ledgerjournal.org/ojs/index.php/ledger/article/view/40
处获取。
树链(树)
还有其他提高比特币可扩展性的提议,例如将区块链布局从线性顺序模型更改为树状结构的树链。该树基本上是从主比特币链延伸下来的二叉树。这种方法类似于侧链实现,消除了对主要协议更改或区块大小增加的需求。它允许改进的交易吞吐量。在这个方案中,区块链本身被分割并分布在网络中以实现可扩展性。
此外,验证树链上的区块不需要挖矿;相反,用户可以独立验证区块头。然而,这个想法目前尚未准备好投入生产,需要进一步研究以使其实用化。
最初的想法是在研究论文eprint.iacr.org/2016/545.pdf
中提出的。
除了前述的一般技术外,Christian Decker (scholar.google.ch/citations?user=ZaeGlZIAAAAJ&hl=en
) 在他的书籍《论比特币的可扩展性和安全性》中还提出了一些比特币特定的改进。该提议基于加速传播时间的想法,因为当前的信息传播机制导致了区块链分叉。这些技术包括验证最小化、区块传播的流水线化和连接性增加。这些变化不需要基本协议级别的更改;相反,这些变化可以独立于比特币节点软件中实施。
关于验证最小化,已经注意到区块验证过程导致了传播延迟。这背后的原因是节点花费了很长时间来验证区块和区块内的交易的唯一性。有人建议,一旦完成了初始的 PoW 和区块验证检查,节点就可以发送清单消息。通过只执行第一次难度检查,而不必等待交易验证完成,可以改善传播效率。
区块传播
除了前述的提案外,还提出了块传播的流水线化,这是基于预期一个区块的可用性的想法。在这个方案中,区块的可用性已经宣布,而不必等待实际的区块可用性,从而减少节点之间的往返时间。最后,交易发起者和节点之间的长距离也导致了块传播的减速。Christian Decker 进行的研究表明连接增加可以减少区块和交易的传播延迟。这是可能的,因为如果任何时候比特币节点连接到许多其他节点,那么它将减少节点之间的距离,并且可以加快网络上的信息传播速度。
解决可扩展性问题的一种优雅的方案很可能是一些或所有前述一般方法的组合。针对解决区块链中的可扩展性和安全性问题所采取的一些举措现在几乎已经准备好实施或已经实施。例如,比特币隔离见证(SegWit)是一个可以大大提高可扩展性的提案,只需要软分叉才能实施。所谓隔离见证背后的关键思想是将签名数据与交易分离,从而解决交易可变性问题并允许增加区块大小,从而提高吞吐量。
Bitcoin-NG
另一个提案,基于微区块和领导者选举的 Bitcoin-NG,最近引起了一些关注。其核心思想是将区块分成两种类型,即领导者块(也称为关键块)和微区块:
-
领导者块:这些负责工作证明,而微区块包含实际的交易。
-
微区块:这些不需要任何工作量证明,并由每个区块生成周期选举产生的领导者生成。该区块生成周期是由领导者块发起的。唯一的要求是使用选举产生领导者的私钥对微区块进行签名。选举产生的领导者(矿工)可以以非常高的速度生成微区块,从而提高性能和交易速度。
另一方面,以太坊的一份紫红色论文由 Vitalik Buterin 在上海的以太坊 Devcon2 上提出;它描述了一个可规模化的以太坊的愿景。紫红色提案基于分片和 PoS 算法的结合。该论文确定了一些目标,如通过 PoS 实现的效率提升,最大可能的快速区块时间,经济最终性,可伸缩性,跨分片通信和抗审查。
Mauve paper 可以在docs.google.com/document/d/1maFT3cpHvwn29gLvtY4WcQiI6kRbN_nbCf3JlgR3m_8/edit#
找到。
Plasma
另一个最近的可扩展性提案是Plasma,由 Joseph Poon 和 Vitalik Buterin 提出。该提案描述了在根区块链(以太坊主网)上运行智能合约的想法,并在子区块链上执行大量的交易,将少量的承诺反馈到父链上。在这个方案中,区块链被排列成树状层次结构,只在根(主)区块链上进行挖矿,并向子链传递安全性证明。这也被称为 Layer-2 系统,就像状态通道也在 Layer 2 上运行,而不是在主链上。
研究论文可在plasma.io
找到。
隐私
区块链的交易隐私是人们非常期望的特性。然而,由于其本质,特别是在公开的区块链中,一切都是透明的,因此抑制了它在一些隐私至关重要的行业中的使用,比如金融、医疗等。针对隐私问题已经提出了不同的解决方案,并且已经取得了一些进展。其中包括不可区分性混淆(IO)、同态加密、零知识证明(ZKPs)和环签名等多种技术。
所有这些技术都有其优点和缺点,并将在以下章节中讨论。
不可区分性混淆
这种密码学技术可能成为解决区块链中所有隐私和机密性问题的万能药,但这项技术尚未准备好投入生产部署。IO 允许对代码进行混淆,这是密码学中一个非常成熟的研究课题,如果应用于区块链,可以作为一个不可破解的混淆机制,将智能合约转化为黑匣子。
IO 背后的关键思想是研究人员称之为多线性拼图,它基本上通过将程序代码与随机元素混合来混淆程序代码,如果程序按预期运行,它将产生预期的输出,但以任何其他方式执行都会使程序看起来是随机的垃圾。这个想法最初是由 Shai 等人在他们的研究论文候选不可区分性混淆和所有电路的功能加密中提出的。
此研究论文可在doi.org/10.1109/FOCS.2013.13
找到。
同态加密
这种类型的加密允许对加密数据进行操作。想象一下,数据被发送到云服务器进行处理的情况。服务器对其进行处理并返回输出,而不知道它处理的数据是什么。这也是一个值得研究的领域,全同态加密允许对加密数据进行所有操作,但尚未完全投入生产使用;然而,在这个领域已经取得了重大进展。一旦在区块链上实施,它可以允许在密文上进行处理,从而在本质上保护交易的隐私和保密性。例如,存储在区块链上的数据可以使用同态加密进行加密,然后可以对该数据执行计算,而无需解密,从而在区块链上提供隐私服务。这个概念也已经在一个名为 Enigma 的项目中实现,该项目可在线访问 (www.media.mit.edu/projects/enigma/overview/
),由麻省理工学院媒体实验室开发。Enigma 是一个对等网络,允许多个参与方在不透露数据任何内容的情况下对加密数据进行计算。
原始研究可在此处找到 crypto.stanford.edu/craig/
。
零知识证明
ZKPs 最近在 Zcash 中成功实施,见 Chapter 10, 替代货币。更具体地说,SNARK(简称 简洁非交互式知识论证)已经被实现,以确保区块链上的隐私。
同样的思想也可以在以太坊和其他区块链上实现。在以太坊上整合 Zcash 已经是由以太坊研发团队和 Zcash 公司进行的非常活跃的研究项目。
原始研究论文可在此处找到 eprint.iacr.org/2013/879.pdf
.
另一篇优秀的论文在这里 chriseth.github.io/notes/articles/zksnarks/zksnarks.pdf
.
在零知识证明家族中最近新增了零知识简洁透明知识论证 (ZK-STARKs),这是对 ZK-SNARKs 的改进,因为 ZK-STARKs 消耗的带宽和存储要远远少于 ZK-SNARKs。而且,它们不需要像 ZK-SNARKs 那样的初始、有些有争议的可信设置。此外,ZK-STARKs 比 ZK-SNARKs 快得多,因为它们不使用椭圆曲线,而是依赖哈希。
ZK-STARKs 的原始研究论文可以在这里找到 eprint.iacr.org/2018/046.pdf
.
状态通道
使用状态通道进行隐私保护也是可能的,这仅仅是因为所有交易都是在链下运行,主要的区块链完全看不到交易,除了最终状态的输出,从而确保隐私和保密性。
安全的多方计算
安全多方计算的概念并不新颖,它是基于数据在参与方之间的秘密共享机制下分割成多个部分,然后在不需要在单个机器上重建数据的情况下对数据进行实际处理的概念。处理后产生的输出也在参与方之间共享。
使用硬件提供机密性
可信计算平台可用于提供在区块链上实现交易机密性的机制,例如,可以使用英特尔的软件保护扩展(SGX),它允许代码在一个称为飞地的硬件保护环境中运行。一旦代码在孤立飞地中成功运行,它可以生成一个被英特尔云服务器所证实的证明,称为报价。然而,担心信任英特尔将导致某种程度上的中心化,并且不符合区块链技术的真正精神。尽管如此,这个解决方案有其优点,在现实中,许多平台已经使用英特尔芯片,因此在某些情况下信任英特尔可能是可以接受的。
如果这项技术应用于智能合约,那么一旦节点执行了智能合约,它可以生成报价作为正确和成功执行的证据,其他节点只需验证即可。这个想法还可以通过使用任何可信执行环境(TEE)来进一步扩展,这可以提供与飞地相同的功能,在近场通讯(NFC)和安全元件上甚至可以在移动设备上使用。
CoinJoin
CoinJoin 是一种技术,用于通过互动混合来使比特币交易匿名化。这个想法是基于向来自多个实体的输入和输出形成单个交易而不引起任何改变。它消除了发送方和接收方之间的直接联系,这意味着一个地址不再能与交易相关联,这可能导致用户的识别。CoinJoin 需要多个愿意通过混合支付创建单个交易的参与方之间的合作。因此,应该注意到,如果 CoinJoin 计划中的任何单个参与者未能遵守承诺,即不按照所需签署交易,那么就可能导致拒绝服务攻击。
在这个协议中,没有必要有一个单一的受信任的第三方。这个概念与一个充当受信任的第三方或中介的服务混合是不同的,它允许比特币用户之间的交易混合。这种交易混合导致了追踪和将支付与特定用户联系起来的防止。
保密交易
保密交易利用 Pedersen 承诺来提供保密性。承诺方案允许用户承诺一些值,同时保持秘密,并具有以后披露的能力。设计承诺方案需要满足的两个属性是绑定和隐藏。
绑定确保提交者一旦提交就无法更改所选值,而隐藏属性确保任何对手无法找到提交者所做承诺的原始值。 Pedersen 承诺还允许添加操作,并在承诺上保留交换性质,这使得它特别适用于在比特币交易中提供机密性。换句话说,它支持对值进行同态加密。使用承诺方案可以隐藏比特币交易中的支付值。这个概念已经在 Elements 项目中实现了(https😕/elementsproject.org/).
MimbleWimble
MimbleWimble 方案在比特币 IRC 频道上有些神秘地提出,自那时以来已经获得了很大的流行。MimbleWimble 扩展了保密交易和 CoinJoin 的概念,允许在不需要任何互动的情况下聚合交易。然而,它不支持与标准比特币协议的各种其他特性一起使用比特币脚本语言。这使得它与现有的比特币协议不兼容。因此,它可以作为比特币的一个侧链实现,或者作为另一种替代加密货币。
该方案可以同时解决隐私性和可扩展性问题。 使用 MimbleWimble 技术创建的块不像传统比特币区块链中那样包含交易; 相反,这些块由三个列表组成:输入列表、输出列表和称为剩余量的内容,其中包含签名列表和输出与输入之间的差异。 输入列表基本上是对旧输出的引用,输出列表包含机密交易输出。 这些块通过使用签名、输入和输出进行验证,以确保块的合法性。 与比特币相比,MimbleWimble 交易输出仅包含公钥,并且旧输出与新输出之间的差异由参与交易的所有参与者签名。
安全性
尽管区块链通常是安全的,并根据需要在整个区块链网络中使用非对称和对称加密,但仍然有一些细微差别可能会危及区块链的安全。
有一些交易篡改、日食攻击以及比特币可能发生双重花费的示例,在某些情况下,已经被各种研究人员证明是可行的。 交易篡改打开了双重提取或存款的可能性,允许黑客在比特币网络确认之前更改交易的唯一标识符,从而导致一种看起来似乎不存在交易的情况。 BIP 62 是提出解决此问题的提案之一,与 SegWit 一起。 应该注意,这只在未确认交易的情况下成为问题,也就是说,操作流程依赖于未确认交易的情况下。 对于仅依赖于已确认交易的正常应用程序而言,这不是问题。
在比特币中,信息日食攻击可能导致双重花费。 日食攻击背后的想法是欺骗比特币节点仅连接到攻击者节点 IP。 这打开了攻击者进行 51% 攻击的可能性。 这在比特币客户端 v0.10.1 中已经得到了一定程度的解决。
智能合约安全性
最近,智能合约安全性方面的工作已经开始,特别是正在讨论和研究智能合约的形式验证。 这一切特别是由于臭名昭著的 DAO 黑客攻击而引发。
形式验证是验证计算机程序以确保其满足某些形式化语句的过程。 这现在是一个新概念,有许多可用于其他语言的工具来实现这一点; 例如,Frama-C (frama-c.com
) 可用于分析 C 程序。 形式验证的关键思想是将源程序转换为一组可由自动证明者理解的语句。
为此,通常使用 Why3 (why3.lri.fr
),Solidity 的形式验证器也利用了它。一个实验性但可操作的验证器已经在浏览器 Solidity 中提供。
智能合约安全现在至关重要,还采取了许多其他举措来制定可以分析 Solidity 程序并查找漏洞的方法。最近和重要的一个例子是 Oyente,这是研究人员构建的一个工具,并已在他们的论文《使智能合约更智能》中介绍。
Oyente 可在 github.com/melonproject/oyente
找到。
本文发现并分析了智能合约中的几个安全漏洞。这些包括事务顺序依赖性、时间戳依赖性、异常处理不当,如调用堆栈深度限制利用,以及重入漏洞。事务顺序依赖性漏洞基本上利用了合同的感知状态可能不是执行后合同的状态的情况。
此弱点是一种竞争条件。它也被称为前置负载,并且由于事务在块内的顺序可以被操纵而成为可能。由于所有事务首先出现在内存池中,因此可以在它们被包含在块中之前监视内存池中的事务。这允许在另一个事务之前提交一个事务,从而控制智能合约的行为。
时间戳依赖性漏洞可能存在于块的时间戳被用作合同内某些决策的来源的情况下,但时间戳可以被矿工操纵。调用堆栈深度限制是另一个可能被利用的漏洞,因为 EVM 的最大调用堆栈深度为 1,024 帧。如果在合同执行时达到堆栈深度,则在某些情况下,send 或 call 指令可能会失败,导致资金未支付。调用堆栈深度 bug 已在 EIP 50 硬分叉中得到解决 github.com/ethereum/EIPs/blob/master/EIPS/eip-150.md
。
利用重入漏洞在 DAO 攻击中被利用,将数百万美元转移到子 DAO。重入漏洞基本上意味着在函数的上一次(第一次)调用完成之前可以重复调用该函数。在 Solidity 智能合约中的 Ether 提取函数中,这特别不安全。
除了上述的漏洞外,在编写合同时还应注意几个其他问题。这些漏洞包括向另一个合同发送资金时要小心,因为 send 可能会失败,即使使用 throw 作为捕获所有机制,也无法正常工作。
其他标准软件 bug,如整数溢出和下溢,也非常重要,对 Solidity 中任何整数变量的使用都应谨慎实施。例如,使用 uint8 解析超过 255 个元素的数组的简单程序可能会导致无限循环。这是因为 uint8 限制为 256 个数字。
在接下来的几节中,将分别使用 Remix IDE、Why3 和 Oyente 展示两个合约验证的示例。
形式验证和分析
Solidity 代码的安全性分析现在作为 Remix 中的一个功能提供。代码将被分析以查找漏洞,并在 remix IDE 的分析选项卡中报告:
Remix IDE 分析选项
含有重入漏洞的相同合约的示例输出显示在前述截图底部。
此工具分析了几类漏洞,包括安全性、燃气和经济性。如前述截图所示,分析工具成功检测到了重入漏洞,详细信息显示在屏幕底部。
Why3 也可用于形式分析 Solidity 代码。
Why3 可在 why3.lri.fr/try/
获取。
在以下示例中,显示了一个简单的 Solidity 代码,该代码将 z
变量定义为 uint
的最大限制。当此代码运行时,将返回 0
,因为 uint z
将溢出并重新从 0
开始。这也可以使用 Why3 进行验证,如下所示:
具有形式验证功能的 Solidity 在线编译器
在 Solidity 在线编译器中曾提供将 Solidity 代码转换为 Why3 兼容代码的功能,但现已不再提供。因此,以下示例仅供完整性目的和阐明一个重要的 bug 类别,这些 bug 可以在传统工具中未被检测到。在此示例中,以整数溢出为例。
以下示例显示了 Why3 成功检查并报告整数溢出错误。此工具正在积极开发中,但仍然非常有用。此外,此工具或任何其他类似工具都不是万能药。即使形式验证通常也不应被认为是万能药,因为首先应适当定义规范:
Why3
Oyente 工具
目前,Oyente 作为 Docker 镜像提供方便的测试和安装。它可在 github.com/melonproject/oyente
获取并下载以供测试。
在以下示例中,从 Solidity 文档中提取的一个包含重入漏洞的简单合约已经被测试,并且显示 Oyente 成功分析了代码并发现了漏洞:
带有可重入漏洞的合约,来源:solidity 文档
此示例代码包含可重入漏洞,这基本上意味着如果一个合约正在与另一个合约交互或转移以太币,它实际上是将控制权交给了该另一个合约。这使得被调用的合约可以立即调用回来自被调用合约的函数,而无需等待完成。例如,此漏洞可以允许多次调用前面示例中所示的 withdraw 函数,导致多次获得以太币。这是可能的,因为在函数结束之前股份值未设置为 0
,这意味着任何后续调用都将成功,导致不断提款。
显示了 Oyente 运行分析此处所示合约的示例,如下图所示,分析成功发现了可重入漏洞。建议通过结合 solidity 文档中描述的 Checks-Effects-Interactions 模式来处理此漏洞:
Oyente 工具检测 solidity 漏洞
Oyente 也可在智能合约分析工具中使用,网址为 oyente.melon.fund
。此处显示了示例输出。
通过此示例,我们结束了对 solidity 安全性和分析工具的介绍。这是一个非常丰富的研究领域,预计随着时间的推移会有越来越多的工具可用。
Oyente 分析
总结
在本章中,读者已经被介绍了区块链技术的安全性、保密性和隐私性方面。讨论了隐私,这是将公共区块链应用于各行业的另一个主要阻碍因素。接下来,讨论了智能合约安全性,这是目前一个非常热门的话题。这是一个深度广泛的主题,但已经给出了各个方面的简要介绍,这应该为进一步研究这一领域奠定了坚实的基础。
例如,形式化验证本身是一个广阔的研究领域。此外,还提供了形式化验证的示例,以便读者了解可用的工具。值得注意的是,前面提到的工具正在积极开发中,并且缺乏各种理想的功能。此外,文档相当稀缺;因此,鼓励读者密切关注发展情况,特别是与形式化验证和以太坊 mauve 论文相关的发展,因为它即将迅速发展。区块链安全,尤其是智能合约安全领域现在非常成熟,以至于可以撰写一整本书来讨论此主题。
学术界和商业领域中有许多专家和研究人员在探索这一领域,很快将会有许多自动化工具可用于验证智能合约。目前已经有一个在线工具可用于分析智能合约代码以查找安全漏洞,网址为securify.ch
。