跳转至

第十二章。可扩展性和其他挑战

本章旨在介绍在区块链成为主流技术之前需要解决的各种挑战。尽管已经开发了各种使用案例和概念验证系统,并且该技术在许多情况下运行良好,但仍需要解决区块链存在的一些基本限制,以使该技术更具适应性。

在这些问题中,排在首位的是可伸缩性,然后是隐私。这两个都是需要解决的重要限制,尤其是当区块链被设想用于要求隐私的行业时。金融、法律和医疗行业对交易的保密性有特定的要求,而当区块链达不到用户期望的足够性能水平时,可扩展性通常是一个问题。这两个问题正在成为区块链技术被广泛接受的阻碍因素。本章将对这两个特定领域中目前提出的和正在进行的研究进行综述。除了隐私和安全之外,其他挑战包括监管、集成、适应性和总体安全性。尽管在比特币区块链中,安全性被证明是防弹的,并且经受住了时间的考验,但仍然有一些警告可能会在一些微妙的场景中允许安全性受到一定程度的损害。此外,在其他区块链(如以太坊)中,对于智能合约、拒绝服务攻击和较大的攻击面也有一些合理的安全考虑。所有这些都将在下面的章节中详细讨论。

可扩展性

在过去的几年里,这个问题一直是激烈辩论、严格研究和媒体关注的焦点。这是一个最重要的问题,它可能意味着区块链更广泛的适应性或仅限于财团的有限私人使用之间的差异。由于在这一领域的大量研究,已经提出了许多解决方案,这些方案将在下一节中讨论。

从理论角度来看,解决可伸缩性问题的一般方法通常围绕协议级增强。例如,通常提到的比特币可扩展性的解决方案是增加其块大小。其他提议包括将某些处理卸载到链外网络(例如,链外状态网络)的链外解决方案。基于上面提到的解决方案,一般来说,这些建议可以分为两类:基于改变区块链操作的基本协议的思想的链上解决方案,以及利用链下的网络和处理资源来增强区块链的链下解决方案。

另一个解决区块链局限性的方法是最近由 Miller 和其他人在他们的立场文件中提出的,关于扩展分散的区块链。在这篇文章中,区块链可以被分成各种抽象层,称为平面。每个平面负责执行特定的功能。这些平面包括网络平面、共识平面、存储平面、视图平面和侧面平面。这种抽象允许在每个平面上以结构化的方式单独解决瓶颈和限制。下面给出了每一层的简要概述,并参考了比特币系统。

首先讨论网络平面。网络平面的一个关键功能是事务传播。在上述论文中已经确定,在比特币中,由于节点在事务传播的传播和复制之前执行事务验证的方式,该平面未充分利用网络带宽,首先在事务广播阶段,然后在块中挖掘之后。应该注意的是,这个问题是由 BIP 152 ( 紧凑型闭塞继电器)解决的。

第二层被称为一致层。这一层负责挖掘和达成共识。这一层中的瓶颈围绕着工作证明算法的限制,由此,由于分叉数量的增加,一致性速度和带宽的增加会导致网络安全性的降低。

存储平面是第三层,存储分类账。这一层中的问题围绕着每个节点都需要保留整个分类帐的副本,这导致了某些低效率,例如增加了带宽和存储需求。比特币有一种叫做修剪的方法,它允许节点在不需要下载完整区块链的情况下运行。从存储的角度来看,此功能带来了重大改进。

列表中的下一个是视图平面,它提出了一种优化,该优化基于这样的提议,即比特币矿工不需要完整的区块链来操作,并且可以从完整的分类帐中构建一个视图来表示系统的整个状态,这足以让矿工发挥作用。视图的实现将消除挖掘节点存储完整区块链的需要。

最后,上述研究论文的作者提出了侧平面。这个层面代表了非链交易的概念,即支付或交易渠道的概念被用来卸载参与者之间的交易处理,但仍由主要的比特币区块链支持。

上述模型可用于以结构化的方式描述当前区块链设计中的限制和改进。此外,在过去几年中,已经提出了几个通用策略,可以解决当前区块链设计(如以太坊和比特币)中的限制。这些方法也将在下一节中单独描述和讨论。

块大小增加

这是关于提高区块链性能(事务处理吞吐量)的最有争议的提议。目前,比特币每秒只能处理大约三到七笔交易,这是比特币区块链处理微交易的一个主要抑制因素。比特币的块大小被硬编码为 1 MB,但如果块大小增加,它可以容纳更多的交易,并可以导致更快的确认时间。有几个比特币改进提案 ( BIPs )是为了支持增加区块大小而提出的。这些城市包括 BIP 100、BIP 101、BIP 102、BIP 103 和 BIP 109。在以太坊中,块大小不受硬编码的限制;而是受气限控制。理论上,以太坊中的方块大小没有限制,因为它取决于气体的数量,而气体的数量会随着时间的推移而增加。这是可能的,因为如果在前一区块已经达到极限,矿工可以增加后续区块的气体极限。

闭塞区间缩短

另一个建议是减少每个块生成之间的时间。可以减少块之间的时间以实现更快的块终结,但是由于分叉数量的增加,可能导致安全性降低。以太坊已经实现了大约 14 秒的阻塞时间,有时还会增加。这是对比特币区块链的重大改进,后者需要 10 分钟才能生成一个新区块。在以太坊中,通过使用贪婪最重观察子树 ( 幽灵)协议来缓解由于块之间的时间较短而导致的高孤立块的问题,其中孤立块(叔伯)也被包括在确定有效链中。一旦以太坊转向股权证明,这将变得无关紧要,因为不需要采矿,交易几乎可以立即完成。

可逆布鲁姆查找表

这是已经提出的另一种方法,用于减少需要在比特币节点之间传输的数据量。可逆布鲁姆查找表 ( IBLTs )最初是由加文·安德森提出的,这种方法的关键吸引力在于,如果实施,它不会导致比特币的硬分叉。关键思想是基于这样的事实,即不需要在节点之间转移所有事务;相反,只有那些在同步节点的事务池中不可用的事务才会被传输。这使得节点之间的交易池同步更快,从而提高了比特币网络的整体可扩展性和速度。

分片

分片并不是一种新技术,它已经被用于分布式数据库,如 MongoDB 和 MySQL。分片背后的关键思想是将任务分成多个块,然后由多个节点处理。这导致了吞吐量的提高和存储需求的降低。在区块链,采用了类似的方案,将网络状态划分为多个碎片。状态通常包括余额、代码、现时和存储。碎片是运行在同一网络上的区块链的松散耦合的分区。碎片间的交流和对每个碎片历史的共识有一些挑战。这是一个开放的研究领域。

状态通道

这是为加速区块链网络上的交易而提出的另一种方法。基本思想是使用副通道进行状态更新和处理主链之外的事务;一旦状态完成,它将被写回到主链,从而从主区块链中卸载耗时的操作。状态通道通过执行以下三个步骤来工作:

  1. 首先,区块链国家的一部分被锁定在一个智能合同下,确保参与者之间的协议和业务逻辑。
  2. 现在,参与者之间开始了离线事务处理和交互,现在只在他们之间更新状态。在这一步中,几乎可以执行任意数量的事务,而不需要区块链,这使得该过程变得快速,并且是解决区块链可伸缩性问题的最佳选择。然而,可以认为这不是一个真正的区块链解决方案,例如分片,但最终结果是一个更快、更轻、更强大的网络,可以证明在微支付网络、物联网网络和许多其他应用中非常有用。
  3. 一旦达到最终状态,状态通道关闭,最终状态被写回到主区块链。在这个阶段,区块链的锁定部分也被解锁。

这种技术已经在比特币闪电网络和以太坊的雷电中使用。

列兵区块链

私有区块链本质上是快速的,因为不需要真正的去中心化,并且网络上的参与者不需要采矿;相反,他们只能验证交易。这可以被认为是公共区块链中可伸缩性问题的一种解决方法;然而,这不是可伸缩性问题的解决方案。此外,应该注意的是,私人区块链只适合在特定的地区和设置。

股权证明

与使用工作证明不同,基于区块链的利益证明算法速度更快。

边链

侧链可以间接提高可伸缩性,方法是允许许多侧链与主区块链一起运行,同时允许使用相对不太安全但速度更快的侧链来执行事务,但仍然与主区块链挂钩。侧链的核心思想被称为双向挂钩,它允许硬币从母链转移到侧链,反之亦然。

子链

这是最近由 Peter R. Rizun 提出的一种相对较新的技术,它基于在层中创建弱块直到找到强块的想法。弱块可以被定义为那些不能通过满足标准网络难度标准而被挖掘,但是已经做了足够的工作来满足另一个较弱难度目标的块。矿工可以通过将弱块层层叠加来建立子链,除非找到符合标准难度目标的块。此时,子链关闭,成为强块。这种方法的优点包括减少了首次交易验证的等待时间。这种技术还减少了孤立块的机会,加快了事务处理的速度。这也是解决可伸缩性问题的一种间接方式。子链不需要任何软分叉或硬分叉来实现,但需要被社区接受。

树链

还有其他增加比特币可扩展性的提议,比如将区块链布局从线性顺序模型改变为树的树链。这棵树基本上是一棵二叉树,从主比特币链向下延伸。这种方法类似于侧链实现,消除了对主要协议更改或块大小增加的需要。它允许提高事务吞吐量。在这种方案中,区块链本身被分段并分布在网络中,以实现可伸缩性。此外,不需要挖掘来验证树链上的块;相反,用户可以独立验证块头。然而,这个想法还没有准备好投入生产,还需要进一步的研究才能使其实用化。

除了上面提到的通用技术, Christian Decker 在他的书中也提出了一些针对比特币的改进措施,内容是关于比特币的可扩展性和安全性。这个提议是基于加速传播时间的想法,因为当前的信息传播机制导致区块链分叉。这些技术包括验证的最小化、块传播的流水线化和连接性的增加。这些变化不需要根本的协议级变化;相反,这些变化可以在比特币节点软件中独立实现。关于验证最小化,已经注意到块验证过程对传播延迟有贡献。这背后的原因是节点需要很长时间来验证块和块内事务的唯一性。有人建议,节点可以在初始工作证明和块验证检查完成后立即发送清单消息。这样,只需执行第一个难度检查,而不必等待事务验证完成,就可以改善传播。除了上述建议之外,还提出了块传播的流水线化,这是基于预测块的可用性的思想。在这种方案中,已经宣布了块的可用性,而无需等待实际的块可用性,因此减少了节点之间的往返时间。最后,事务发起者和节点之间的长距离问题也导致了块传播的减慢。由 Christian Decker 进行的研究表明,连接性的增加可以减少数据块和事务的传播延迟。这是可能的,因为如果在任何时候比特币节点连接到许多其他节点,这将导致减少节点之间的距离,并可以加快网络上的信息传播。

一个解决可伸缩性问题的优秀解决方案很可能是上述一些或所有通用方法的组合。为解决区块链的可扩展性和安全问题而采取的一些举措现已基本准备就绪,可以付诸实施。例如,比特币隔离见证(bitcoin segregated witness)是一项可以极大地帮助提高可扩展性的提议,只需要一个软分叉就可以实现。所谓的 segwit 背后的关键思想是将签名数据从事务中分离出来,这解决了事务可延展性问题,并允许增加块大小。

另一个基于微区块和领导人选举思想的提案比特币 NG 最近受到了一些关注。核心思想是将块分为两种,即前导块(也叫关键块)和微块。前导块负责工作证明,而微块包含实际事务。微块不需要任何工作证明,并且由当选的领导者在每个块生成周期中生成。该块生成周期由前导块启动。唯一的要求是用当选领导人的私钥签署微块。当选的领导者(挖掘者)可以以非常高的速度生成微块,从而提高性能和事务处理速度。

另一方面,最近,一篇由 Vitalik Buterin 撰写的以太坊紫红色论文在上海以太坊敌无双 2 展出;它描述了一个可扩展以太坊的愿景。mauve 提案基于分片和实现利益证明算法的组合。某些目标,如通过利害关系证明的效率增益、最大限度的快速阻塞时间、经济终结性、可伸缩性、跨片通信和审查阻力,已经在论文中确定。

隐私

交易的私密性是区块链非常想要的财产。然而,由于其本质,特别是在公共区块链,一切都是透明的,因此抑制了其在隐私至关重要的各种行业中的使用,例如金融、卫生和许多其他行业。针对隐私问题提出了不同的建议,并且已经取得了一些进展。几种技术,如不可区分性混淆,同态加密的使用,零知识证明和环签名。所有这些技术都有各自的优点和缺点,将在下面的章节中讨论。

不可区分性混淆

这种加密技术可能是解决区块链所有隐私和保密问题的灵丹妙药,但该技术还不能用于生产部署。不可区分性混淆 ( IO )允许代码混淆,这是密码学中一个非常成熟的研究课题,如果应用于区块链,可以作为一个牢不可破的混淆机制,将智能合同变成一个黑盒。IO 背后的关键思想被研究人员称为多线性拼图,它基本上通过混合随机元素来混淆程序代码,如果程序按预期运行,它将产生预期的输出,但任何其他执行方式都会使程序看起来随机而无用。这个想法最早是由萨海等人在他们的研究论文候选不可区分性混淆和所有电路的函数加密中提出的。

同态加密

这种类型的加密允许对加密数据执行操作。想象一个场景,数据被发送到云服务器进行处理。服务器处理它并返回输出,而不知道它已经处理的任何数据。这也是一个成熟的研究领域,允许对加密数据进行所有操作的全同态加密在生产中仍不能完全部署;然而,在这一领域已经取得了重大进展。一旦在区块链上实施,它可以允许处理密码文本,这将允许交易的隐私和保密性。例如,可以使用同态加密对存储在区块链上的数据进行加密,并且可以在不需要解密的情况下对该数据执行计算,从而在区块链上提供隐私服务。麻省理工学院媒体实验室的一个名为 Enigma 的项目也实施了这个概念。Enigma 是一种对等网络,它允许多方对加密数据进行计算,而不会泄露数据的任何信息。

零知识证明

如前几章所见,零知识证明最近已经在 Zcash 中成功实现。更具体地说,SNARKs 已经被实现以确保区块链上的隐私。同样的想法也可以在以太坊和其他区块链实现。在以太坊上集成 Zcash 已经是一个非常活跃的研究项目,由以太坊 R&D 团队和 Zcash 公司运营。

状态通道

使用状态通道的隐私也是可能的,简单地说,由于所有的交易都是在链外运行的,并且主区块链除了最终的状态输出之外根本看不到交易,因此确保了隐私和机密性。

安全多方计算

安全多方计算的概念并不新颖,它基于这样的概念,即数据在秘密共享机制下被分割成参与方之间的多个分区,然后该秘密共享机制对数据进行实际处理,而不需要在单个机器上重建数据。加工后的产品也由双方分享。

使用硬件来提供保密性

可信计算平台可以用来提供一种机制,通过这种机制可以在区块链上实现交易的机密性,例如,通过使用英特尔软件保护扩展 ( SGX ),它允许代码在一个被称为飞地的硬件保护环境中运行。一旦代码在隔离的飞地中成功运行,它就可以产生一个被称为引用的证据,该证据可由英特尔的云服务器证明。然而,人们担心信任英特尔会导致某种程度的集权,这不符合区块链技术的真正精神。然而,这种解决方案有其优点,而且在现实中,许多平台已经使用英特尔芯片,因此在某些情况下信任英特尔可能是可以接受的。

如果这种技术应用于智能合同,那么一旦节点执行了智能合同,它可以产生报价作为正确和成功执行的证明,并且其他节点将只需要验证它。通过使用任何能够提供与 enclave 相同功能的可信执行环境 ( TEE ),甚至可以在具有近场通信 ( NFC )和安全元件的移动设备上使用,可以进一步扩展这个想法。

室友

Coinjoin 是一种通过交互混合比特币交易来实现匿名化的技术。这个想法是基于从多个实体形成一个单一的交易,而不引起输入和输出的任何变化。它删除了发送者和接收者之间的直接链接,这意味着单个地址不能再与交易相关联,这可能导致用户的身份识别。Coinjoin 需要愿意通过混合支付创建单一交易的多方合作。因此,应该注意的是,如果 Coinjoin 方案中的任何单个参与者没有通过不按要求对交易进行签名来遵守合作创建单个交易的承诺,则可能导致拒绝服务攻击。在该协议中,不需要单一的可信第三方。这个概念不同于混合服务,混合服务充当比特币用户之间的可信第三方或中介,并允许交易洗牌。这种交易的混洗导致对特定用户的追踪和支付链接的阻碍。

保密交易

机密交易利用彼得森承诺来提供保密性。承诺方案允许用户承诺某个值,同时保持其秘密,并有能力在以后揭示它。设计承诺方案需要满足的两个性质是绑定隐藏。绑定确保提交者一旦提交就不能更改选择的值,而隐藏属性确保任何对手都无法找到提交者所提交的原始值。彼得森承诺还允许加法运算,并保留承诺的可交换属性,这使得它特别适用于在比特币交易中提供保密性。换句话说,它支持值的同态加密。使用承诺方案允许在比特币交易中隐藏支付值。这个概念已经在 Elements 项目(【https://elementsproject.org/】T4)中实现。

MimbleWimble

MimbleWimble 方案是在比特币 IRC 频道上神秘地提出的,从那以后就变得非常流行。MimbleWimble 扩展了机密事务和 Coinjoin 的概念,允许在不需要任何交互性的情况下聚合事务。但是,它不支持使用比特币脚本语言以及标准比特币协议的各种其他功能。这使得它与现有的比特币协议不兼容。因此,它可以作为比特币的侧链来实现,也可以单独作为一种替代的加密货币来实现。

这个方案可以同时解决隐私和可伸缩性问题。使用 MimbleWimble 技术创建的区块不包含传统比特币区块链中的交易;相反,这些块由三个列表组成:输入列表、输出列表和称为超出的东西,它们是输出和输入之间的签名和差异的列表。输入列表基本上是对旧输出的引用,输出列表包含机密事务输出。这些块可由节点通过使用签名、输入和输出来验证,以确保块的合法性。与比特币相反,MimbleWimble 交易输出仅包含公钥,新旧输出之间的差异由参与交易的所有参与者签名。

安全

尽管区块链通常是安全的,并且按照整个区块链网络的要求使用非对称和对称加密,但是仍然有一些警告可能会危及区块链的安全。

有几个交易延展性、eclipse 攻击和比特币双重消费可能性的例子,在某些情况下,已经被不同的研究人员证明是可行的。交易可延展性允许黑客在比特币网络确认交易之前更改交易的唯一 ID,从而打开了双重提款或存款的可能性,导致交易看起来没有发生。BIP 62 是与隔离证人(segwit)一起提出解决这个问题的方案的提案之一。需要注意的是,只有在未确认交易的情况下,也就是运营流程依赖于未确认交易的场景下,这才是一个问题。对于仅依赖于已确认交易的普通应用程序,这不是问题。

比特币中的信息日食攻击会导致双重消费。eclipse 攻击背后的想法是,比特币节点被诱骗只与攻击者节点 IPs 连接。这开启了攻击者 51 %攻击的可能性。比特币客户端 v0.10.1 在一定程度上解决了这个问题。

智能合约安全性

最近,在智能合约安全性方面已经开始了大量的工作,尤其是智能合约的形式验证正在被讨论和研究。这都是由臭名昭著的 DAO hack 引发的。形式验证是验证计算机程序以确保它满足某些形式陈述的过程。这现在是一个新概念,有许多工具可用于其他语言来实现这一点;例如,Frama-C 可用于分析 C 程序。形式验证背后的关键思想是将源程序转换成自动化证明者可以理解的一组语句。为此,通常使用 Why3,一个正式的可靠性验证器也利用了这一点。一个实验性但可操作的验证器已经在 browser solidity 中可用。

智能合约安全现在是最重要的,为了设计出能够分析 solidity 程序并发现 bug 的方法,已经采取了许多其他措施。最近一个开创性的例子是 Oyente,这是一个由研究人员开发的工具,并在他们的论文中介绍了如何让智能合同更智能。本文发现并分析了智能合约中的几个安全漏洞。这些包括事务排序依赖、时间戳依赖、错误处理的异常(如调用堆栈深度限制利用)和重入漏洞。事务排序依赖 bug 基本上利用了这样的场景:契约的感知状态可能不是契约执行后的状态。这种弱点是一种竞争条件。它也被称为前加载,这是可能的,因为块内的事务顺序可以被操纵。由于所有的事务都首先出现在内存池中,因此可以在事务被包含到内存块中之前对其进行监控。这允许在提交另一个事务之前提交一个事务,从而控制智能合约的行为。

在块的时间戳被用作合同中一些决策的来源的情况下,时间戳依赖性错误是可能的,但是时间戳可以被矿工操纵。调用堆栈深度限制是另一个可以被利用的错误,因为 EVM 的最大调用堆栈深度是 1,024 帧。如果在契约执行时达到堆栈深度,则在某些情况下,发送或调用指令可能会失败,从而导致资金无法支付。EIP50 硬分叉中解决了调用堆栈深度错误。在 DAO 攻击中,重入错误被用来将数百万美元吸到子 DAO 中。重入错误基本上意味着在函数的前一次(第一次)调用完成之前,可以重复调用函数。这在 solidity smart 合约的提取功能中尤其不安全。

除了上面提到的错误之外,在写合同的时候,还有几个其他的问题需要记住。这些错误包括,如果向另一个合同发送资金,请小心处理,因为发送可能会失败,即使 throw 被用作一种总括机制,它也不会工作。

其他标准软件错误,如整数溢出和下溢也很严重,任何整数变量的使用都应该谨慎可靠地实现。例如,一个简单的程序使用uint8来解析一个超过 255 个元素的数组的元素,这可能会导致一个死循环。这是因为 uint8 被限制为 256 个数字。

在下面的小节中,将分别使用 Why3 和 Oyente 展示两个契约验证的例子。

Why3 正式验证

实体代码的正式验证现在可以作为实体浏览器中的一个功能。首先,代码被转换成验证者可以理解的 Why3 语言。在下面的例子中,显示了一个简单的实度代码,它将变量 z 定义为 uint 的最大极限。当这段代码运行时,它将导致返回0,因为uint z将溢出并从0重新开始。这也可以使用 Why3 来验证,如下所示:

Why3 formal verification

带有形式验证的可靠性在线编译器

一旦 solidity 被编译并在正式验证选项卡中可用,它可以被复制到在http://why3.lri.fr/try/可用的 Why3 在线 IDE 中。下面的示例显示它成功地检查并报告了整数溢出错误。这个工具正在大量开发中,但仍然非常有用。此外,这个工具或任何其他类似的工具都不是银弹。即使是正式的验证通常也不应被视为万灵药,因为首先应适当定义规格:

Why3 formal verification

为什么 3

倾听工具

目前,Oyente 作为 Docker 镜像提供,便于测试和安装。该软件在https://github.com/ethereum/oyente有售,可以快速下载和测试。在下面的例子中,一个取自 solidity 文档的简单契约包含了一个重入错误,它已经被测试,并且表明 Oyente 成功地分析了代码并找到了错误:

Oyente tool

有重入 bug 的契约——来源:solidity 文档

这个示例代码包含一个重入错误,这基本上意味着如果一个契约与另一个契约交互或传输以太网,它实际上是将控制权移交给了另一个契约。这允许被调用的契约回调到调用它的契约的函数中,而无需等待完成。例如,这个 bug 可以允许一次又一次地回调前面示例中显示的withdraw函数,从而导致多次获取 Ethers。这是可能的,因为 share 值直到函数结束才被设置为0,这意味着任何后续调用都将成功,导致一次又一次的撤销。

一个例子显示了 Oyente 运行来分析下面显示的契约,从下面的输出可以看出,分析已经成功地发现了重入错误。建议通过 solidity 文档中描述的检查-效果-交互模式的组合来处理 bug:

Oyente tool

检测可靠性缺陷的工具

总结

本章向读者介绍了区块链技术的安全性、保密性和隐私性。讨论了隐私问题,这是使公共区块链适应各种行业的另一个主要抑制因素。接下来,讨论了智能合约安全性,这是当前非常热门的话题。这是一个深入而广泛的课题,但已经对各个方面作了简要的介绍,这将为这一领域的进一步研究打下坚实的基础。例如,形式验证本身就是一个巨大的研究领域。此外,还提供了形式验证的示例,让读者了解可用的工具。应该注意的是,上面提到的工具正在大量开发中,并且缺乏各种期望的特征。此外,文献资料相当匮乏;因此,鼓励读者关注发展,尤其是与以太坊紫红色纸张相关的形式验证和发展,因为它将很快迅速发展。区块链证券领域,尤其是智能合约证券,现在已经非常成熟,可以就这个主题写一整本书。学术界和商业部门有许多专家和研究人员在探索这一领域,不久将有许多自动化工具可用于验证智能合同。


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组