|全面比较智能合约语言:Solidity仍是当前最佳选择( 三 )
它的主要结构是合约 , 它是面向对象语言中类的分析 。 Solidity合约具有可见性modifiers的函数 , 可以通过网络将值返回给调用者 。 Solidity的一个新特性是modifiers , 它本质上是一个封装另一个函数的函数 , 但通过将modifiers名称添加到函数签名中来调用 。 虽然在很多情况下都很有用 , 但是这个特性混淆了开发人员的意图 , 并且常常被忽略 。 由于以太坊上的智能合约无法调试以遵循其执行流程 , 因此尽可能明确地设置函数非常重要 。 图2示出了简单钱包合约的实现以及称为onlyOwner的modifiers的使用 , 其目的是将公共功能限制为合约的所有者 。 可以看出 , modifiers就像函数签名本身的语言级关键字一样使用 。 开发人员很容易忽略是否对函数应用了modifiers , 这会导致错误的安全感 。 此外 , 它混淆了代码执行流程 。
本文插图
B、 Vyper
以太坊网络上第二种最流行的语言是Vyper[7] , 它是一种智能合约语言 , 其语法受Python启发 。 它避免了图灵的完备性 , 禁止在数据结构上循环 , 并且不允许递归 。 循环仍然是允许的 , 但前提是迭代计数可以在编译时确定 。 它使用注释来修改以太坊虚拟机的功能可见性和特性 , 例如应付款 。
本文插图
图3显示了Vyper中的一个示例合约 。 合约是一个简单的银行 。 它接受存款 , 并允许来电者一次取款 。 这里需要注意的是@nonreprent注释 。 在同一个函数中调用另一个函数的锁 。 如果没有这样的功能 , 调用者可以在同一事务中重新输入此函数 , 并在调用者余额设置为零之前提取该合同的所有资金 。
C. Obsidian
Obsidian[9] , [15]是一种与区块链无关的编程语言 。 它用类型引入状态信息 , 称为Typestate 。 所有对象引用可以是拥有的 , 也可以是无主的 。 一个对象只能有一个拥有的引用 , 但可以有多个无主引用 。 实际上 , 这意味着在给定的事务期间只有一个调用函数可以改变对象的状态 。 Obsidian的另一个新特点是它的客体状态机制 。 对象的每个状态定义都可以定义一组字段 , 这些字段只有在对象处于给定状态时才有效 。
图4显示了用Obsidian编写的智能合约示例 。 使用存款功能 , 来电者将钱存入钱包 , 钱包的状态从空转满 。 当调用方退出时 , 首先需要获得对货币的引用 , 因为一旦状态转换回空 , 字段货币就不再可用 。
本文插图
D、 Flint
Flint[16]不再处于积极开发阶段 , 但它为智能合约专用编程语言的开发引入了一些新颖的思想 。 这三个关键思想是:
1) 调用者功能 。 每个公共函数必须包含外部调用方可以访问此函数的声明 。 此外 , 编译器将分析这些函数以查找对内部函数的引用 , 以确保调用方可以访问内部函数 。
2) 资产 。 这些是特殊类型 , 例如Ether , 不能被复制、销毁或错误地创建 。
3) 限制写入状态 。 每个对智能合约的内部状态进行变异的函数都必须显式地使用mutating关键字进行注释 。
在图5中 , 有一个用Flint编写的智能合约示例 。 声明智能合约有多个步骤 。 首先是合约的定义和字段的声明 。 接下来声明函数 。 它们按调用方功能分组 。 如图所示 , 存款和取款功能只能由已经在资金图中的调用者访问 。
本文插图
E、 LLL
LLL(Low level Lisp like Language)是以太坊虚拟机的汇编程序之后开发的第一种语言[17] , 它只是围绕着汇编程序本身的一个薄薄的包装器 。 它有一个受Lisp启发的语法 , 每个智能合约都是一个s表达式 。 它提供对执行环境内存的直接访问 , 并且可以针对速度和更小的二进制大小进行优化 。 它是图灵完备的 , 允许程序员访问EVM中可用的任何功能 。
推荐阅读
- 人工智能|第二届中国超级算力大会在京举行
- 数据|首届数字共青发展高峰论坛顺利召开,海云数据智能智造研发基地同期揭牌
- 罗格朗|罗格朗未莱系列全球震撼首发,引领开关插座智能面板新趋势
- 鼎点传媒|智能锁行业面临洗牌,谁能成为乱局中的“剩”者
- 车友头条|21字开辟企业新“征途” 长城汽车企业文化全面焕新
- 物联网|无人智能巡检实现智慧安防
- 超能网|亚马逊转用自家芯片进行人工智能训练,只剩少量程序仍然以显卡来训练
- 市场|多重因素作用 全球智能手机市场面临新一轮洗牌
- |“智能”力量推进垃圾分类
- 智能穿戴,语音助手|HiFi级真无线蓝牙耳机,国民好物aigo T10测评