了解以太坊新的開發(fā)語言Vyper

Vyper是一種全新的以太坊開發(fā)語言届腐,主要用于商用區(qū)塊鏈适篙,對區(qū)塊鏈開發(fā)者來說可以提高安全性往核。

Vyper是一種通用的實驗性編程語言,可編譯為EVM(以太坊虛擬機)字節(jié)碼嚷节,Solidity也是如此聂儒。但是,Vyper旨在大規(guī)模簡化流程硫痰,以便創(chuàng)建更易于理解的智能合約衩婚,這些合約對所有相關(guān)方更加透明,并且被攻擊的點更少效斑。

任何針對EVM的代碼都必須是超高效的非春,以最大限度地減少智能合約執(zhí)行所需的gas,因為與低效代碼的合約實際上需要更多的以太執(zhí)行缓屠,并且可能很快變得非常昂貴奇昙,特別是在微處理器等用例中交易。最終的結(jié)果是Vyper看起來在邏輯上類似于Solidity敌完,在語法上類似于Python储耐,但沒有很多面向?qū)ο缶幊谭独赡苄枰粋€新的范式定義用于交易編程。

現(xiàn)在學習這些邏輯和語法上的差異將有助于你成為世界級的Vyper開發(fā)人員滨溉,因為截至2018年6月什湘,Vyper仍處于v0.1.0-beta.1版本!

比較Python晦攒,Vyper和Solidity

在這里闽撤,我們介紹了Vyper高級的“原因”——為我們分析和編寫Vyper代碼提供了一個重點,包括智能合約脯颜。

關(guān)鍵改進1:簡單

Vyper不包含大多數(shù)程序員熟悉的許多構(gòu)造:類繼承哟旗,函數(shù)重載,運算符重載和遞歸。對于圖靈完備語言而言热幔,這些都不是技術(shù)上必需的,并且它們通過增加復雜性來避免安全風險讼庇。由于這種復雜性绎巨,這些結(jié)構(gòu)將使得智能合約由非專業(yè)人員進行審計時難以理解,如在Solidity合約中所見蠕啄。

不常見結(jié)構(gòu)是修飾符(這使得編寫誤導性代碼變得太容易)场勤,內(nèi)聯(lián)匯編(這會使Ctrl+F中斷)和二進制固定點(二進制固定點通常需要近似值)蘑险。

關(guān)鍵改進2:安全

用Vyper開發(fā)者自己的話說劫瞳,Vyper“如果為了提高安全性的目標,它會故意禁止一些事情或者讓事情變得更難狠鸳」郑”

因此留瞳,Vyper并不是Solidity的全部替代品,而是一種在安全性至關(guān)重要的地方使用的優(yōu)秀語言骚秦,例如用于處理患者健康元數(shù)據(jù)的智能合約或用于去中心化AI的模型漸變她倘。

Vyper代碼和句法差異

Vyper的構(gòu)建盡可能與Python類似,同時努力實現(xiàn)安全性和簡單性的目標作箍,因此語言的整體感覺是相同的硬梁,盡管有許多不同需要注意。

執(zhí)行文件

雖然Python腳本執(zhí)行為

python file_name.py

使用vyper編譯腳本

vyper file_name.vy

狀態(tài)變量

狀態(tài)變量是永久存儲在合約存儲中的值胞得,可以是任何類型荧止,例如:

exampleStateVariable:int256。

mapping

Vyper合約包含的第一件事是合約存儲字段阶剑,例如代幣余額映射:

balance: public(wei_value[address])

這是一個定義鍵和相應值的狀態(tài)變量跃巡。

Vyper映射基本上是初始化的哈希表,如上所示个扰,所以“每個可能的密鑰都存在瓷炮,并映射到一個字節(jié)表示全為零的值:一個類型的默認值〉菡”

關(guān)鍵數(shù)據(jù)不存儲在映射中娘香,而只是存儲在keccak256哈希中,以查找其值办龄。

在定義balance時烘绽,給出了類型public(),然后是映射語法:首先給出wei_value的值類型俐填,然后是方括號中的鍵(地址)安接,這類似于Python對數(shù)組的處理。

定義

你會注意到Vyper在定義名稱(如balance)時使用冒號而不是Python的等號英融,盡管Python 3.6包含與變量注釋相同的語法:

context = {} # empty dictionary context["a"]: 2 # annotate dictionary variable

冒號語法用于變量注釋盏檐,冒號用作賦值運算符歇式,僅指定類型注釋。Vyper使用此語法進行真值賦值胡野。

整數(shù)類型

Vyper只有兩種整數(shù)類型:uint256(對于非負整數(shù))和int128(對于有符號整數(shù))材失,與Solidity的uint8到uint256的步長為8,而對于int8到int256則相同(這意味著int類型有64個不同的關(guān)鍵字) )硫豆。

布爾運算符龙巨,運算符,比較和函數(shù)

對大多數(shù)運算符而言熊响,Vyper與Python的語法幾乎相同旨别,包括:

true and false booleans;
not, and, or, ==, and != operators;
<, <=, ==, !=, >=, and > comparisons;
+, -, *, /, **, and % arithmetic operators (only for int128)

以及一些類似的內(nèi)置函數(shù):

 len(x) to return the length of an int; 
 floor(x) to round a decimal down to nearest int; 
 ceil(x) to round a decimal up to the nearest int

還有一些新的:

sha3(x) to return the sha3 hash as bytes 32;
concat(x, ...) to concatenate multiple inputs;
slice(x, start=_start, len=_len) to return slice of _len starting at _start

List

Vyper中的列表使用格式_name:_ValueType [_Integer]聲明,而設置值和返回語句的語法與Python相同汗茄。

例如:

lst: int128[3] # define a list lst = [1, 2, 3] # set the values lst[2] = 5 # set a value by index return lst[0] # returns 1

Struct

結(jié)構(gòu)是你自己定義的類型秸弛,哪些變量組,并使用struct.argname訪問洪碳,因此(有點類似于Python詞典):

struct: { # define the struct

arg1: int128, arg2: decimal



} struct.arg1 = 1 #access arg1 in struct

定義方法

方法(Vyper中的契約方法)在Python和Vyper中以相同的方式定義:

def method():

do_something()

除了Python提供的功能之外胆屿,Vyper還包括特定于以太網(wǎng)的裝飾器,例如@payable和@assert:前者用于使合約能夠進行交易偶宫,后者用于表示布爾表達式:

注意def function_name(arg1非迹,arg2,...纯趋,argx) -> output:syntax用于定義函數(shù)的語法憎兽。與Python不同,Vyper在->之后明確定義def行中的輸出類型吵冒。

構(gòu)造函數(shù)

構(gòu)造函數(shù)遵循與Python相同的約定纯命,并在區(qū)塊鏈上實例化給定的合約和參數(shù)。init初始化程序并且只執(zhí)行一次痹栖。例如:

@public def __init__(_name: bytes32, _decimals: uint256, _initialSupply: uint256):

self.name = _name self.decimals = _decimals self.totalSupply = uint256_mul(_initialSupply, uint256_exp(convert(5, 'uint256'), _decimals))

與在Python中一樣亿汞,self用于斷言實例變量。上面的函數(shù)使用@public裝飾器進行修飾揪阿,以使其具有公共可見性疗我,并允許外部實體調(diào)用它,與默認值相反(或者省略裝飾器)這是私有的南捂。

裝飾器@constant用于裝飾只讀取狀態(tài)的方法吴裤,而@payable使任何方法都可以通過付款來調(diào)用。

事件

你可以在索引結(jié)構(gòu)中使用__log__記錄事件溺健,如下所示:

payment: __log__({amount: uint256, param2: indexed(address)}) tot_payment: uint256 @public def pay():

self.tot_payment += msg.value log.payment(msg.value, msg.sender)

編寫Vyper合約

現(xiàn)在麦牺,讓我們寫幾個簡單的智能合約。以下代碼段允許合約接收NFT(不可互換的代幣)并能夠針對該代幣發(fā)送。

@public def safeTransferFrom(_from: address, _to: address, _tokenId: uint256):

self._validateTransferFrom(_from, _to, _tokenId, msg.sender) self._doTransfer(_from, _to, _tokenId) if(_to.codesize > 0):

returnValue: bytes[4] = raw_call(_to, 'xf0xb9xe5xba', outsize=4, gas=msg.gas)

assert returnValue == 'xf0xb9xe5xba'

下面演示了@public裝飾器剖膳,定義了一個具有明確給定類型的單個參數(shù)的函數(shù)魏颓,以及一個簡單的代碼體,使用斷言語句來驗證用戶是否有權(quán)作為“委托投票”程序的一部分進行投票:

# Give a voter the right to vote on this ballot # This may only be called by the chairperson @public def give_right_to_vote(voter: address):

assert msg.sender == self.chairperson # throw if sender is not chairperson assert not self.voters[voter].voted # throw if voter has already voted assert self.voters[voter].weight == 0 # throw if voter's voting weight isn't 0

self.voters[voter].weight = 1 self.voter_count += 1

在討論了語法和邏輯區(qū)別之后吱晒,代碼并沒有太令人生畏琼开。vyper.online提供“使用委派投票”程序的完整源代碼,使用結(jié)構(gòu)選民和提案枕荞,以及以下恰當命名的函數(shù):

def delegated(addr: address) -> bool 
def directly_voted(addr: address) -> bool 
def __init__(_proposalNames: bytes32[2]) 
def give_right_to_vote(voter: address) 
def forward_weight(delegate_with_weight_to_forward: address) 
def delegate(to: address) 
def vote(proposal: int128) 
def winning_proposal() -> int128 
def winner_name() -> bytes32

與任何編程語言一樣,事先規(guī)劃出主要結(jié)構(gòu)(在本例中為函數(shù)契約)會使編程變得更加容易搞动。要記住Vyper的主要區(qū)別是缺乏OOP范例躏精。在當前的開發(fā)階段,你還無法進行外部代碼調(diào)用鹦肿。

允許外部代碼調(diào)用的注意事項可以在以下開發(fā)建議中看到:

# 擴展合約A:
def foo(): constant 
def bar(): modifying # This contract contract B: a: A 
def baz(): a.foo() a.bar()

運行Vyper

要繼續(xù)編寫代碼矗烛,請轉(zhuǎn)到vyper.online,并在“源代碼”選項卡下編寫代碼示例箩溃,并在準備好后單擊“編譯”瞭吃。Vyper實現(xiàn)和測試執(zhí)行最常用的客戶端(雖然在pre-alpha中)是Py-EVM,最初由Vitalik自己開發(fā)涣旨,允許用戶添加操作碼或修改現(xiàn)有操作碼而無需更改核心庫歪架,從而實現(xiàn)更大的模塊化和可擴展性比典型的客戶端。

要獲得Py-EVM霹陡,只需使用pip install py-evm==0.2.0a16和蚪。

部署Vyper合約

雖然Py-EVM目前處于pre-alpha狀態(tài)并且可能難以啟動和運行,但有兩種更簡單的替代方法可以將Vyper合約部署到公共testnet(以及獎勵):

  • 1)將從vyper.online生成的字節(jié)碼粘貼到Mist或geth中烹棉。
  • 2)使用myetherwallet合約菜單在當前瀏覽器中部署攒霹。
  • 3)(即將推出)在未來,Vyper將與populus集成浆洗,允許你輕松部署Vyper合約催束。

為簡單起見,我們將使用選項(1)和Mist(基于geth的fresh用戶界面而不是基于終端的geth)部署合約伏社。由于Vyper編譯為與Solidity相同的字節(jié)碼抠刺,因此我們不需要任何特定于Vyper的客戶端,并且可以遵循這些稍微迂回的步驟:

  • 1.轉(zhuǎn)到vyper.online并在預先填寫的投票“源代碼”上單擊“編譯”摘昌。
  • 2.復制“字節(jié)碼”選項卡下的所有內(nèi)容矫付。
  • 3.如果你還沒有為你的操作系統(tǒng)安裝Mist。
  • 4.允許節(jié)點下載和同步(這會自動發(fā)生)第焰。
  • 5.在霧設置中選擇“使用測試網(wǎng)絡”买优。
  • 6.創(chuàng)建一個密碼(記住它......)。
  • 7.輸入合約。
  • 8.在Mist界面中選擇“Contracts”杀赢。
  • 9.選擇“部署新合約”烘跺。
  • 10.轉(zhuǎn)到“合約字節(jié)代碼”選項卡。
  • 11.粘貼你從vyper.online復制的字節(jié)碼脂崔。

部署合約

  • 1.選擇“DEPLOY”并輸入之前的密碼滤淳。
  • 2.確認已部署Vyper合約。
  • 3.轉(zhuǎn)到Mist中的“Wallets”選項卡砌左。
  • 4.向下滾動到“最新交易”脖咐。
  • 5.你應該看到我們剛剛部署的合約!

處于“創(chuàng)建合約”狀態(tài)汇歹,因為它沒有被挖掘和驗證屁擅。

結(jié)論

本指南提供了對Vyper的邏輯和語法介紹,允許我們開始編程和部署合約产弹。根據(jù)本指南的知識派歌,你應該能夠為Vyper及其文檔的開發(fā)做出貢獻,并繼續(xù)通過vyper.online編碼來學習痰哨。

同樣胶果,Vyper并不是要取代Solidity,但是正如一項研究發(fā)現(xiàn)超過34,000份易受攻擊的合約斤斧,在對更強安全性的需求比以往任何時候都更大早抠,這使得Vyper成為以太坊的重要未來。

======================================================================

分享一些以太坊撬讽、EOS贝或、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實戰(zhàn)教程:

  • java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解锐秦。
  • python以太坊咪奖,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。
  • php以太坊酱床,主要是介紹使用php進行智能合約開發(fā)交互羊赵,進行賬號創(chuàng)建、交易扇谣、轉(zhuǎn)賬昧捷、代幣開發(fā)以及過濾器和交易等內(nèi)容。
  • 以太坊入門教程罐寨,主要介紹智能合約與dapp應用開發(fā)靡挥,適合入門。
  • 以太坊開發(fā)進階教程鸯绿,主要是介紹使用node.js跋破、mongodb簸淀、區(qū)塊鏈、ipfs實現(xiàn)去中心化電商DApp實戰(zhàn)毒返,適合進階租幕。
  • C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應用拧簸,包括賬戶管理劲绪、狀態(tài)與交易、智能合約開發(fā)與交互盆赤、過濾器和交易等贾富。
  • EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應用的開發(fā)牺六,內(nèi)容涵蓋EOS工具鏈颤枪、賬戶與錢包、發(fā)行代幣兔乞、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點凉唐,最后綜合運用各知識點完成一個便簽DApp的開發(fā)庸追。
  • java比特幣開發(fā)教程,本課程面向初學者台囱,內(nèi)容即涵蓋比特幣的核心概念淡溯,例如區(qū)塊鏈存儲、去中心化共識機制簿训、密鑰與腳本咱娶、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能强品,例如創(chuàng)建地址膘侮、管理錢包、構(gòu)造裸交易等的榛,是Java工程師不可多得的比特幣開發(fā)學習課程琼了。
  • php比特幣開發(fā)教程,本課程面向初學者夫晌,內(nèi)容即涵蓋比特幣的核心概念雕薪,例如區(qū)塊鏈存儲、去中心化共識機制晓淀、密鑰與腳本所袁、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能凶掰,例如創(chuàng)建地址燥爷、管理錢包蜈亩、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學習課程局劲。
  • tendermint區(qū)塊鏈開發(fā)詳解勺拣,本課程適合希望使用tendermint進行區(qū)塊鏈開發(fā)的工程師,課程內(nèi)容即包括tendermint應用開發(fā)模型中的核心概念鱼填,例如ABCI接口药有、默克爾樹、多版本狀態(tài)庫等苹丸,也包括代幣發(fā)行等豐富的實操代碼愤惰,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。

匯智網(wǎng)原創(chuàng)翻譯赘理,轉(zhuǎn)載請標明出處宦言。這里是原文了解新的以太坊開發(fā)語言Vyper

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市商模,隨后出現(xiàn)的幾起案子奠旺,更是在濱河造成了極大的恐慌,老刑警劉巖施流,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响疚,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞪醋,警方通過查閱死者的電腦和手機忿晕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來银受,“玉大人践盼,你說我怎么就攤上這事”鑫。” “怎么了咕幻?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顶霞。 經(jīng)常有香客問我谅河,道長,這世上最難降的妖魔是什么确丢? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任绷耍,我火速辦了婚禮,結(jié)果婚禮上鲜侥,老公的妹妹穿的比我還像新娘褂始。我一直安慰自己,他們只是感情好描函,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布崎苗。 她就那樣靜靜地躺著狐粱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胆数。 梳的紋絲不亂的頭發(fā)上肌蜻,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音必尼,去河邊找鬼蒋搜。 笑死,一個胖子當著我的面吹牛判莉,可吹牛的內(nèi)容都是我干的豆挽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼券盅,長吁一口氣:“原來是場噩夢啊……” “哼帮哈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锰镀,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娘侍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泳炉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憾筏,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年胡桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了踩叭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕潮。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡翠胰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出自脯,到底是詐尸還是另有隱情之景,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布膏潮,位于F島的核電站锻狗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焕参。R本人自食惡果不足惜轻纪,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叠纷。 院中可真熱鬧刻帚,春花似錦、人聲如沸涩嚣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顷歌,卻和暖如春锰蓬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眯漩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工芹扭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坤塞。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓冯勉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摹芙。 傳聞我的和親對象是個殘疾皇子灼狰,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容