原文: Vitalik Buterin
作者:stvenyin
校對(duì):? stvenyin
峰會(huì)鏈接:https://www.youtube.com/watch?v=Yo9o5nDTAAQ&feature=youtu.be
以下為Vitalik Buterin在Ethereum Devcon3上的演講《Ethereum in 25 minutes, vision 2017》的上半部分。
好的,那么,這個(gè)演講希望成為一種盡可能簡(jiǎn)潔的介紹,與此同時(shí),能夠涵蓋重要的部分,比如,最基本的,從技術(shù)角度來(lái)說(shuō)以太坊(Ethereum)協(xié)議在實(shí)際上看起來(lái)是什么樣的。
那么,我將直接切入,下沉到以太坊之所是,以背景,即以太坊存在的理由,來(lái)開(kāi)始基礎(chǔ)介紹?;氐轿以?013年末寫(xiě)出初始白皮書(shū)的時(shí)候,公眾、區(qū)塊鏈技術(shù)、尤其是那些致力于使區(qū)塊鏈技術(shù)超越僅僅是比特幣(Bitcoin)貨幣的人們,已經(jīng)表現(xiàn)出大量的興趣?,F(xiàn)在,人們正致力于開(kāi)發(fā)以太坊應(yīng)用、發(fā)行資產(chǎn)到區(qū)塊鏈上、眾籌、域名注冊(cè)、域名幣(Namecoin)這樣的項(xiàng)目、產(chǎn)權(quán)登記、投機(jī)、預(yù)測(cè)市場(chǎng)、物聯(lián)網(wǎng)(loT)應(yīng)用、醫(yī)療應(yīng)用。區(qū)塊鏈上有許多的應(yīng)用,超越了像“我有50個(gè)比特幣,我發(fā)20個(gè)比特幣給你,然后你就有了20個(gè)比特幣”這樣。
問(wèn)題在于,那時(shí)候大多數(shù)存在的區(qū)塊鏈都是像這樣設(shè)計(jì)的。我的意思是,這種豆豆計(jì)算器有何意義呢?它可以做到這件事,它也可以把這件事做得很棒,但這也是它唯一能做到的事。誠(chéng)然,如果你有一臺(tái)超級(jí)棒的TI-80(譯者注:德州儀器發(fā)行的一款學(xué)生用科學(xué)計(jì)算器)或是別的,你或許能夠通過(guò)某種方式在上面編寫(xiě)一個(gè)視頻游戲,但沒(méi)有人會(huì)真的想這么做。所以,普遍地來(lái)說(shuō),它最后變成了能用來(lái)做一件事情的一個(gè)工具。
但是,如果我們想讓它做不止一件事情呢?當(dāng)然,你可以為5個(gè)不同的目的買5種不同的設(shè)備,但這很快就會(huì)(回到原點(diǎn))。下一步是,人們開(kāi)始創(chuàng)造像瑞士軍刀一樣的協(xié)議。你可能會(huì)想象,一群人走進(jìn)一個(gè)房間,他們頭腦風(fēng)暴了一個(gè)鐘,然后他們寫(xiě)出了25個(gè)不同的區(qū)塊鏈應(yīng)用,然后,他們達(dá)成了25種不同的交易類型。交易類型一,創(chuàng)建一個(gè)共籌;交易類型二,參與一個(gè)眾籌;交易類型三,創(chuàng)建一個(gè)保險(xiǎn)合約;交易類型四,開(kāi)一個(gè)雙人房;交易類型五,注冊(cè)一個(gè)域名;等等,乃至他們可以想到的每一種應(yīng)用。這就是我使用“瑞士軍刀”的含義。
但問(wèn)題又在于,如果你有了一個(gè)瑞士軍刀協(xié)議,你擁有這個(gè)在一個(gè)房間里孵化出25種不同項(xiàng)目的協(xié)議,他們創(chuàng)建這一協(xié)議,放出這個(gè)協(xié)議,一個(gè)星期以后,一個(gè)芬蘭的小伙子寫(xiě)出了第26個(gè)區(qū)塊鏈應(yīng)用,然后,你必須更改整個(gè)協(xié)議。
所以,為什么不創(chuàng)建一個(gè)像這個(gè)一樣的協(xié)議?(屏幕上是一臺(tái)Windows Phone,屏幕下方有一行字:特別感謝微軟(Microsoft)贊助本次大會(huì)。聽(tīng)眾大笑)
為什么不做一個(gè)基本上像一臺(tái)智能手機(jī)一樣的區(qū)塊鏈協(xié)議,來(lái)取代那些僅支持很少一些應(yīng)用、你能做的也僅僅是這些應(yīng)用的協(xié)議?因此,我們做了一個(gè)區(qū)塊鏈協(xié)議,它支持編程語(yǔ)言,因此也給了你技能來(lái)創(chuàng)建應(yīng)用。一個(gè)應(yīng)用是什么呢?其實(shí),任何人都可以寫(xiě)一些代碼,打包這些代碼并上傳它,然后你就有一個(gè)app!如果任何其他人想使用你的app,他們下載這個(gè)app,然后它就會(huì)出現(xiàn)在他們的手機(jī)上,他們可以使用它,可以運(yùn)行它。對(duì),就是這樣,基本上這就是為什么一個(gè)手機(jī)可以打電話、瀏覽網(wǎng)頁(yè)、聽(tīng)音樂(lè)、用文字與其他人會(huì)話、玩游戲;只是因?yàn)槲覀儗?shù)以千計(jì)的東西集成到一個(gè)設(shè)備上。這就是通用計(jì)算的力量。這也是我想帶給區(qū)塊鏈?zhǔn)澜绲囊环N精神。
概念
所以,首先,以太坊是一個(gè)區(qū)塊鏈!耶~!
加法
但是,你知道,我們?cè)黾恿艘恍〇|西。首先,以太坊擁有一個(gè)內(nèi)置的通用編程語(yǔ)言,允許你在其中編寫(xiě)非常多的應(yīng)用。
現(xiàn)在,在一個(gè)目的只在于支持貨幣轉(zhuǎn)移的區(qū)塊鏈上,那里將只有一種類型的賬戶。這種類型的賬戶將成為這樣的一個(gè)賬戶:它被某些用戶所控制、它將保存貨幣。你將能夠從一個(gè)賬戶發(fā)送這些貨幣到另一個(gè)。但在以太坊上我們有兩種類型的賬戶。
第一種類型的賬戶是被用戶控制的,所以你擁有一個(gè)加密私鑰,你可以用它來(lái)代表你的地址、為執(zhí)行操作的信息打上電子簽名。這些操作被稱為交易,它們可以被廣播到整個(gè)網(wǎng)絡(luò);如果它們被包含到了一個(gè)區(qū)塊中,這些操作就會(huì)生效。
另一種類型的賬戶在根本上由一段運(yùn)行在區(qū)塊鏈自身的代碼來(lái)控制。所以,你可以擁有一個(gè)被一個(gè)計(jì)算機(jī)程序控制的賬戶,這個(gè)計(jì)算機(jī)程序有一些規(guī)則,這些規(guī)則可能說(shuō)的是:如果A發(fā)生了,那就發(fā)一些幣給X;如果B發(fā)生了,那就發(fā)一些幣給Y;如果C發(fā)生了,就僅僅保持現(xiàn)狀。如果你發(fā)送一些幣給這個(gè)賬戶,這個(gè)賬戶的代碼就僅僅是這樣一個(gè)東西:它在那時(shí)候起有能力將這些幣轉(zhuǎn)移到別的地方去。
從字面上來(lái)講,這些就是被一個(gè)計(jì)算機(jī)程序直接控制的電子資產(chǎn)。當(dāng)然,這些合約可以被用來(lái)做更多事情,不止于僅僅控制電子資產(chǎn)。它們可以被用來(lái)表示區(qū)塊鏈應(yīng)用里面任意復(fù)雜的商業(yè)邏輯。這也包括了像ENS,以太坊域名系統(tǒng)(Ethereum Name System)這樣的東西,它可以被用來(lái)跟蹤一些區(qū)塊鏈上的正在投票的方案;它也可以被用來(lái)跟蹤鏈上多種多樣的發(fā)行人背書(shū)資產(chǎn),還有很多不同的用例。基本上,任何人都可以通過(guò)定義一個(gè)合約來(lái)創(chuàng)建一個(gè)應(yīng)用或者任何規(guī)則。
DNS, the Hello World of Ethereum
DNS,這個(gè)以太坊的Hello World,就是其中一個(gè)你可以寫(xiě)出來(lái),并且客觀來(lái)說(shuō)仍然很有用的、最簡(jiǎn)單的應(yīng)用。重點(diǎn)在于,這是一段代碼,而我的意思是,你也許已經(jīng)注意到了,從去年開(kāi)始代碼已經(jīng)發(fā)生了某種程度的變化。根本上來(lái)說(shuō),這是因?yàn)樵谌ツ?,你的代碼是用Serpent寫(xiě)的,而現(xiàn)在我們有了優(yōu)于Serpent的Viper,待會(huì)可能還會(huì)有人來(lái)談這個(gè)話題。因此,你有兩種函數(shù),而這兩種函數(shù)代表了通過(guò)合約你可以做的事情。
domains: {owner: address, ip: num}[bytes32]
def register(addr: bytes32):
if not self.domains[addr].owner:
? self.domains[addr].owner = msg.sender
def set_ip(addr: bytes32, ip: num):
if self.domains[addr].owner == msg.sender:
? self.domains[addr].ip = ip
(PPT上呈現(xiàn)的代碼)
首先,你有了一個(gè)關(guān)于該合約實(shí)際上儲(chǔ)存的東西的描述。這個(gè)合約儲(chǔ)存了關(guān)于一個(gè)域(domain)的映射,誰(shuí)是這個(gè)域的所有者,這個(gè)域支持指向的IP地址是什么。然后,有一個(gè)函數(shù)叫做注冊(cè)(register),如果一個(gè)域還沒(méi)有一個(gè)所有者,所有者會(huì)被給這個(gè)域發(fā)送信息的人所確定,無(wú)論TA是誰(shuí)。所以無(wú)論是誰(shuí)發(fā)送了交易,這個(gè)函數(shù)就被激活了。然后你還有另一個(gè)設(shè)置IP函數(shù),激活這個(gè)函數(shù)也是非常簡(jiǎn)單的,它僅僅只是檢查一下當(dāng)你試圖為一個(gè)域設(shè)置IP地址的時(shí)候你是否擁有它,如果是,它就會(huì)把IP設(shè)置為任何你想要的地方。
所以,在一個(gè)合約中,所有信息都儲(chǔ)存在哪里呢?在一個(gè)簡(jiǎn)單的區(qū)塊鏈上,你可以將區(qū)塊鏈記錄的狀態(tài)(state)認(rèn)為是僅僅對(duì)賬戶的余額作了一個(gè)簡(jiǎn)單的映射。地址12345擁有70個(gè)幣,地址B7884擁有2萬(wàn)個(gè)幣,諸如此類。以太坊的狀態(tài)要略微豐富一點(diǎn)。但也仍然是對(duì)內(nèi)在于賬戶的東西的一個(gè)映射,但這些內(nèi)在于該賬戶的信息可以是復(fù)雜很多的。
所有,首先,你有賬戶余額,就是這個(gè)賬戶有多少以太幣(ether)。你也有Nonce,基本上是一個(gè)用于重播攻擊保護(hù)(replay protection)的對(duì)沖措施。你有合約的代碼,如果該賬戶是一個(gè)合約的話。你也有合約庫(kù)(contract storage),合約庫(kù)就是一種小型的數(shù)據(jù)庫(kù),任何以太坊上的合約都可以使用。在這個(gè)案例中,從域到誰(shuí)擁有這個(gè)域、它的IP地址是什么的映射,將在實(shí)際上被保存在合約庫(kù)里。區(qū)塊鏈上的歷史就是發(fā)生過(guò)的事情,所以你擁有交易記錄。在以太坊上,你擁有這個(gè)叫做“收據(jù)(receipt)”的概念。就現(xiàn)在而言,所有全節(jié)點(diǎn)都儲(chǔ)存狀態(tài),一些全節(jié)點(diǎn)儲(chǔ)存歷史,而不存儲(chǔ)歷史的全節(jié)點(diǎn)也是有可能存在的。
所以,那就是我們到達(dá)的地方。每一個(gè)賬戶對(duì)象都包括4段數(shù)據(jù)。我會(huì)打開(kāi)它大概5秒鐘,因?yàn)槊總€(gè)人都想拍下它。5,4,3,2,1,下一張。
state
State consists of key value mapping addressed to account objects
Every account objest contains 4 pieces of data:
Nonce
Balance
Code hash(code = empty string for private key-controlled accounts )
Storage trie root
然而,如果交易的目標(biāo)包含代碼,也就是說(shuō)如果交易的目標(biāo)是一個(gè)合約,則目標(biāo)地址的代碼就會(huì)運(yùn)行。代碼能夠做一系列的事情。因此合約也有能力發(fā)送以太幣給另一個(gè)合約。它有能力讀取和寫(xiě)入一個(gè)合約內(nèi)部的庫(kù)。所以,如果你回顧這個(gè)例子(譯者注:上述domain例子),一個(gè)對(duì)注冊(cè)函數(shù)(register function)的調(diào)用將變成一個(gè)交易,而這一交易將,你懂的,導(dǎo)致前述域的所有者被確定,以及在庫(kù)中寫(xiě)入該信息,以及,(如果有需要)該聲明從另一個(gè)庫(kù)中讀取信息。綜上,它可以讀取也可以寫(xiě)入庫(kù),它甚至可以調(diào)用另一個(gè)合約。這也被稱為一個(gè)內(nèi)部交易。基本上,合約可以與其它合約通信,其方式與外部用戶與合約通信的方式完全一致。每一個(gè)區(qū)塊鏈上的全節(jié)點(diǎn)都運(yùn)行每一個(gè)交易并存儲(chǔ)全部狀態(tài)。我把它加粗了,因?yàn)檫@是重要的。
Gas
然后,以太坊上的Gas。普遍來(lái)說(shuō),有一個(gè)東西被稱為“停機(jī)問(wèn)題”(Halting Problem),它的基本意思是,你沒(méi)有辦法真正從原則上斷定一個(gè)程序會(huì)不會(huì)永遠(yuǎn)跑個(gè)沒(méi)完。分辨該程序會(huì)不會(huì)在一系列步驟之后結(jié)束,或者將一直運(yùn)行下去,是一個(gè)不管用此種還是彼種方式都不可能從數(shù)學(xué)上得到證明的東西。所以,我們用的解決方案是這樣一個(gè)機(jī)制:我們根據(jù)交易消耗的運(yùn)算步驟對(duì)交易收費(fèi),而我們衡量運(yùn)算步驟的單位就被叫做Gas。
每一筆交易都必須指定Gas限制,該交易必須明確它可以消耗的gas的最大數(shù)量;然后,當(dāng)代碼運(yùn)行的時(shí)候,運(yùn)行開(kāi)始使用Gas;如果代碼運(yùn)行在Gas被耗盡之前停止了,那么萬(wàn)事大吉;但如果代碼運(yùn)行到達(dá)了一個(gè)所有Gas都被花費(fèi)掉的點(diǎn)上,那么該交易會(huì)回復(fù)原狀,從空氣中消失,但交易的發(fā)送者仍然必須支付一筆費(fèi)用。
所以,以太坊上的Gas限制是比特幣上區(qū)塊大小限制的對(duì)應(yīng)物,而它被設(shè)定的方式也是非常簡(jiǎn)單的——基本上由礦工們投票來(lái)決定?,F(xiàn)在,Gas上限是6.7百萬(wàn)單位。如果我們到達(dá)了上限并且有必要提高它,礦工們可以投票。非常簡(jiǎn)單。