|全面比较智能合约语言:Solidity仍是当前最佳选择( 二 )


以太坊是最受欢迎的智能合约平台[2] 。 它提供了一个称为以太坊虚拟机(EVM)的执行环境 , 它是一种基于堆栈的、图灵完备的语言 。 它类似于汇编 , 为离散操作提供操作码 。 因为它是图灵完备停止问题适用和执行可以永远运行 。 为了防止这种情况 , 为了执行智能合约 , 调用者向矿工支付费用 。 这被称为气体 , 以以太坊网络的货币支付 , 称为以太(ETH) 。 每笔交易都有一个最大的天然气成本 。 因此 , 如果一个事务试图执行比gas所允许的更多的操作 , 则抛出异常并回滚事务 。
智能合约容易受到传统软件部署不易受到的特定安全漏洞类别的攻击 。 其中包括重入、锁定以太、未处理的异常和事务顺序依赖[3] 。 以太坊网络上最臭名昭著的安全漏洞之一是利用名为TheDAO的智能合约的重入漏洞[4] 。 攻击者使用另一个智能合约对DAO智能合约进行递归调用 , 捐失金额为5000万美元的ETH 。
研究人员开发了多种方法来减轻这些漏洞 。 一种方法是使用静态分析工具 , 如Oyente[5] , 在编译字节码之后对其进行分析 , 以确定它是否包含任何缺陷 。 Perez等人回顾了分析智能合约的现有工具 , 发现这些工具检测特定漏洞的能力存在较低的重叠率[3] 。 例如 , 在分析774份合同中的重入缺陷时 , Oyente和Securify[6](另一个静态分析工具)只有23.9%的合约重叠 。 在实践中 , 这意味着开发人员将无法依赖单一工具来一致地发现其应用程序中的漏洞实例 。
另一种方法是开发新的智能合约语言 , 使编写具有已知漏洞的代码变得困难或不可能 。 除了solidity , 还有其他智能合约编程语言 , 其中包括 Vyper[7]、Mandala[8]和Obsidian[9] 。 每种语言都采用不同的方法来改进现有的工具 。 在本文的其余部分 , 我们将分析智能合约语言 , 并比较它们减轻漏洞的方法 。
三、 相关工作
Parizi等人[10]分析和比较三种不同区块链的三种不同语言 。 它们包括以太坊的Solidity , Kadena区块链的Pact , 以及Tezos区块链的Liquidity 。 然后 , 他们进行了一个实验 , 招募开发人员学习这些语言 , 并实施了三个智能合约 , 以确定这些语言在新开发人员的可用性方面如何叠加 。 Solidity被认为是最容易学习的语言 。 另一方面 , 他们在以Pact和Liquidity编写的智能合约中没有发现已知的安全漏洞 , 而在以Solidity编写的智能合约中却发现了重入和拒绝服务漏洞 。
Harz和Knottenbelt[11]研究智能合约语言和形式化验证方法 。 它们考虑每种语言的范式、语义、安全关注点、指令集和度量属性 。 他们还回顾了其中一些语言的形式化验证工具 , 并描述了这些工具如何很好地检测智能合约中的漏洞 。 他们指出 , 语言的设计会对验证工具的有效性产生影响 。
Jansen等人 问了一个问题 , 智能合约语言是否需要图灵完备 。 他们分析了以太坊区块链上部署的智能合约 , 发现只有35.3%的合约使用while循环、for循环或递归 。 他们的结论是 , 非图灵完备语言对于智能合约开发的大多数场景都是有效的 。
四、 智能合约语言
智能合约语言的开发仍处于早期研究阶段 。 少数语言已经很少被使用了 。 其他的 , 如Mandala[8]和Obsidian[9] , 仍处于概念化和实现阶段 。 在这项研究中 , 我们考虑了可以被视为死亡了的语言、正在被开发的语言和正在被创造的语言 。 表中我展示了这里考虑的所有语言和一些相关的细节 。
|全面比较智能合约语言:Solidity仍是当前最佳选择
本文插图

|全面比较智能合约语言:Solidity仍是当前最佳选择
本文插图

A、 Solidity
Solidity[14]是大多数开发人员在以太坊网络上创建智能合约时的默认语言 。 它是为编写智能合约而设计的 。 图1显示了2016年1月至2020年1月期间使用Solidity和Vyper on Stack Overflow标签的问题数量 。 此处讨论的其他语言的标记未显示在搜索结果中 。


推荐阅读