可扩展性和其他挑战
本章旨在介绍区块链成为主流技术之前需要应对的各种挑战。尽管已经开发了各种使用案例和概念验证系统,并且该技术在许多情况下运行良好,但仍需要解决区块链存在的一些基本限制,以使该技术更具适应性。
在这些问题中,排在首位的是可伸缩性,然后是隐私。这两个都是需要解决的重要限制,尤其是当区块链被设想用于要求隐私的行业时。金融、法律和医疗行业对交易的机密性有特定的要求,而当区块链不能满足用户期望的足够的性能水平时,可扩展性通常是一个问题。这两个问题正在成为区块链技术被广泛接受的阻碍因素。
本章将对这两个特定领域中目前提出的和正在进行的研究进行综述。除了隐私和安全之外,其他挑战包括监管、集成、适应性和总体安全性。尽管比特币区块链的安全性是防弹的,并且经受住了时间的考验,但仍有一些警告可能会在一些微妙的情况下使安全性受到一定程度的损害。此外,在其他区块链(如以太坊)中,对于智能合约、拒绝服务攻击和较大的攻击面也有一些合理的安全考虑。所有这些都将在下面的章节中详细讨论。
可量测性
在过去的几年里,这个问题一直是激烈辩论、严格研究和媒体关注的焦点。
这是一个最重要的问题,它可能意味着区块链更广泛的适应性或仅限于财团的有限私人使用之间的差异。由于在这一领域的大量研究,已经提出了许多解决方案,这些方案将在下一节中讨论。
从理论角度来看,解决可伸缩性问题的一般方法通常围绕协议级增强。例如,通常提到的比特币可扩展性的解决方案是增加其块大小。其他提议包括将某些处理卸载到链外网络(例如,链外状态网络)的链外解决方案。基于上述解决方案,一般来说,这些建议可以分为两类:链上解决方案,它们基于改变区块链运行的基本协议的想法,以及链外解决方案,它们利用链外的网络和处理资源来增强区块链。
米勒和其他人最近在他们的立场文件中提出了另一种解决区块链局限性的方法,该立场文件在 https://doi.org/10.1007/978-3-662-53357-4_8 的提供,关于扩展分散的区块链。在这篇文章中,区块链可以被分成各种抽象层,称为平面。每个平面负责执行特定的功能。这些平面包括网络平面、共识平面、存储平面、视图平面和侧面平面。这种抽象允许在每个平面上以结构化的方式单独解决瓶颈和限制。在下面的小节中给出了每个层的简要概述,并参考了一些比特币系统。
网络平面
首先,讨论网络平面。网络平面的一个关键功能是事务传播。在前述论文中已经确定,在比特币中,由于节点在事务传播的传播和复制之前执行事务验证的方式,该平面未充分利用网络带宽,首先在事务广播阶段,然后在块中挖掘之后。
需要注意的是,这个问题是由 BIP 152(Compact Block Relay,https://github . com/bit coin/bips/blob/master/bip-0152 . mediawiki)解决的。
共识平面
第二层被称为一致层。这一层负责挖掘和达成共识。这一层中的瓶颈围绕着 PoW 算法的限制,由此增加共识速度和带宽会由于分叉数量的增加而导致网络安全性的降低。
存储平面
存储平面是第三层,存储分类账。这一层中的问题围绕着每个节点都需要保留整个分类帐的副本,这导致了某些低效率,例如增加了带宽和存储需求。比特币有一种叫做修剪的方法,这种方法允许节点在不需要在其存储中保留完整区块链的情况下进行操作。修剪意味着当比特币节点下载了区块链并对其进行验证时,它会删除已经验证过的旧数据。这样可以节省存储空间。从存储的角度来看,此功能带来了重大改进。
视图平面
列表中的下一个是视图平面,它提出了一种优化,该优化基于这样的提议,即比特币矿工不需要完整的区块链来操作,并且可以从完整的分类帐中构建一个视图来表示系统的整个状态,这足以让矿工发挥作用。视图的实现将消除挖掘节点存储完整区块链的需要。
最后,侧平面是由前述研究论文的作者提出的。这个层面代表了非链交易的概念,即支付或交易渠道的概念被用来卸载参与者之间的交易处理,但仍由主要的比特币区块链支持。
上述模型可用于以结构化的方式描述当前区块链设计中的限制和改进。此外,在过去几年中,已经提出了几个通用策略,可以解决当前区块链设计(如以太坊和比特币)中的限制。这些方法也将在下一节中单独描述和讨论。
块大小增加
这是关于提高区块链性能(事务处理吞吐量)的最有争议的提议。目前,比特币每秒只能处理大约三到七笔交易,这是比特币区块链处理微交易的一个主要抑制因素。比特币的块大小被硬编码为 1 MB,但如果块大小增加,它可以容纳更多的交易,并可以缩短确认时间。有几个比特币改进提案 ( BIPs )是为了支持增加区块大小而提出的。这些城市包括 BIP 100、BIP 101、BIP 102、BIP 103 和 BIP 109。
在https://en.bitcoin.it/wiki/Block_size_limit_controversy有关于历史参考和讨论的精彩报道。
在以太坊中,块大小不受硬编码的限制;相反,它是由气体限制控制的。理论上,以太坊中的方块大小没有限制,因为它取决于气体的数量,而气体的数量会随着时间的推移而增加。这是可能的,因为如果在前一区块已经达到极限,矿工可以增加后续区块的气体极限。比特币 SegWit 通过将见证数据与交易数据分离来解决这一问题,从而为交易提供更多空间。比特币的其他提案包括比特币无限、比特币 XT 和比特币现金。读者可以回头参考第八章、介绍比特币,了解更多详情。
更多信息请参考以下链接:
块间隔缩减
另一个建议是减少每个块生成之间的时间。可以减少块之间的时间以实现更快的块终结,但是由于分叉数量的增加,可能导致安全性降低。以太坊已经实现了大约 14 秒的阻塞时间。
这是对比特币区块链的重大改进,后者需要 10 分钟才能生成一个新区块。在以太坊中,通过使用贪婪最重观察子树 ( 幽灵)协议来缓解由于块之间的时间较短而导致的高孤立块的问题,其中孤立块(叔伯)也被包括在确定有效链中。一旦以太坊转移到股权证明 ( PoS ),这将变得无关紧要,因为不需要采矿,几乎可以立即完成交易。
可逆布鲁姆查找表
这是已经提出的另一种方法,用于减少需要在比特币节点之间传输的数据量。可逆布鲁姆查找表 ( IBLTs )最初是由加文·安德森提出的,这种方法的关键吸引力在于,如果实施,它不会导致比特币的硬分叉。关键思想是基于这样的事实,即不需要在节点之间转移所有事务;相反,只传输那些在同步节点的事务池中不可用的。这使得节点之间的交易池同步更快,从而提高了比特币网络的整体可扩展性和速度。
分片
分片并不是一种新技术,它已经被用于分布式数据库,如 MongoDB 和 MySQL。分片背后的关键思想是将任务分成多个块,然后由多个节点处理。这导致了吞吐量的提高和存储需求的降低。在区块链,采用了类似的方案,将网络状态划分为多个碎片。状态通常包括余额、代码、现时和存储。碎片是运行在同一网络上的区块链的松散耦合的分区。碎片间的交流和对每个碎片历史的共识有一些挑战。这是一个开放的研究领域。
国家频道
这是为加速区块链网络上的交易而提出的另一种方法。基本思想是使用副通道进行状态更新和处理主链之外的事务;一旦状态完成,它将被写回到主链,从而从主区块链中卸载耗时的操作。
状态通道通过执行以下三个步骤来工作:
- 首先,区块链国家的一部分被锁定在一个智能合同下,确保参与者之间的协议和业务逻辑。
- 现在,参与者之间开始了离线事务处理和交互,现在只在他们之间更新状态。在这一步中,几乎可以执行任意数量的事务,而不需要区块链,这使得该过程变得快速,并且是解决区块链可伸缩性问题的最佳选择。然而,可以认为这不是一个真正的区块链解决方案,例如分片,但最终结果是一个更快、更轻、更强大的网络,可以证明在微支付网络、物联网网络和许多其他应用中非常有用。
- 一旦达到最终状态,状态通道关闭,最终状态被写回到主区块链。在这个阶段,区块链的锁定部分也被解锁。
这个过程如下图所示:
国家频道
这种技术已经在比特币闪电网络和以太坊的雷电中使用。
二等兵区块链
私有区块链本质上是快速的,因为不需要真正的去中心化,并且网络上的参与者不需要采矿;相反,他们只能验证交易。这可以被认为是公共区块链中可伸缩性问题的一种解决方法;然而,这不是可伸缩性问题的解决方案。此外,应该注意,私有区块链仅适用于特定的区域和设置,例如所有参与者都是已知的企业环境。
利害关系证明
与使用工作证明 ( 功率)不同,基于 PoS 算法的区块链速度更快。PoS 在第 10 章、替代硬币中有更详细的解释。
边链
侧链可以间接提高可伸缩性,方法是允许许多侧链与主区块链一起运行,同时允许使用相对不太安全但速度更快的侧链来执行事务,但仍然与主区块链挂钩。侧链的核心思想被称为双向挂钩,它允许硬币从母链转移到侧链,反之亦然。
子链
这是最近由 Peter R. Rizun 提出的相对较新的技术,其基于在层中创建弱块直到找到强块的思想。弱块可以被定义为那些不能通过满足标准网络难度标准而被挖掘,但是已经做了足够的工作来满足另一个较弱难度目标的块。矿工可以通过将弱块层层叠加来建立子链,除非找到符合标准难度目标的块。
此时,子链关闭,成为强块。这种方法的优点包括减少了首次交易验证的等待时间。这种技术还减少了孤立块的机会,加快了事务处理的速度。这也是解决可伸缩性问题的一种间接方式。子链不需要任何软分叉或硬分叉来实现,但需要被社区接受。
子链研究论文可在https://www . ledger journal . org/ojs/index . PHP/ledger/article/view/40获得。
树链(树)
还有其他增加比特币可扩展性的提议,比如将区块链布局从线性顺序模型改变为树的树链。这棵树基本上是一棵二叉树,从主比特币链向下延伸。这种方法类似于侧链实现,消除了对主要协议更改或块大小增加的需要。它允许提高事务吞吐量。在这种方案中,区块链本身被分段并分布在网络中,以实现可伸缩性。
此外,不需要挖掘来验证树链上的块;相反,用户可以独立验证块头。然而,这个想法还没有准备好投入生产,还需要进一步的研究才能使其实用化。
最初的想法是在 https://eprint.iacr.org/2016/545.pdf 的研究论文中提出的。
除了前面提到的通用技术,克里斯蒂安·德克尔(https://scholar.google.ch/citations?user=ZaeGlZIAAAAJ&HL = en)在他关于比特币的可扩展性和安全性的书中也提出了一些针对比特币的改进措施。这个提议是基于加速传播时间的想法,因为当前的信息传播机制导致区块链分叉。这些技术包括验证的最小化、块传播的流水线化和连接性的增加。这些变化不需要根本的协议级变化;相反,这些变化可以在比特币节点软件中独立实现。
关于验证最小化,已经注意到块验证过程对传播延迟有贡献。这背后的原因是节点需要很长时间来验证块和块内事务的唯一性。有人建议,节点可以在初始功率和块验证检查完成后立即发送清单消息。这样,通过只执行第一个难度检查,而不等待事务验证完成,就可以改进传播。
块传播
除了前面的提议之外,还提出了块传播的流水线化,这是基于预测块的可用性的思想。在这种方案中,已经宣布了块的可用性,而无需等待实际的块可用性,因此减少了节点之间的往返时间。最后,事务发起者和节点之间的长距离问题也导致了块传播的减慢。Christian Decker 进行的研究表明,增加连通性可以减少数据块和事务的传播延迟。这是可能的,因为如果在任何时候比特币节点连接到许多其他节点,这将导致减少节点之间的距离,并可以加快网络上的信息传播。
一个解决可伸缩性问题的优秀解决方案很可能是前面提到的一些或所有通用方法的组合。为解决区块链的可扩展性和安全问题而采取的一些举措现已基本准备就绪或已经实施。例如,比特币隔离见证 ( SegWit )是一个可以极大地帮助可扩展性的提议,只需要一个软分叉就可以实现。所谓的 SegWit 背后的关键思想是将签名数据从事务中分离出来,这解决了事务可扩展性问题,并允许增加块大小,从而提高吞吐量。
比特币-NG
另一个基于微区块和领导人选举思想的提议比特币-NG 最近获得了一些关注。核心思想是将块分成两种类型,即前导块(也称为关键块)和微块:
- Leader blocks :这些负责 PoW,而微块包含实际事务。
- 微区块:这些不需要任何 PoW,在每个区块生成周期由当选的领导者生成。该块生成周期由前导块启动。唯一的要求是用当选领导人的私钥签署微块。当选的领导者(挖掘者)可以以非常高的速度生成微块,从而提高性能和事务处理速度。
另一方面,Vitalik Buterin 撰写的以太坊紫红色论文已在上海以太坊发展会议 2 上展示;它描述了一个可扩展以太坊的愿景。mauve 建议基于 PoS 算法的分片和实现的组合。某些目标,如通过 PoS 的效率增益、最大化的快速阻塞时间、经济的终结性、可伸缩性、跨片通信和审查阻力已经在论文中被确定。
血浆
另一个最近的可扩展性提议是由 Joseph Poon 和 Vitalik Buterin 提出的等离子体。该提案描述了在根区块链(以太坊主网)上运行智能合约的想法,并让执行大量交易的子区块链向母链反馈少量承诺。在该方案中,区块链被安排在树形层次结构中,挖掘仅在根(主)区块链上执行,其将安全性证明向下馈送到子链。这也被称为第二层系统,就像状态通道也在第二层上运行,而不是在主链上运行。
研究论文可在 http://plasma.io 获得。
隐私
交易隐私是区块链非常渴望的财产。然而,由于其本质,特别是在公共区块链,一切都是透明的,因此抑制了其在隐私至关重要的各种行业中的使用,例如金融、卫生和许多其他行业。针对隐私问题提出了不同的建议,并且已经取得了一些进展。几种技术,如不可区分性混淆 ( IO ),同态加密、ZKPs 和环签名的使用。
所有这些技术都有各自的优点和缺点,将在下面的章节中讨论。
不可区分性混淆
这种加密技术可能是解决区块链所有隐私和保密问题的灵丹妙药,但该技术还不能用于生产部署。IO 允许代码混淆,这是密码学中非常成熟的研究课题,如果应用于区块链,可以作为一种牢不可破的混淆机制,将智能合约变成黑盒。
IO 背后的关键思想被研究人员称为多线性拼图,它基本上通过混合随机元素来混淆程序代码,如果程序按预期运行,它将产生预期的输出,但任何其他执行方式都会使程序看起来随机而无用。这个想法是由 Shai 和其他人在他们的研究论文中首次提出的【候选不可区分性混淆和所有电路的功能加密。
该研究论文可在https://doi.org/10.1109/FOCS.2013.13获得。
同态加密
这种类型的加密允许对加密数据执行操作。想象一个场景,数据被发送到云服务器进行处理。服务器处理它并返回输出,而不知道它已经处理的任何数据。这也是一个成熟的研究领域,允许对加密数据进行所有操作的全同态加密在生产中仍不能完全部署;然而,在这一领域已经取得了重大进展。一旦在区块链上实施,它可以允许对密文进行处理,这将内在地允许交易的隐私和保密性。例如,可以使用同态加密对存储在区块链上的数据进行加密,并且可以在不需要解密的情况下对该数据执行计算,从而在区块链上提供隐私服务。这个概念也在麻省理工学院媒体实验室的一个名为 Enigma 的项目中得以实施,该项目可在 https://www.media.mit.edu/projects/enigma/overview/的网站上获得。Enigma 是一种对等网络,它允许多方对加密数据进行计算,而不会泄露数据的任何信息。
原创研究可在https://crypto.stanford.edu/craig/获得。
零知识证明
zkp 最近已经在 Zcash 成功实现,见第十章、替代币。更具体地说, SNARK (简写为简洁的非交互式知识论证)已经被实现,以确保区块链上的隐私。
同样的想法也可以在以太坊和其他区块链实现。在以太坊上集成 Zcash 已经是一个非常活跃的研究项目,由以太坊 R&D 团队和 Zcash 公司运营。
原始研究论文可在https://eprint.iacr.org/2013/879.pdf获得。 另一篇优秀论文在此http://chriseth . github . io/notes/articles/zksnarks/zksnarks . pdf。
zkp 家族最近增加了一个新成员,名为零知识简洁透明的知识论证(ZK-斯塔克斯),这是对 ZK-斯纳克斯的改进,因为与 ZK-斯纳克斯相比,ZK-斯塔克斯消耗了更少的带宽和存储。此外,它们不需要 ZK-斯纳克所要求的初始的、有点争议的、可信的设置。此外,ZK-斯塔克斯比 ZK-斯纳克斯快得多,因为他们不使用椭圆曲线,而是依靠散列。
https://eprint.iacr.org/2018/046.pdf 的 ZK-斯塔克斯的原始研究论文可以在这里找到。
国家频道
使用状态通道的隐私也是可能的,简单地说,由于所有的事务都是在链外运行的,除了最终的状态输出,主区块链根本看不到事务,因此确保了隐私和机密性。
安全多方计算
安全多方计算的概念并不新颖,它基于这样的概念,即数据在秘密共享机制下被分割成参与方之间的多个分区,然后该秘密共享机制对数据进行实际处理,而不需要在单个机器上重建数据。加工后的产品也由双方分享。
使用硬件来提供机密性
可信计算平台可以用来提供一种机制,通过这种机制可以在区块链上实现交易的机密性,例如,通过使用英特尔软件保护扩展 ( SGX ),它允许代码在一个被称为飞地的硬件保护环境中运行。一旦代码在隔离的飞地中成功运行,它就可以产生一个被称为引用的证据,该证据可由英特尔的云服务器证明。然而,人们担心信任英特尔会导致某种程度的集权,这不符合区块链技术的真正精神。然而,这种解决方案有其优点,而且在现实中,许多平台已经使用英特尔芯片,因此在某些情况下,信任英特尔可能是可以接受的。
如果这种技术应用于智能合同,那么一旦节点执行了智能合同,它可以产生报价作为正确和成功执行的证明,并且其他节点将只需要验证它。通过使用任何能够提供与 enclave 相同功能的可信执行环境 ( TEE ),甚至可以在具有近场通信 ( NFC )和安全元件的移动设备上使用,可以进一步扩展这个想法。
混币原理
CoinJoin 是一种通过交互混合比特币交易来实现匿名化的技术。这个想法是基于从多个实体形成一个单一的交易,而不引起输入和输出的任何变化。它删除了发送者和接收者之间的直接链接,这意味着单个地址不能再与交易相关联,这可能导致用户的身份识别。CoinJoin 需要愿意通过混合支付创建单一交易的多方合作。因此,应该注意的是,如果 CoinJoin 方案中的任何单个参与者没有通过不按要求对交易进行签名来遵守合作创建单个交易的承诺,则可能导致拒绝服务攻击。
在该协议中,不需要单一的可信第三方。这个概念不同于混合服务,混合服务充当比特币用户之间的可信第三方或中介,并允许交易洗牌。这种交易的混洗导致对特定用户的追踪和支付链接的阻碍。
机密交易
机密交易利用彼得森承诺来提供保密性。承诺方案允许用户承诺某个值,同时保持其秘密,并有能力在以后揭示它。为了设计承诺方案需要满足的两个属性是绑定和隐藏。
绑定确保提交者一旦提交就不能更改选择的值,而隐藏属性确保任何对手都无法找到提交者所承诺的原始值。彼得森承诺还允许加法运算,并保留承诺的可交换属性,这使得它特别适用于在比特币交易中提供保密性。换句话说,它支持值的同态加密。使用承诺方案允许在比特币交易中隐藏支付值。这个概念已经在 Elements 项目中实现了(https://elementsprorg/)。
MimbleWimble
MimbleWimble 方案是在比特币 IRC 频道上神秘地提出的,从那以后就变得非常流行。MimbleWimble 扩展了机密事务和 CoinJoin 的概念,允许在不需要任何交互性的情况下聚合事务。但是,它不支持使用比特币脚本语言以及标准比特币协议的各种其他功能。这使得它与现有的比特币协议不兼容。因此,它可以作为比特币的侧链来实现,也可以单独作为一种替代的加密货币来实现。
这个方案可以同时解决隐私和可伸缩性问题。使用 MimbleWimble 技术创建的区块不包含传统比特币区块链中的交易;相反,这些块由三个列表组成:输入列表、输出列表和称为超出的东西,它们是输出和输入之间的签名和差异的列表。输入列表基本上引用旧的输出,输出列表包含机密事务输出。这些块可由节点通过使用签名、输入和输出来验证,以确保块的合法性。与比特币相反,MimbleWimble 交易输出仅包含公钥,新旧输出之间的差异由参与交易的所有参与者签名。
安全性
尽管区块链通常是安全的,并且按照整个区块链网络的要求使用非对称和对称加密,但是仍然有一些警告可能会危及区块链的安全。
有几个交易延展性、eclipse 攻击和比特币双重消费可能性的例子,在某些情况下,已经被不同的研究人员证明是可行的。交易可延展性允许黑客在比特币网络确认交易之前更改交易的唯一 ID,从而打开了双重提款或存款的可能性,导致交易看起来没有发生。BIP 62 是和 SegWit 一起提出解决这个问题的方案的提案之一。需要注意的是,只有在未确认交易的情况下,也就是运营流程依赖于未确认交易的场景下,这才是一个问题。对于仅依赖于已确认交易的普通应用程序,这不是问题。
比特币中的信息日食攻击会导致双重消费。eclipse 攻击背后的想法是,比特币节点被诱骗只与攻击者节点 IPs 连接。这开启了攻击者 51 %攻击的可能性。比特币客户端 v0.10.1 在一定程度上解决了这个问题。
智能合同安全性
最近,在智能合约安全性方面已经开始了大量的工作,尤其是智能合约的形式验证正在被讨论和研究。这都是由臭名昭著的 DAO hack 引发的。
形式验证是验证计算机程序以确保它满足某些形式陈述的过程。这现在是一个新概念,有许多工具可用于其他语言来实现这一点;例如,Frama-C(https://frama-c.com)可用于分析 C 程序。形式验证背后的关键思想是将源程序转换成自动化证明者可以理解的一组语句。
出于这个目的,Why3 ( http://why3.lri.fr )是常用的,一个正式的可靠性验证器也利用了这一点。一个实验性但可操作的验证器已经在 browser Solidity 中可用。
智能合同安全现在是最重要的,为了设计出能够分析 Solidity 程序并找到 bug 的方法,已经采取了许多其他措施。最近一个开创性的例子是 Oyente,这是一个由研究人员开发的工具,并在他们的论文中介绍了如何让智能合同更智能。
Oyente 在https://github.com/melonproject/oyente有售。
本文发现并分析了智能合约中的几个安全漏洞。这些包括事务排序依赖、时间戳依赖、错误处理的异常(如调用堆栈深度限制利用)和重入漏洞。事务排序依赖 bug 基本上利用了这样的场景:契约的感知状态可能不是契约执行后的状态。
这种弱点是一种竞争条件。它也被称为前加载,这是可能的,因为块内的事务顺序可以被操纵。由于所有的事务都首先出现在内存池中,因此可以在事务被包含到内存块中之前对其进行监控。这允许在提交另一个事务之前提交一个事务,从而控制智能合约的行为。
在数据块的时间戳被用作合同中一些决策的来源的情况下,时间戳依赖性错误是可能的,但是时间戳可以被矿工操纵。调用堆栈深度限制是另一个可以被利用的错误,因为 EVM 的最大调用堆栈深度是 1,024 帧。如果在契约执行时达到堆栈深度,则在某些情况下,发送或调用指令可能会失败,从而导致资金无法支付。在 EIP 50 硬分叉https://github . com/ether eum/EIPs/blob/master/EIPS/EIP-150 . MD中解决了调用堆栈深度错误。
在 DAO 攻击中,可重入性缺陷被用来将数百万美元吸到一个子 DAO 中。可重入性错误基本上意味着在函数的前一次(第一次)调用完成之前,可以重复调用函数。这在 Solidity smart 合约的提取功能中尤其不安全。
除了前面提到的 bug,还有几个其他的问题在写合同的时候也要牢记。这些错误包括,如果向另一个合同发送资金,请小心处理,因为发送可能会失败,即使 throw 被用作一种总括机制,它也不会工作。
其他标准软件错误,如整数溢出和下溢也很严重,任何整数变量的使用都应该谨慎可靠地实现。例如,在一个简单的程序中,使用 uint8 来解析超过 255 个元素的数组元素可能会导致无限循环。这是因为 uint8 被限制为 256 个数字。
在接下来的章节中,将分别使用 Remix IDE、Why3 和 Oyente 展示两个契约验证的例子。
形式验证和分析
Solidity 代码的安全分析现在可以作为 solidity online IDE 中的一个特性使用,称为 Remix。对代码进行漏洞分析,并在 remix IDE 的分析选项卡中报告:
重新混合 IDE 分析选项
带有可重入性 bug 的同一个契约的示例输出显示在前面截图的底部。
该工具分析多种类别的漏洞,包括安全、天然气和经济。如前面的屏幕截图所示,分析工具已经成功检测到了可重入性错误,详细信息显示在屏幕底部。
Why3 也可用于形式化分析 Solidity 代码。
Why3 在http://why3.lri.fr/try/有售。
在下面的例子中,显示了一个简单的实度代码,它将z
变量定义为uint
的最大限制。当这段代码运行时,将导致返回0
,因为uint z
将溢出并从0
重新开始。这也可以使用 Why3 来验证,如下所示:
带有形式验证的可靠性在线编译器
从 Solidity 到 Why3 兼容代码的转换曾经在 Solidity online 编译器中可用,但现在不再可用。因此,下面的例子只是出于完整性的目的,并揭示了传统工具无法检测到的一类重要的错误。在这个例子中,整数溢出被显示为一个例子。
以下示例显示 Why3 成功检查并报告整数溢出错误。这个工具正在大量开发中,但仍然非常有用。此外,这个工具或任何其他类似的工具都不是银弹。即使是正式的验证通常也不应被视为万灵药,因为首先应适当定义规格:
为什么 3
倾听者工具
目前,Oyente 作为 Docker 镜像提供,便于测试和安装。该软件在 https://github.com/melonproject/oyente 有售,可以下载和测试。
在下面的例子中,一个取自 Solidity 文档的包含可重入性错误的简单契约已经过测试,它表明 Oyente 成功地分析了代码并找到了错误:
带有可重入性 bug 的契约,来源:solidity 文档
这个示例代码包含一个可重入性错误,这基本上意味着如果一个契约正在与另一个契约交互或传输以太网,它实际上是将控制权移交给了另一个契约。这允许被调用的契约回调到调用它的契约的函数中,而无需等待完成。例如,这个 bug 可以允许一次又一次地回调前面示例中显示的撤回函数,从而导致多次获取 Ethers。这是可能的,因为 share 值直到函数结束才被设置为0
,这意味着任何后续调用都将成功,导致一次又一次的撤销。
这里显示了一个 Oyente 运行来分析这里显示的契约的例子,从下面的输出中可以看出,分析已经成功地发现了可重入性错误。建议通过 solidity 文档中描述的检查-效果-交互模式的组合来处理 bug:
检测可靠性缺陷的工具
在https://Oyente . melon . fund的智能联系人分析工具中也有 oyente。这里显示了一个示例输出。
通过这个例子,我们结束了对安全性和可靠性分析工具的介绍。这是一个非常丰富的研究领域,随着时间的推移,预计会有越来越多的工具可用。
奥恩特分析
摘要
本章向读者介绍了区块链技术的安全性、保密性和隐私性。讨论了隐私问题,这是使公共区块链适应各种行业的另一个主要抑制因素。接下来,讨论了智能合约安全性,这是当前非常热门的话题。这是一个深入而广泛的课题,但已经对各个方面作了简要的介绍,这将为这一领域的进一步研究打下坚实的基础。
例如,形式验证本身就是一个巨大的研究领域。此外,还提供了形式验证的示例,让读者了解可用的工具。应该注意的是,前面提到的工具正在大量开发中,缺乏各种理想的特性。此外,文献资料相当匮乏;因此,鼓励读者关注发展,尤其是与以太坊紫红色纸张相关的形式验证和发展,因为它将很快迅速发展。区块链证券领域,尤其是智能合约证券,现在已经非常成熟,可以就这个主题写一整本书。
学术界和商业部门有许多专家和研究人员在探索这一领域,不久将有许多自动化工具可用于验证智能合同。在 https://securify.ch 上已经有一个在线工具可以分析智能合约代码来发现安全漏洞。