智能合約(二) - 撰寫智能合約的程式語言


Posted by 阿嘉 on 2021-06-30

一、Solidity:用來撰寫智能合約的程式語言之一,也是最多人用的,Solidity的語法概念最早是由加文·伍德在2014年提出,後期則以Christian Reitwiessner所領導的以太坊團隊Solidity接手開發。(出處:維基百科)
由於加文·伍德在規劃Solidity語言時參照了ECMAScript的語法概念,所以Solidity語法比較類似JavaScript,對於寫過JavaScript的人來說是相對比較容易上手的,Solidity最後經過編譯後可以放到EVM(Ethereum Virtual Machine)上執行。
區塊鏈其實分為:公鏈(比特幣(Bitcoin)以太坊(Ethereum))、測試鏈(RopstenKovanRinkebyGoerli)、個人鏈(Ganache),這個部份我另外再開篇幅做講解,這裡就不多做解釋。

所以如果您是對於JavaScript相對熟悉的話,那選擇用Solidity來撰寫智能合約就對了,在學習上會來的輕鬆一些,照著官方文件做學習,應該就能學會如何撰寫智能合約了,Solidity官方網站

pragma solidity ^0.4.19;

contract HelloWorld {
    function sayHello() public returns (string) {
        return ("Hello World");
    }
}

學習的話還有另外一個僵屍遊戲教學平台,藉由僵屍遊戲的教學,教你一步一步學習Solidity,由於中間是用僵屍來當做說明的,比如而如何產生一個僵屍、僵屍攻擊等,我個人是覺得還蠻有意思的,簡單易學,還蠻推薦的。

二、Vyper:用來撰寫智能合約的程式語言之二,Vyper 是一種面向合約的Pythonic編程語言,針對以太坊虛擬機 (EVM),相對於Solidity是比較相似於JavaScript的,Vyper是較相似於Python的,由於Vyper比Solidity晚出現,所以目前網路上對於Vyper的相關教學相對來說會比較少,但還是可以到Vyper官方網站去做學習,如果你是比較熟悉Python的話,IDE的話一樣都可以使用RemixVisual Studio Code做為開發環境,這個就看個人的習慣了。

# @version ^0.2.0

greet: public(String[100])

@external
def __init__():
    self.greet = "Hello World"

兩個程式語言各有各的優缺點,如果你還是很困惑該選哪一個,那我們來比較一下這兩個有什麼差異?在Vyper的官方文件中有詳細的說明,有興趣的人可以點進去了解:Vyper官方文件,下面是我針對有對它的說明做的一些理解說明,有疑慮的可以點進去官方文件中了解。

  • Vyper沒有Modifiers,取而代之的是assert及assert_modifiable。
  • 沒有繼承(Class inheritance),Vyper的說明是去除繼承能夠提升程式的可讀性和安全性,畢竟一個寫的很複雜的繼承會降 低程式的可讀性(要一直找繼承xd),看到頭都暈了,相對的也能提升安全性(易讀就不容易寫錯),這樣說也是有道理。
  • 沒有重載(Function overloading),官方說法是:"這可能會導致在任何給定時間調用哪個函數時產生很多混淆",個人覺得是還好,但官方主要是強調Vyper的程式碼易讀性,也可以說是程式碼的單純性,所以去限制了重載的功能,進而提升程式碼的易讀性(不讓你寫的太複雜xd)。
  • Recursive calling,官方說法是:"Recursive calling會使得無法設置gas limit的上限,為gas limit攻擊敞開大門",gas是合約交易時要支付的費用,可以看成是手續費。
  • Infinite-length loops,官方說是:"和遞歸一樣無法Set gas limits,會有安全性移疑慮"

以上說明,希望各位看的還明白,Solidity是比較早出來的,所以網路上的教學也好、範例也好都是會比較豐富的,但Vyper是最近幾年才出現的,也有它的優點,看得出來是希望讓開發人員撰寫出比較易讀又安全的程式碼,而且是類似Python的(對熟悉Python而不熟JavaScript的人來說是一大吸引力),只是網路上的教學或是範例目前還是相對來說比較少的,選好未來想做為開發合約的程式語言了嗎?那就來繼續往下面走吧。


#solidity #Vyper #智能合約 #smart contract









Related Posts

component test 問題集3(React18 + TS + Jest + react-testing-library)

component test 問題集3(React18 + TS + Jest + react-testing-library)

JavaScript 五四三 Ep.03 Array.prototype.filter()

JavaScript 五四三 Ep.03 Array.prototype.filter()

解構賦值 destructuring assignment

解構賦值 destructuring assignment


Comments