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