原地址:https://www.researchgate.net/publication/344501038智能合约语言全面比较
在今年年中,正如iosg博客文章中所提到的,在正式核查的方向上会有一些布局。什么是正式验证?
不久前,algorand的智能合约语言还没有图灵完成。智能合约开发语言中的图灵完成很重要吗?
突然间,我发现我不仅需要了解坚实的智能合约开发语言中的功能,还需要了解整个智能合约开发语言的生态全景。
本文对智能合约语言进行了比较。除了稳固性之外,还有许多我们不熟悉的智能合约语言,例如Vyper、mandala和obsidian,可以从不同的方向改进智能合约的编写。
然而,正如我们通常记住的第一点,开发人员主要中心化在使用SOLidness进行开发,尽管它可能不是**的;
智能合约语言仍然是一个非常早期的阶段。将来会发生什么?值得我们想象。
智能合约语言:一个彻底的比较
近年来,智能合约的发展越来越受欢迎。然而,这使它成为恶意势力的新目标。最近针对智能合约的攻击已造成数千万美元的损失。由于智能合约本质上是不可变的,因此需要考虑新的方法来减轻这些攻击。检测软件缺陷的一种方法是使用静态代码分析工具。另一种方法是开发一种新的智能合约专用编程语言,通过设计来抑制已部署代码中的某些类的漏洞。流行的智能合约语言如SOLidity和Vyper正在迅速发展,但研究人员也在使用不太知名的语言来寻找新的改进思路。
本文将探讨它们在智能合约设计中的适用性和发展现状。将特别关注这些语言如何解决智能合约开发中固有的安全问题。
1、 简介
智能合约的概念从上世纪90年代就已经出现,但直到2009年区块链出现,智能合约才得以实施。智能合约可以在不受信任的环境中执行受信任的代码。这意味着参与者(用户、计算机应用程序和其他智能合约)可以确保智能合约已经执行,从而准确表示合约的执行情况,而不必信任执行者或智能合约开发者。这完全是通过在分布式、去中心化、全球和透明的区块链上托管智能合约来实现的。这种新的开发环境支持一种新的应用,即去中心化应用(DAPP),但它给智能合约开发者带来了一系列新的挑战。
因为智能合约部署在区块链上,所以每个人都可以查看他们的源代码。区块链也是不可变的。智能合同的含义是,一旦智能合同部署,就不能更改。开发人员必须确保他们部署的代码是正确的,并且没有bug。因此,需要新的语言来满足这种新环境的具体需要。智能合约中的漏洞可能代价高昂,不仅从安全漏洞方面,而且在实际资金方面也是如此,因为智能合同通常管理加密货币的持有和分发。
本文的其余部分安排如下:第二节介绍智能合同的背景和一些安全问题;第三节,我们将讨论相关工作;第四节,我们将回顾当前智能合同开发语言;第5节,我们将讨论和比较这些语言;在第6节中,我们将对这些语言进行讨论和比较,我们将总结。
2、 背景
智能合同的概念是NickSzabo于1996年**提出的[1]。直到2015年以太坊平台的开发,才有可能开发真正的智能合同。智能合同是一种自动计算机应用,在合同执行时不需要第三方验证。这意味着双方不需要相互信任才能做生意。
以太坊是****的智能合同平台[2]。它提供了一个名为以太坊虚拟机(EVM)的执行环境,它是一种基于堆栈的图灵完整语言。与汇编类似,它为离散操作提供操作码。因为它已经完成,停止问题应用,执行可以永远运行。为了防止这种情况,调用方向矿工支付执行智能合同的费用。这叫做气体,它是用以太坊网络的货币支付的,叫做以太坊。每一笔交易都有**的天然气成本。因此,如果事务试图执行超出气体允许的范围,则抛出异常,并回滚事务。
智能合同容易受到传统软件部署不易受到的特定类安全漏洞的影响。这些包括重新尝试、锁定以太网、未处理异常和事务顺序依赖[3]。以太坊网络上最臭名昭著的安全漏洞之一是一个名为Dao[4]的智能合同的重新进入漏洞。攻击者使用另一个智能合约递归调用Dao智能合同,捐赠了5000万美元的ETH。
研究人员已经开发了各种方法来减轻这些漏洞。一种方法是使用静态分析工具,例如oyente[5],在编译字节码后分析它,以确定它是否包含任何缺陷。Perez等人。回顾了分析智能合同的现有工具,发现这些工具检测特定漏洞的能力具有低重叠率[3]。例如,在分析774份合同中的再入缺陷时,只有23.9%的合同与oyente和Security[6](另一个静态分析工具)重叠。实际上,这意味着开发人员将无法依赖单个工具来一致地发现应用程序中的漏洞实例。
另一种方法是开发一种新的智能合约语言,使编写带有已知漏洞的代码变得困难或不可能。除了SOLidness之外,还有其他智能合约编程语言,包括Vyper[7]、Mandala[8]和obsidian[9]。每种语言都采用不同的方法来改进现有的工具。在本文的其余部分,我们将分析智能合约语言,并比较它们减轻漏洞的方法。
3、 相关工作
Parizi等人。[10] 分析比较了三种不同区块链的三种不同语言。它们包括以太坊的稳固性、Kadena区块链的契约以及tezos区块链的流动性。然后,他们进行了一个实验,招募开发人员学习这些语言,并实施了三个智能合约,以确定这些语言在新开发人员的可用性方面如何叠加。坚实被认为是最容易学的语言。另一方面,他们在以pact和liquidity编写的智能合约中没有发现已知的安全漏洞,但在SOLidness编写的智能合约中却发现了重入和拒绝服务漏洞。
Harz和knottenbelt[11]研究了智能合约语言和形式化验证方法。它们考虑每种语言的规范形式、语义、安全关注点、指令集和度量属性。这些正式语言的验证工具以及它们如何能够很好地检测这些工具的漏洞。他们指出,语言的设计会对验证工具的有效性产生影响。
Jansen等人。被问及智能合约语言是否需要图灵完成。他们分析了以太坊区块链上部署的智能合约,发现只有35.3%的合约使用while循环、for循环或递归。他们得出结论,非图灵完备语言对于智能合约开发的大多数场景都是有效的。
4、 智能合约语言
智能合约语言的发展还处于早期研究阶段。有几种语言很少被使用。其他的,如曼陀罗[8]和黑曜石[9],仍处于概念和实施阶段。在这项研究中,我们考虑可以被视为死亡的语言,正在发展的语言和正在被创造的语言。在表中,我显示了这里考虑的所有语言和一些相关细节。
A、 坚固性
Solidness[14]是大多数开发人员在以太坊网络上创建智能合约的默认语言。它旨在编写智能合约。图1显示了从2016年1月到2020年1月使用SOLidness和Vyper-on-Stack-overflow标签的问题数量。此处讨论的其他语言的标记不会显示在搜索结果中。
它的主要结构是契约,它是面向对象语言中类的分析。SOLidness契约有一个visibility修饰符函数,该函数通过网络向调用者返回值。SOLidness的一个新特性是修饰符,它本质上是一个封装另一个函数的函数,但通过将修饰符名称添加到函数签名中来调用。尽管在许多情况下很有用,但是这个特性混淆了开发人员的意图,并且常常被忽视。由于以太坊上的智能合约无法调试以遵循其执行过程,因此尽可能明确地设置函数非常重要。图2示出了一个简单的钱包契约的实现和仅称为所有者的修饰符的使用,其目的是将共同功能限制到合同的所有者。如您所见,修饰符的使用方式与函数签名本身的语言级关键字相同。开发人员很容易忽略是否对函数应用了修饰符,这会导致错误的安全感。此外,它混淆了代码执行过程。
B、Vyper
以太坊中互联网上第二流行的语言是Vyper[7],它是一种智能合约语言,其语法受python启发。它避免了图灵的完备性,禁止在数据结构上循环,并且不允许递归。循环仍然是允许的,但前提是迭代计数可以在编译时确定。它使用注释来修改以太坊虚拟机的功能可见性和特性,例如应付帐款。
图3显示了Vyper中的一个示例契约。银行是一个简单的合同。它接受存款,并允许来电者一次取款。注意这里的@nonreprent注释。调用同一函数中另一个函数的锁。如果没有这样的函数,调用者可以在同一事务中重新输入此函数,并在调用者余额设置为零之前从合同中提取所有资金。
C、 黑曜石
黑曜石[9],[15]是一种独立于区块链的编程语言。它使用类来引入状态信息,称为typestate。所有对象引用可以是拥有的,也可以是无所有者的。一个对象只能有一个引用,但可以有多个非主引用。在一个给定的事务中,调用一个对象的状态只能改变一个。黑曜石的另一个特征是其新的状态。对象的每个状态定义都可以定义一组字段,这些字段只有在对象处于给定状态时才有效。
图4显示了一个用oblidian编写的智能合约的示例。通过存款功能,来电者将钱存入钱包,钱包的状态从空变满。当调用者退出时,首先需要获得对货币的引用,因为一旦状态转换回null,字段currency就不再可用。
D、 弗林特
Flint[16]不再处于活跃的开发阶段,但它为智能合约专用编程语言的开发引入了一些新的思路。三个关键思想如下:
1) 调用者函数。每个公共函数必须包含一个声明,外部调用方可以访问该函数。此外,编译器将分析这些函数,以找到对内部函数的引用,以确保调用方可以访问内部函数。
2) 资产。这些是特殊类,如以太坊,不能被**、销毁或错误地创建。
3) 限制写入状态。每个改变智能合约内部状态的函数都必须用mutating关键字显式地注释。
在图5中,有一个用Flint编写的智能合约的示例。声明智能合约有几个步骤。首先是合同的定义和字段的声明。接下来,声明函数。它们按调用函数分组。如图所示,存款和取款功能只能由资金映射中已有的调用者访问。
E、 有限责任公司
LLL(类似LISP的低级语言)是继以太坊虚拟机[17]的汇编程序之后开发的第一种语言,它只是汇编程序本身的一个薄包装。它有一个受lisp启发的语法,每个智能合约都是一个s表达式。它提供对执行环境内存的直接访问,并且可以针对速度和更小的二进制大小进行优化。它是图灵完备的,允许程序员访问EVM中可用的任何功能。
竹、竹
Bamboo[18]是以太坊虚拟机的智能合约语言。它的语法有点像SOLidity的语法,并且支持所有相同的默认类。该语言的目标是显式地为状态转换建模。函数返回时,必须显式声明当前协定的状态。状态被建模为具有一组离散函数的多个契约,这些函数只有在契约处于给定状态时才可用。
图7中的列表显示了另一个示例wallet智能合约。有三种状态:钱包,空墙,满墙。wallet状态是在契约部署期间执行的初始状态。如果需要更多初始化,我们将在默认块中初始化,而不是立即将合同转换为空钱包状态。在契约中,它可以访问映射状态。呼叫方将资金存入钱包后,会切换到fullwallet状态,现在只能调用取款功能。
G、 曼陀罗
曼陀罗语[8]是一种在研发阶段提出的语言。它的特点是使用代数数据类。这些类有多个构造函数,每个构造函数都有多个字段。它支持Java等泛类。该语言的主要设计目标是安全性和可审计性,因此它不是图灵完备的,并且不允许未知循环在编译时在线。
图8显示了另一个钱包示例。每个Mandala智能合约由多个模块组成,这些模块限制功能和对状态的访问,就像bamboo使用契约管理状态的方式一样。在这种情况下,合同很简单,没有必要。drop关键字意味着任何调用方都可以删除该值而不使用它,persist关键字意味着该值可以持久化。类也是参数化的,因此您可以想象多种钱包类,例如wallet[ETH]、wallet[BTC]。在取款功能中,通过参数分解从钱包对象中提取金额值,而不是直接引用。
5、 讨论
目前,SOLidness是开发新的智能合约项目的**选择。它提供了一个强大的工具、文档和示例生态系统。许多智能合约和去中心化的应用程序都是以稳固的方式构建的,以太坊区块链每天都要处理大量的交易。它正在被积极开发,语言设计者正在增加新的功能,以迫使开发人员澄清他们的意图并避免简单的错误。
第二个好的选择是Vyper,但是它远不如文档和开发工具可靠。但是,它的设计更注重安全性,并提供了良好的保护措施,防止了易受攻击的漏洞。它类似于Python的语法使许多开发人员熟悉它。
这里讨论的其他语言还不够成熟或活跃,不足以在新的开发项目中得到认真考虑。LLL实际上是EythUnFund使用的早期智能契约中的一些,但是它的语法和低级内存管理要求使得重命名它很困难。曼陀罗还没有编译器。虽然它显示了安全管理状态的希望,但它处理类的方式与现有语言大不相同,因此呈现出陡峭的学习曲线。Bamboo有一种管理状态的新方法,它迫使开发人员知道在智能合约的整个生命周期中哪些功能和应用程序状态是可用的。然而,该项目已经两年没有提交,除了编译器之外,还缺少任何工具。弗林特是一种死气沉沉的语言,除了最初描述其设计的研究论文外,我们找不到任何信息。因此,虽然它引入了许多功能,可以帮助您编写更安全的智能合约,但对于开发来说,这是一个不可能的选择。黑曜石仍处于早期发展阶段。它显示了它的前景,因为它专注于开发人员的人机工程学和安全性,但是它的所有权概念,再加上typestate,允许开发人员一次记住很多活动部件。
6、 结论
目前,智能合约开发语言的前景相对较小,但对新方法的研究很多,现有的语言也在频繁地变化。目前,寻求图灵完整性并提供面向对象特性的语言已经表明,用它们编写的智能契约容易出现严重错误。将一种语言的特性限制到不再图灵完备的程度可以帮助消除某些类中的错误,但需要开发人员以根本不同的方式编写代码,而不使用循环或递归。令人惊讶的是,只有两种死的语言可以代表最适合智能合约编程的函数式编程范式。由于一个可用bug的成本很高,因此需要对智能合约编程语言的开发进行更多的研究,这种语言限制了副作用,并且仍然具有良好的开发人员工效学。
文章标题:智能合约语言综合比较:稳健仍是最佳选择
文章链接:https://www.btchangqing.cn/135060.html
更新时间:2020年11月02日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。