以太坊(Ethereum)協議的發展史

買賣虛擬貨幣

雖然當前以太坊協議背後的思想已經很大程度上穩定了兩年了,但是以太坊當前的構想和形式並不是一次性完成的。在區塊鏈推出之前,該協議經歷了一些重大的演變和設計決策。本文的目的是討論協議從開始到釋出的演變過程;但是我不會一一提及例如Geth,cppethereum,pyethereum以及EthereumJ這些在協議的實現上做出的無數工作以及以太坊生態系統中應用和企業的歷史。

同樣在本文中不會提及的還有Casper以及分片研究的歷史。我們當然可以寫更多的部落格來討論Vlad,Gavin,我自己以及其他人提出並最終捨棄的各種各樣的觀點,其中包括“工作量證明之證明”,輪輻式鏈(hub-and-spoke chains), “hypercubes”, 影鏈(shadow chains)(可以說是Plasma的前身),鏈纖維( chain fibers),以及Casper的各種迭代,還有Vlad的在推理共識協議的激勵機制及其性質的快速演變思想。在一篇部落格中討論這些將是一個太過複雜的事情,所以我們在此就不進一步討論這些。

讓我們從最早的版本開始,這個版本最終成為了以太坊但是當時它甚至還不叫以太坊。當我在2013年10月訪問以色列的時候,我花了很多時間與Mastercoin團隊在一起,甚至還給他們推薦了一些功能。在花了一些時間思考他們所做的事情後,我向該團隊提出了一個建議,那就是讓他們的協議更加的通用化,能夠支援更多型別的合同而不需要增加同樣龐大而複雜的功能集:

https://web.archive.org/web/20150627031414/http://vbuterin.com/ultimatescripting.html


請注意,該版本與之後範圍更廣的以太坊版本大不相同:它單純地專注於Mastercoin當時嘗試的方向,即雙方合約,該合約是指A方和B方都會投入資金,之後根據合同中規定的一些公式他們可以將錢取出來(例如,賭注內容為“如果X發生了,則所有的錢都給A,反之都給B”)。該指令碼語言不是圖靈完備的。

Mastercoin 團隊對此印象深刻,但是他們並沒有興趣放棄他們所作的一切事情並朝著這個方向發展,我越發覺得這是一個正確的選擇。接著,大約在12月,我更新了第二個版本:

https://web.archive.org/web/20131219030753/http://vitalik.ca/ethereum.html

在這裡,你可以看到進行了大量重構的結果,這很大程度上是11月份我在舊金山一次散步的結果,那時,我意識到智慧合約有完全通用化的潛力。合同本身就是完全成熟的賬戶而不是像指令碼語言那樣只是單純的描述雙方關係的方式,合同具有持有,傳送和接收資產的能力,甚至可以保持永久性儲存(當時,永久性儲存被稱作“記憶體”,並且這僅有的臨時“記憶體”是256個暫存器)。這種語言從基於堆疊的機器轉變成自我意志為基礎的基於註冊的機器;我對此幾乎沒有異議,除了它看起來似乎更加複雜。

此外,可以注意到,該版本還有一個內建的收費機制:

在這個階段,以太(Ether)按照字面意思是氣;在每一個計算步驟之後,一個交易呼叫的合約的餘額將會減少一些,如果合約餘額耗盡,則停止執行。請注意,這個“接收者支付”機制意味著合約本身要求傳送者必須向合約支付一筆費用,否則立即退出執行;該協議分配了16個免費執行步驟的許可,以允許合約拒絕不支付費用的交易。

以上所述階段的以太坊協議完全是由我自己創造的。然而,從這裡開始,新的參與者開始加入。到目前為止,協議方面最突出的是Gavin Wood,他2013年12月在about.me用站內私信開始與我聯絡。

Jeffrey Wilcke,Go 客戶端(那時被稱作“ethereal”)的首席開發者也在同一時期聯絡了我並開始進行程式設計。他的貢獻更多的是在客戶端開發方面而不是協議研究方面。


“嗨 Jeremy,很高興看到你對以太坊感興趣”

Gavin的早期貢獻是雙重的,首先,你可能會注意到在初始設計中的合同呼叫模型是非同步的:雖然合同A可以建立一個“內部交易(internal transaction)”給合同B(“內部交易“是以太坊的行話;最初他們僅僅被稱為“交易”,之後又被叫做“訊息呼叫”或者“呼叫””),但第一個交易完全完成之前,內部交易是不會啟動執行的。這意味著交易不能使用內部交易作為從其他合約獲取資訊的方式;唯一實現該功能的方法就是EXTRO 操作碼(類似於你可以用於閱讀其他合約儲存內容的SLOAD),這隨後在Gavin和其他人的支援下被刪除了。

在實現我最初的規範時,Gavin自然地實現了內部交易的同步化,他甚至沒有意識到這與最初的設計是不同的-也就是說,在Gavin的實現中,當一個合約呼叫另一個合約時,內部交易會立即執行,一旦該執行完成,虛擬機器將返回到建立內部交易的合約並轉到下一個操作碼。這種方法似乎對我們雙方都有優勢,所以我們決定把它當作規範的一部分。

接著,我和他之間的一次討論(那發生在一次舊金山漫步中,因此具體的細節將在歷史的洪流中湮沒,但也可能會存在於NSA的深層檔案中的一兩份檔案中)開啟了對交易費模式的重構,從“合同支付”方式轉向“傳送方支付”方式,並且切換到“gas”的架構。交易發起者支付並被分配到一些“gas”(大致是一個計算步驟的計數器)而不是在每個獨立的交易步驟執行後立刻消耗一點以太,同時計算步驟來源於gas的允許量。如果進行某筆交易時gas不足,所剩的gas還是會被沒收的,但整個執行將被複原;這似乎是最安全的做法,因為它刪除了之前需要擔心的整個“部分執行”的攻擊型別。當交易執行完成時,任何未使用的gas費用將被退還。

Gavin也對以太坊逐漸成為一個用於構建可程式設計資金的平臺做出了巨大貢獻,該平臺有基於區塊鏈的合約,能持有數字資產並將其按照預設規則轉移到通用計算平臺上。這種變化從重點和術語的微妙變化開始,後來隨著對“Web3”整合的日益強調,這一影響也而逐漸變強,它將以太坊視為一套分散式技術的一部分,另外兩部分則是耳語協議以及蜂群協議。

2014年初,還有一些根據其他人提出的建議做出的改變。在Andrew Miller等人提出這個想法後,我們最終又回到了基於堆疊的架構。


Charles Hoskinson 建議從比特幣的SHA256轉換成較新的SHA3(或者更準確的說,keccak256)。雖然有過一段時間的爭議,但是透過Gavin,Andrew等人的討論決定,建立了堆疊裡值的大小應該限制為32位元組的方案;另一種被考慮的替代方案是無限制的整數,該方案有一個問題那就是很難計算出加法,乘法和其他操作所需的gas的量。

我們最初想到的挖礦演算法,要回溯到2014年2月,是一個叫Dagger的玩意兒:

https://github.com/ethereum/wiki/blob/master/Dagger.md

Dagger是以“有向無環圖”(DAG)命名的,DAG是演算法中用到的一種數學結構。Dagger的思想就是對於每N個區塊,由種子值生成一個偽隨機的DAG。DAG的底層將會是一個需要用幾個千兆位元組來儲存的節點的集合。不過,DAG中生成任何一個獨立的值只需要計算幾千個條目,一個“計算Dagger”包括在這種最底層的資料集中生成一系列隨機數,然後求他們的雜湊。這就意味著有一個迅速的方式進行Dagger計算——記憶體中已經有了資料,然後用一個雖然慢卻不會引起記憶體緊張的方式——重新從DAG中得到每個資料,而不是從其他節點下載。

這個演算法的目的就是要和當時流行的演算法一樣具有相同的“記憶體難解”屬性,就像Scrypt演算法,並且要求是輕客戶端友好的。礦工會採用快速的方法,所以他們的挖礦速度就會受到記憶體頻寬的約束(理論上認為普通的記憶體已經是非常最佳化的了,所以在ASIC上對它進一步最佳化是非常困難的),但是輕客戶端會在無記憶體限制的慢CPU環境中進行雜湊驗證。快速的方式可能就用幾微秒,但是這種慢速無記憶體限制的方式可能用上幾毫秒,所以這對於輕客戶端來說也是可行的。

從此開始,在以太坊發展的過程中這個演算法做出了幾次重大的改變。我們接下來的想法就是“自適應工作量證明”,這裡的工作量證明包括執行隨機選出的以太坊合約,而且它為什麼能抵抗ASIC的原因是非常高明的:如果應用了某ASIC,競爭礦工就有建立和發行那個ASIC並不擅長計算的合約的動機。沒有一種ASIC能用於通用計算。故事接著說下去,因為它只是一個CPU,所以我們可以用這種對抗激勵機制來進行實質上是使用通用計算的工作量證明。

這個想法由於一個簡單的原因而被否了:遠端攻擊。攻擊者可以從塊1開始一個鏈,只用簡單的合約來填充它,而且這種合約是比較特殊的,可以為它建立專門的硬體,使得這條鏈迅速超過主鏈。所以。。。。又回到起點。

下一個演算法被稱為隨機電路,在這個Google檔案中有詳細的描述,它是由我和Vlad Zamfir提出,Matthew Wampler-Doty和其他幾個人分析的。這裡我們的想法就是模擬挖礦演算法中的普通計算,模擬的方法是執行隨機生成的一些電路。這裡沒有任何基於這些原則不能工作的硬性證明,但是我們2014年諮詢過的電腦硬體專家對此都不表示看好。Matthew Wampler-Doty 提出了一種基於SAT的POW機制,但最終也不行。

最後,我們全身心的投入到了“Dagger Hashimoto”演算法中,簡稱“Dashimoto”,這種演算法從Hashimoto中借鑑了很多,這是Thaddeus Dryja首創的工作量證明機制,它開創了“I/O繫結的工作證明”的概念,其中挖礦速度的主要限制因素不是雜湊雜湊的速度,而是RAM每秒可訪問的兆位元組數。然而,Dagger Hashimoto將上述工作量證明機制與Dagger的輕客戶端友好的DAG生成的資料集的概念結合了起來。經過了我、Matthew、Tim和其他人的多次調整之後,這些想法終於融合進了我們現在稱之為“Ethash”的演算法中。

到2014年的夏天,這個協議已經相當穩定,除了到2015年初才能完成的Ethash工作量證明演算法之外,以Gavin黃皮書形式存在的半正式規範已經面世了。


在2014年8月,我開發並介紹了叔伯機制,它可以使以太坊的區塊鏈有一個更短的區塊時間和更高的容量,同時降低了集中化的風險。叔伯機制的介紹釋出在PoC6中。

與Bitshare團隊討論後,我們考慮使用堆作為主要資料結構,但我們最後還是沒有這樣做,因為我們時間不夠,而且後來的安全審計和DoS攻擊表明在安全這方面它實際上比我們當時想象的更難。

9月,我和Gavin計劃對協議設計做出以下兩大重要的改變。首先,除了狀態樹和交易樹,每一個區塊將包含一個“收據樹”。收據樹將包含每次交易的所有交易日誌的雜湊值,以及中間狀態根。交易日誌允許交易建立可以儲存在區塊鏈上的輸出,並且輕客戶端是可以訪問的,不過將來的狀態計算是不可以訪問的。這可以用於分散式應用程式很容易的查詢交易,例如token的傳輸、購買、正在建立和進行的交易單據和正在進行的拍賣等。

我們還有一些其他的想法,例如把merkle樹從整個交易執行中提取出來,以便進行任意事物的證明。在對簡單性和完備性的權衡之後,我們選擇了日誌,。

第二個就是預編譯的思想,解決了允許複雜加密計算在以太坊虛擬機器中可用而不必處理虛擬機器開銷的問題。我們還經歷了許多關於“本地合約”的雄心勃勃的想法,如果礦工有一些合約的更最佳化的執行方法,他們就會“投票”下調gas費用,因此,對於那些大多數礦工都能快速執行的合約,自然就有較低的gas費用;不過,所有的這些想法都被否絕了,因為,我們無法提出一種在密碼經濟學看來安全的方式來實現它。攻擊者總是可以建立一些合約,去執行活動的加密操作,然後將活動門分發給自己和朋友,這樣就能更快的執行這個合約,如此一來,gas價格就會降低,就能進行DoS攻擊。相反,我們選擇了一個沒有那麼大的野心的方法,即在協議中簡單指定的少量的預編譯器,例如用於雜湊雜湊和簽名方案等常用操作。

Gavin也是支援“協議抽象”的最初的關鍵人員。協議抽象就是將協議的許多部分,例如以太幣餘額、交易簽名演算法、Nounce(一次性隨機數)等,作為合約遷移到協議本身中,並且理論上要實現的最終目標是要達到一個狀態:整個以太坊協議能夠被描述為將功能呼叫函式加入到具有一些預初始化狀態的虛擬機器中的狀態。我們沒有足夠的時間把這些想法都在最初的Frontier中實現,不過這些原則預計將會隨著君士坦丁堡分叉、Casper合約和分片規範而慢慢整合到其中去。

這一切都在PoC7中實現了,在PoC7之後,除了一些較小的,儘管在某些情況下是比較重要的,協議沒有太大的變化。這些細節將會在透過安全審計後呈現給大家。

在2015年初,Jutta Steiner等人組織了釋出前的安全審計,包括軟體程式碼審計和學術審計。軟體程式碼審計主要是在C++和Go的實現上,分別由Gavin Wood和Jeffrey Wilcke主導的,其實還有我的Pyethereum實現的一次簡單審計。在兩次學術審計中,一次由Ittay Eyal(因提出“自私挖礦”攻擊成名)執行,另一次由Andrew Miller和 Least Authority的其他成員進行。透過Eyal審計我們做了一個小小的協議變更,鏈的難度值不包含叔伯節點。第二次審計側重於智慧合約、合約費用以及Patricia樹。透過這次審計我們也進行了幾處協議的變更。一個是使用sha3(addr)和sha3(key)作為鍵值,而不是直接使用地址和鍵值;這將使得更難對樹進行最壞的攻擊。

有一個可能有點超前的警告。。。。。。

我們討論的另一個比較重要的問題就是gas限制投票機制。當時,我們已經對沒有任何進展的比特幣塊大小討論感到擔心,並希望在以太坊中有一個靈活的能夠按需調整的設計。但這其中的挑戰就是:什麼是最佳的限制?我最初的想法是做一個動態的限制,是實際gas使用量長期指數移動平均值(EMA)的1.5倍,所以長期來看區塊平均都是2/3滿的。然而,Andrew證明了這種限制在某些方面是可以被利用的,具體來說就是:想要提高限制的礦工們,他們只需要把需要花費大量的gas卻只需很少的處理時間的交易都包括在自己的塊中,從而建立出完全塊且不會對自己造成損失。因此,這個機制的安全模式相當於只是讓礦工對gas限制進行投票,可能還不如礦工投票。

我們沒有想出來一個更好的gas限制的策略,Andrew的建議是明確地讓礦工對gas限制進行投票,而且預設的是1.5倍的EMA投票規則。原因在於我們還沒有認識到設定最大gas限制的具體的方法,而且任何具體做法的風險都似乎都遠遠高於礦工濫用投票權的風險。因此,我們還不如直接讓礦工對gas限制進行投票,接受gas限制過高或過低的風險,這樣一來,能夠更加靈活,礦工也可聯合,迅速按需調整gas限制的高低。

在我和Gavin、Jeff進行了一個小型駭客松之後,3月份推出了PoC9,旨在成為概念證明的終稿。我們執行了一個測試網,Olympic,跑了四個月,用的是將要用在真實網路中的協議,並且建立了以太坊的長期計劃。Vinay Gupta寫了一篇部落格,“以太坊的開展過程”,描述了以太坊開發的四個預期階段,並把它們命名為:Frontier(前線)、Homestead(家園)、Metropolis(大都會)和Serenity(寧靜)。

Olympic執行了4個月。前兩個月,在各種實現中發現了許多錯誤,發生了共識失敗等問題,不過到6月左右網路已經顯著的穩定了。我們在7月份做出了凍結程式碼的決定,隨後7月30日釋出了最初版本。

原文連結: http://vitalik.ca/general/2017/09/14/prehistory.html
作者:
 Vitalik Buterin
翻譯&校對: Aisling 、劉豔安 Elisa

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;