查看原文
其他

以太坊联合创始人发明了新语言叫板Vyper,主链之后语言将引领新一轮大战?

blockgeeks 区块链大本营 2018-10-26

作者 / Blockgeeks

编译 / Aholiab



在之前的文章中,营长从特性、规则和应用的角度,向大家全面介绍了以太坊新的合约语言Vyper的内容,很多朋友表示想看Vyper编程的实例。


在今天的文章中,营长就对Vyper这门新语言做更加深入的分析,并实际展示给大家看看Vyper写成的合约到底是什么样的。


另一方面,由原以太坊联合创始人Charles Hoskinson创办的第三代加密货币Cardano也推出了自己的合约语言Plutus,这门语言随着Cardano的背书,一经推出就呼声很高,经常被认为是可以跟Vyper分庭抗礼。


那么,这两种语言,到底谁才能一统未来智能合约的江湖?


对于区块链开发者来说,保持一颗学习的心态至关重要,这不,刚学会Solidity的你,眼看这门语言就要被Vyper取代了。


之前营长分享了以太坊新编程语言Vyper的介绍,朋友们纷纷表示想看Vyper编写代码的实例。为了满足大家,今天营长就给大家看一下用Vyper编写的代码到底长啥样。


没看过的同学赶紧来补课:V神绞尽脑汁开发Vyper,Python、Solidity要失宠?十分钟,看完这份12岁儿童都能看懂的智能合约指南,你就明白了…


不过另一方面,作为Cardano的主打合约编程语言,Plutus一直被认为是Vyper的核心竞争者


那么,这两门语言到底有什么差别对于开发者来说该如何选择哪个才能代表智能合约的未来



智能合约的未来,Vyper vs. Plutus


在讲Vyper之前,我们先来看看现在以太坊的合约语言Solidity。Solidity是由Gavin Wood、Christian Reitwiessner、Alex Beregszaszi、Yoichi Hirai,以及其他一些以太坊核心开发者开发的。


这门语言在设计之初参考了很多著名的项目和编程理念,如面向对象编程、web编程、汇编等,也覆盖了大量的使用场景。然而,Soldity并不完美,用它写出来的合约在审校上非常困难,原因在于过于多变,造成代码结构十分复杂。


因此,以太坊期望用Vyper来解决这些问题,由于有以太坊的背书,Vyper一直都受到无数开发者的关注


而另一方面,Plutus作为一个被认为是能与Vyper对标的语言,则显得有点被低估了


作为前以太坊联合创始人,Charles Hoskinson深刻理解第二代加密货币平台(以太坊)的种种弊端,如可扩展性等,因此Plutus在设计上采用了函数式编程方式,针对其前辈Haskell做了大幅升级,语法简洁,也拥有更强大的数学运算能力。


下面,就让我们一起来对比一下这两门语言吧。



毒蛇之信:Vyper



而Vyper语言的设计则正是针对Solidity的这些痛点,先来看看Vyper的官方定位:


Vyper是一门直接、简单的编程语言,对于智能合约的阅读和审计非常友好,可以帮助开发者更好地把注意力放在业务逻辑的实现上。


从这一定位就可以看出,Vyper的使用更简便、高效,尤其在代码审计上较之Solidity的提升很大。这一特性,主要归功于Vyper是基于Python的。而Python这门语言设计的初衷,就是让非技术人员都能编写合约的编程语言,语法结构十分简洁易懂。


不过,虽然Vyper很好地继承了Python简单易懂的特性,但也牺牲了很多Solidity的灵活性,因此,Vyper更适合写一些「小需求」,像写DApp这种大工程就有点捉襟见肘了。


我们不难理解以太坊之所以强推Vyper,主要有以下两点原因:


  1. 以太坊的Sharding(分片技术)及Casper FFG的应用,都是用Vyper写成的;

  2. 以太坊的核心开发者,都背书Vyper,希望它可以作为以太坊智能合约的默认语言。


除此之外,虽然继承了Python的简洁易懂,但Vyper安全方面,避免了一些状态修饰符递归调用和运算符重载造成的gasLimit向量攻击。此外,Vyper还包含大量针对算术运算的溢出检查。这样就杜绝了在合约审计过程中插入的恶意代码。


下面我们就一起来看一个由Vyper写成的智能合约,这个合约使用的是ERC-20标准。代码如下:



在上面代码中:


  • self函数用来在当前类中指定实例变量(instance variables);

  • @public@private则设定当前合约的ABI(Application Binary Interface,应用二进制接口)的能见度和曝光度,并允许外部函数(如其他合约或钱包地址)的调用。



手持函数式秘密武器的Plutus



说完了Vyper,咱们再来介绍介绍本文的另一位主角Plutus。说起Plutus,可能国内的开发者不是特别熟悉,它是由Cardano推出的函数式编程语言,用来编写智能合约。


其实,Cardano推出过两种编程语言,一个是大名鼎鼎的Haskell,另一个则是Plutus。与Vyper一样,在讲Plutus之前,我们也看一下官方给这门语言下的定义:


Plutus是一门纯净的函数式编程语言,用来在Cardano上编写智能合约。其语法类似Haskell,比如在定义数据类型是,开发者可以直接调用类型名称、类型参数,以及构造函数替代(constructor alternative)列表,与Haskell一样,每个构造函数替代都有自己的类型参数。


更多关于Plutus的内容,可以参考官网:

https://cardanodocs.com/technical/plutus/introduction/


正如上面所说,Plutus是一种函数式的编程语言,要理解Plutus的精妙之处,就需要先知道什么是「函数式编程」。


目前,所有的编程语言,都可以被分为两大类:函数式编程(Functional programming)和指令式编程(Imperative programming)。


让我们先来看看「指令式编程」。



指令式编程


简单来说,指令式编程是指,开发者需要把所有计算机需要的运算步骤都写在代码里,每一步都是指令


几乎所有传统的编程语言都是命令式的编程语言,如C++、Java,甚至Solidity。因此有时我们也称指令式编程为「算法编程」(algorithmic Programming)。


举个栗,如果我们在C++上实现一个需求:5+3=?,那么代码应该是:



从上面代码中可以看出,要实现这样一个简单的运算,需要4个步骤,即:


  1. 首先声明一个整数a,为其赋值5;

  2. 再声明一个整数b,为其赋值3;

  3. 声明一个整数c;

  4. 将a与b的值相加,存储到c


因此,这样一个加法运算要花费很多步骤,每个步骤都会对整个程序的状态产生影响,每个步骤也都有自己独立的运行结果。



函数式编程


函数式编程则不然。


它是指将电脑运算视为函数的编程方式。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。


和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。


举个例:假如现在有一个函数f(x),我们希望用它来计算另一个函数g(x),然后再用结果与第三个函数h(x)进行运算。与指令式编程不同的是,我们不需要一行行的去运行和计算,只需要写一行代码即可


h(g(f(x)))


因此,函数式编程对解决数学类问题更友好也更安全,另外,函数式语言还可以帮助做形式化验证,即从数学的角度审计合约代码到底执行的是什么逻辑。这也是Cardano之所以使用函数式语言来写合约的原因(Haskell也是函数式语言)。


搞清楚了什么是函数式编程,让我们回到正题,接着说说Plutus这门语言


简单来说,我们可以把Plutus看做是一个升级版的Haskell,只是语法更为简洁。与其说它是为编程而生,不如说它是为数学而生。


正因为这一特性,Cardano把Plutus定位在:金融机构、电商、股票期权交易等场景。


说了这么多,让我们实际看一下用Plutus写成的合约长啥样吧,

感兴趣的话可以在这里找到合约的源文件:

https://cardanodocs.com/technical/plutus/examples/


以下Plutus代码展示了加法、乘法和阶乘运算:


从上面代码中,可以看出函数式编程比指令式编程简洁了多少,就跟算术题一样。



写在最后


「币圈一天,人间一年」,区块链的发展一天一个样,作为开发者,了解最新的趋势和技术发展至关重要。


作为以太坊和Cardano最重要的新的编程语言,我们需要有敏锐的嗅觉和不懈的努力去更新自己的知识库。


希望今天的文章能让你对Vyper和Plutus有更深的认识,喜欢就分享给好基友吧~



内容转载请联系微信:

qk15732632926(备注:微信公众号+转载)

商务合作请联系微信:

fengyan-1101(备注:区块链大本营+商务合作)


最新热文:



大力戳↑↑↑  加入区块链大本营读者⑦号群

(群满加微信 qk15732632926 入群)

(内容转载请联系微信:qk15732632926)

(商务合作请联系微信:fengyan-1101)







了解更多区块链技术及应用内容

敬请关注:


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存