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


它的主要结构是合约 , 它是面向对象语言中类的分析 。 Solidity合约具有可见性modifiers的函数 , 可以通过网络将值返回给调用者 。 Solidity的一个新特性是modifiers , 它本质上是一个封装另一个函数的函数 , 但通过将modifiers名称添加到函数签名中来调用 。 虽然在很多情况下都很有用 , 但是这个特性混淆了开发人员的意图 , 并且常常被忽略 。 由于以太坊上的智能合约无法调试以遵循其执行流程 , 因此尽可能明确地设置函数非常重要 。 图2示出了简单钱包合约的实现以及称为onlyOwner的modifiers的使用 , 其目的是将公共功能限制为合约的所有者 。 可以看出 , modifiers就像函数签名本身的语言级关键字一样使用 。 开发人员很容易忽略是否对函数应用了modifiers , 这会导致错误的安全感 。 此外 , 它混淆了代码执行流程 。
|全面比较智能合约语言:Solidity仍是当前最佳选择
本文插图

B、 Vyper
以太坊网络上第二种最流行的语言是Vyper[7] , 它是一种智能合约语言 , 其语法受Python启发 。 它避免了图灵的完备性 , 禁止在数据结构上循环 , 并且不允许递归 。 循环仍然是允许的 , 但前提是迭代计数可以在编译时确定 。 它使用注释来修改以太坊虚拟机的功能可见性和特性 , 例如应付款 。
|全面比较智能合约语言:Solidity仍是当前最佳选择
本文插图

图3显示了Vyper中的一个示例合约 。 合约是一个简单的银行 。 它接受存款 , 并允许来电者一次取款 。 这里需要注意的是@nonreprent注释 。 在同一个函数中调用另一个函数的锁 。 如果没有这样的功能 , 调用者可以在同一事务中重新输入此函数 , 并在调用者余额设置为零之前提取该合同的所有资金 。
C. Obsidian
Obsidian[9] , [15]是一种与区块链无关的编程语言 。 它用类型引入状态信息 , 称为Typestate 。 所有对象引用可以是拥有的 , 也可以是无主的 。 一个对象只能有一个拥有的引用 , 但可以有多个无主引用 。 实际上 , 这意味着在给定的事务期间只有一个调用函数可以改变对象的状态 。 Obsidian的另一个新特点是它的客体状态机制 。 对象的每个状态定义都可以定义一组字段 , 这些字段只有在对象处于给定状态时才有效 。
图4显示了用Obsidian编写的智能合约示例 。 使用存款功能 , 来电者将钱存入钱包 , 钱包的状态从空转满 。 当调用方退出时 , 首先需要获得对货币的引用 , 因为一旦状态转换回空 , 字段货币就不再可用 。
|全面比较智能合约语言:Solidity仍是当前最佳选择
本文插图

D、 Flint
Flint[16]不再处于积极开发阶段 , 但它为智能合约专用编程语言的开发引入了一些新颖的思想 。 这三个关键思想是:
1) 调用者功能 。 每个公共函数必须包含外部调用方可以访问此函数的声明 。 此外 , 编译器将分析这些函数以查找对内部函数的引用 , 以确保调用方可以访问内部函数 。
2) 资产 。 这些是特殊类型 , 例如Ether , 不能被复制、销毁或错误地创建 。
3) 限制写入状态 。 每个对智能合约的内部状态进行变异的函数都必须显式地使用mutating关键字进行注释 。
在图5中 , 有一个用Flint编写的智能合约示例 。 声明智能合约有多个步骤 。 首先是合约的定义和字段的声明 。 接下来声明函数 。 它们按调用方功能分组 。 如图所示 , 存款和取款功能只能由已经在资金图中的调用者访问 。
|全面比较智能合约语言:Solidity仍是当前最佳选择
本文插图

E、 LLL
LLL(Low level Lisp like Language)是以太坊虚拟机的汇编程序之后开发的第一种语言[17] , 它只是围绕着汇编程序本身的一个薄薄的包装器 。 它有一个受Lisp启发的语法 , 每个智能合约都是一个s表达式 。 它提供对执行环境内存的直接访问 , 并且可以针对速度和更小的二进制大小进行优化 。 它是图灵完备的 , 允许程序员访问EVM中可用的任何功能 。


推荐阅读