以太坊聯合創始人發明了新語言叫板Vyper,主鏈之后語言將引領新一輪大戰?區塊鏈
Vyper與Plutus這對CP,到底誰是合約語言一哥?
對于區塊鏈開發者來說,保持一顆學習的心態至關重要,這不,剛學會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,主要有以下兩點原因:
以太坊的Sharding(分片技術)及Casper FFG的應用,都是用Vyper寫成的;
以太坊的核心開發者,都背書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個步驟,即:
首先聲明一個整數a,為其賦值5;
再聲明一個整數b,為其賦值3;
聲明一個整數c;
將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最重要的新的編程語言,我們需要有敏銳的嗅覺和不懈的努力去更新自己的知識庫。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。