Vyper是一种应用于以太坊虚拟机(EVM)上的面向合约的python风格的编程语言。Vyper代码编译成字节码后在EVM上运行。
Vyper语言最主要的特点是简单和安全。它的出现主要是针对Solidity语言编写合约时难于阅读(或编写)和安全性较差的问题,从语言层次上作出了一些改进和支持,并抛弃了Solidity中一些复杂的特性。它虽然使用python风格的语法,但其实际上是由Serpent语言升级而来。
二、前置知识虽然你可以直接从Vyper语言上手学习以太坊上的智能合约开发,但Vyper文档并没有提供一些相关的基础知识(比如以太坊)。官方文档中有很多地方也是对照Solidity文档编写的,因此你最好先学习以下内容:
- Python的简单语法。记住只是学习简单语法,Python文档有中文版本,不用花太长时间就可以快速浏览完毕。学会Python基本语法除了可以编写合约外,还可以使用web3.py编写程序和以太坊进行交互。
- Solidity官方文档。这个不是必需的,但是强力推荐。完全学习Solidity需要花费较长较长较长时间(不是写错,是重复),但绝对是值得的。这个不要看中文翻译的,直接看英文文档。
- 以太坊基础知识。Solidity官方文档其中就包括了以太坊基础知识的介绍。
个人经验: Vyper文档不大,如果你对Solidity很熟练的话,几个小时就基本能看完其主要内容。
三、Vyper语言的目标和原则- 安全性。Vyper语言的设计目的是让人们能自然而然的编写出安全的智能合约。
- 语言和编译器简化。个人经验:在0.1.0-beta.10版本时,编译Vyper源代码并不是很便利。那时Remix和truffle都还不支持Vyper,只能自己使用命令行编译和在线编译。笔者那时使用Node.js编写了一个简单的小工具,用来一键编译项目中所有Vyper合约和一键部署及设置合约。现在推荐使用truffle来编译和部署Vyper编写的智能合约,你甚至可以在一个项目中混合使用Vyper和Solidity编写的智能合约。
- 可审计。Vyper代码最大限度的人类可读,并且使用Vyper很少会写出误导性代码。代码对读者简化比对编写者简化重要,尤其对那些没有体验过Vyper或者其它编程语言的读者的简化更重要。
根据以上目标,Vyper提供了以下一些特性:
- 边界和溢出检查。用在数组访问和算术计算时(注:在Solidity中也有数组越界检查,但是没有溢出检查,通常使用SafeMath库)。
- 支持有符号整数和十进制固定浮点数。(注:在Solidity中也有这两种支持,但Vyper中有符号整数可以用来访问数组,负数就是从后向前访问,同python)
- 可判定性。在Vyper中可以精确的计算一个函数调用消耗的gas上限(注:在Vyper编译成的ABI中,就有每个函数的gas消耗)。
- 类型加强。包括支持单位(分为内置单位和自定义单位等)。
- 小和易懂的编译代码。
- 对纯函数的有限支持。任何标记为常量的元素都不允许改变以太坊状态。(注:这个主要是针对Solidity旧版本而言的,在0.5.0以前的版本中,标记为view的方法通过不恰当的类型转换,可能会改变状态。在0.5.0版本时已经修复了这人问题)
- 函数修饰符。在Solidity中,通常使用函数修饰符来做函数运行前或运行后的条件验证。Vyper认为它会容易导致写出一些误导性代码,并且也会鼓励人们在代码中跳来跳去影响可审计性,因此Vyper没有这个特性。如果要在函数运行时做条件验证,只是简单的在函数中使用内联assert就行。
- 类继承。类继承需要人们在多个文件中跳来跳去来查看源码到底是什么,并且需要人们知道怎样处理一些冲突(比如多个类中相同名称的函数)。这会让代码变得复杂并且对可审计性产生负面影响。
- 内联汇编。增加内联汇编不利于全局查找变量(个人理解,未必正确:估计是针对Solidity中内联汇编可以隐藏外部变量这个问题而言,在0.6.0版本中已经做了改动,不能再变量隐藏了)。(注:内联汇编是一种较低级的方法,它会绕过Solidity的一些安全特性。除非必要,否则也不推荐在Solidity中使用内联汇编,并且严重影响可读性)
- 函数重载。函数重载第一可读性较差,也很容易引起冲突,不利于编写;第二可以写出恶意的误导性代码;第三也不利于函数调用追踪。
- 操作符重载。可以写出恶意的误导性代码。
- 自调用。自调用无法计算gas消耗上限,会打开gas限制攻击的大门。
- 无限循环。和自调用类似,也是无法计算gas消耗上限。
- 二进制固定浮点数。因为十进制固定浮点数的字面值会有精确的代表,而二进制固定浮点数的字面值通常会被截断。这会造成预期外的结果,比如在python中,0.3 + 0.3 + 0.3 + 0.1 != 1 。(注:实际运用中几乎用不到浮点数)
Vyper并不是想完全替代Solidity,它不会实现Solidity中的所有功能。它只是认为在符合安全原则时,要故意禁止某些事情或者让这些事情变得更难。 人个经验: Vyper适合开发一些小型的,开发人员不需要过多考虑安全性的合约;而复杂的、相互之间耦合度高、代码重用度高的合约还是需要使用Solidity来编写。
Vyper文档地址 => https://vyper.readthedocs.io/en/latest/
Solidity文档地址 => https://solidity.readthedocs.io/en/v0.6.0/
不对或者不完善之处敬请大家留言指正。