Vyper再学习(1)--Vyper简介

        半年没有关注Vyper了,它的版本也从0.1.0-beta.10升级到了0.1.0-beta.15。由于Vyper不支持动态数组,因此它的应用受到了一些限制,笔者也暂时放弃了使用Vyper来编写智能合约。今日拾取,一切从头来过重新再学习。学习过程主要以0.1.0-beta.15版本官方文档为对照,其中掺杂了一些个人理解。特记录学习过程,和大家一起共勉。

一、什么是Vyper

        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的一些特性

        根据以上目标,Vyper提供了以下一些特性:

  • 边界和溢出检查。用在数组访问和算术计算时(注:在Solidity中也有数组越界检查,但是没有溢出检查,通常使用SafeMath库)。
  • 支持有符号整数和十进制固定浮点数。(注:在Solidity中也有这两种支持,但Vyper中有符号整数可以用来访问数组,负数就是从后向前访问,同python)
  • 可判定性。在Vyper中可以精确的计算一个函数调用消耗的gas上限(注:在Vyper编译成的ABI中,就有每个函数的gas消耗)。
  • 类型加强。包括支持单位(分为内置单位和自定义单位等)。
  • 小和易懂的编译代码。
  • 对纯函数的有限支持。任何标记为常量的元素都不允许改变以太坊状态。(注:这个主要是针对Solidity旧版本而言的,在0.5.0以前的版本中,标记为view的方法通过不恰当的类型转换,可能会改变状态。在0.5.0版本时已经修复了这人问题)

五、Vyper移除的一些特性

  • 函数修饰符。在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/

不对或者不完善之处敬请大家留言指正。

你可能感兴趣的:(Vyper,区块链)