原文標題:《V 神 : 以太坊協議的史前史》
文章來源:公衆號 紅叔筆記
作者:紅軍大叔

歷史是一面鏡子,本文翻譯自一篇 V 神在 17 年寫的 blog。

博客寫作時間:2017 年 9 月 14 日

儘管當前的以太坊協議背後的想法已經穩定了兩年,但是以太坊並沒有在當前的概念中一下子全部出現並完全形成。 在區塊鏈啓動之前,該協議經歷了一系列重要的進化和設計決策。 本文的目的是講述協議從開始到發佈所經歷的各種演變 ; 在協議實現上所做的無數工作,如 Geth、 cppetherium、 pyethereum 和 etherumj,以及在以太坊生態系統中的應用程序和業務的歷史,都明顯超出了範圍。

Casper 和分片研究的歷史也超出了範圍。 當然,我們可以製作更多的博客文章,討論 Vlad、Gavin、我和其他人提出的各種各樣的想法,還有丟棄的東西, 包括 「 工作量證明 」、hub-and-spoke 鏈、「 超立方體 」、影子鏈 (可以說是 Plasma 的前身)、fibers 和 Casper 的各種迭代,以及 Vlad 關於共識協議及其屬性中的參與者激勵機制推理的迅速發展的想法,但這也是一個太複雜的故事,不能在一篇文章中討論,所以我們暫且不討論它。

讓我們先從最早的版本開始,它最終成爲了以太坊,那時它甚至還不叫以太坊。 當我在 2013 年 10 月訪問以色列的時候,我花了相當多的時間和 Mastercoin 團隊在一起,甚至還爲他們提供了一些功能。 在花了幾次時間思考他們在做什麼之後,我向團隊提交了一份提案,讓他們的協議更加通用化,並支持更多類型的合約,而不需要增加龐大、複雜的一系列特性 :

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

Vitalik 親述以太坊發佈史:從 Mastercoin 提案到 Ethash 成型

請注意,這與以太坊的後期和更廣闊的視野相差甚遠:它完全專注於 Mastercoin 試圖專注的事情,即兩方合約,其中 A 方和 B 方都會投入資金,然後他們會在以後根據合約中規定的某個公式獲取資金(例如,投注會說「如果 X 發生則將所有資金全部交給 A,否則將所有資金全部交給 B」)。 腳本語言不是圖靈完備的。

這給 Mastercoin 團隊留下了深刻的印象,但是他們沒有興趣放棄他們正在做的一切去朝這個方向前進,我越來越相信這是正確的選擇。 下面是第二版,大約在 12 月 :

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

640 (1).jpg

在這裏,你可以看到實質性重新構建的結果,這主要是由於我在 11 月份在舊金山進行了長途漫步,一次,我意識到智能合約可能會完全普及。 合約本身不是簡單地描述雙方關係條款的一種方式,而是本身完全成熟的帳戶,並且能夠持有,發送和接收資產,甚至維持永久存儲(當時, 永久存儲被稱爲「內存」,唯一的臨時「內存」是 256 個寄存器。 語言從基於堆棧的機器切換到基於寄存器的機器, 是我自己的想法 ; 除了看起來更復雜之外,我對此沒有什麼爭論。

此外,請注意有一個內置的收費機制 :

640 (2).jpg

在這一點上,ether 實際上就是 gas; 在每一個計算步驟之後,被交易調用的合約的餘額會下降一些,如果合約的資金用完了,執行就會停止。 請注意,這種 「 接收者付費 」 機制意味着合約本身必須要求發送者給合約支付費用,如果不存在這種費用,則立即退出 ; 協議分配了 16 個免費執行步驟,允許合約拒絕不付費的交易。

到這個時候,以太坊協議完全是我自己創造的。 然而,從這裏開始,新的參與者開始加入這個行列。 到目前爲止,協議方面最著名的是 Gavin Wood,他在 2013 年 12 月在 about.me 給我發了消息 :

640 (3).jpg

Go 客戶端的首席開發人員傑弗裏•威爾克 (Jeffrey Wilcke) 也在大約同一時間接觸並開始編碼,不過他的貢獻更多地是在客戶端開發方面,而非協議研究方面。

640 (4).jpg嘿,傑里米,很高興看到你對以太坊感興趣 ……

Gavin 最初的貢獻是兩方面的。 首先,你可能會注意到初始設計中的合約調用模型是一個異步模型:雖然合約 A 可以創建一個「內部交易」到合約 B(「內部交易」是 Etherscan 的行話;最初它們只是被稱爲「交易」,後來被稱爲「消息調用」或「調用」),內部交易的執行直到第一個交易的執行完全完成後纔會開始。這意味着交易不能使用內部交易作爲從其他合約獲取信息的方式;唯一的方法是外部操作碼 (有點像 SLOAD,你可以用它來讀取其他合約的存儲),後來在 Gavin 和其他人的支持下,這一點也被刪除了。

當實現我的初始規範時,Gavin 自然地同步實現內部交易,甚至沒有意識到意圖是不同的——也就是說,在 Gavin 的實現中,當一個合約調用另一個合約時,內部交易會立即執行,一旦執行結束,VM 返回到創建內部交易的合約,並繼續執行下一個操作碼。 這種方法似乎對我們雙方都是優越的,所以我們決定將其作爲規範的一部分。

其次,他和我之間的一次討論 (在舊金山散步期間,因此確切的細節將永遠消失在歷史的風塵之中,甚至可能在國家安全局的深入檔案中找到一兩份副本) 導致了交易費模型的重構,從 「 合約付費 」 的方式轉向 「 發件人付費 」 的方式,也轉向了 「gas」 架構。 每個單獨的交易步驟不會立即帶走一點以太,而是由交易發送者支付並分配一些 「gas」(大致相當於一個計算步驟的計數器) ,計算步驟從這些 gas 餘量中得出。 如果交易耗盡了 gas,這些 gas 仍然會被沒收,但整個執行過程將被恢復 ; 這似乎是最安全的做法,因爲它消除了合約之前必須擔心的一整類 「 部分執行 」 攻擊。 當交易完成後,所有未使用的 gas 的費用將被退還。

Gavin 很大程度上歸功於其視野上的微妙變化,一開始基於區塊鏈的合約 (根據預設規則持有數字資產和轉移資產) 將 Ethereum 視爲構建可編程貨幣的平臺,然後發展到通用計算平臺。 這一切始於重點和術語上的微妙變化,後來隨着對 「Web 3」 日益重視,這種影響變得更加強大,後者將以太坊視爲一整套去中心化技術的一部分,另外兩個是 Whisper 和 Swarm。

640 (5).jpg

2014 年初前後也作出了其他人建議的修改。在安德魯·米勒 (Andrew Miller) 和其他人提出想法之後,我們最終回到了基於堆棧架構。

640 (6).jpg

查爾斯·霍斯金森 (Charles Hoskinson) 建議將比特幣用的 SHA256 編碼轉換爲較新的 SHA3(或者更準確地說,是 keccak256)。雖然有一段時間存在一些爭議,但與 Gavin、Andrew 和其他人的討論最終確定堆棧上的值的大小應限制在 32 個字節內;另一個正在考慮的替代方法(無限大小的整數)存在一個問題,即很難計算出要對加法、乘法和其他操作收取多少 gas。

2014 年 1 月,我們最初想到的挖礦算法是一種名爲 Dagger 的新玩意:

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

640 (7).jpg

Dagger 是以「有向無環圖」(DAG) 命名的,DAG 是算法中使用的數學結構。其思想是,每 N 個塊,一個新的 DAG 將是僞隨機地從種子生成的,而 DAG 的底層將是一個需要幾 GB 存儲空間的節點集合。但是,在 DAG 中生成任何單獨的值只需要計算幾千個條目。「Dagger 計算」包括在這個底層數據集中的隨機位置獲取一些值並將它們散列在一起。這意味着有一種快速的方法來進行 Dagger 計算(已經將數據存儲在內存中),還有一個速度較慢,但不是內存密集型的方法(重新生成需要從頭開始獲取的 DAG 中的每個值)。

這種算法的目的是具有與當時流行的算法相同的「內存硬度」屬性,如 Scrypt,但仍然是輕客戶端友好的。 礦工會使用快速的方式,因此他們的採礦將受到內存帶寬的限制(理論上消費級 RAM 已經非常優化,因此很難用 ASIC 進一步優化它),但輕客戶可以使用無內存但速度較慢的版本進行驗證。快速的方式可能需要幾微秒,而緩慢但無內存的方式只需幾毫秒,因此對於輕型客戶端來說它仍然是非常可行的。

從這裏開始,算法將在 Etherum 開發過程中發生幾次變化。我們所經歷的下一個想法是「適應性工作量證明」;在這裏,工作量證明將涉及執行隨機選擇的以太坊合約,這有一個聰明的理由可以解釋爲什麼這會是抗 ASIC 的:如果開發出 ASIC,競爭曠工將有動力創建和發佈許多 ASIC 不擅長執行的合約。一般的計算沒有 ASIC 這樣的東西,因爲它只是一個 CPU,所以我們可以用這種對抗性的激勵機制來證明本質上是執行一般計算的工作。

這個計劃失敗的原因很簡單 : 遠程攻擊 . 攻擊者可以從第一塊開始創建一個鏈,然後只用簡單的合約來填充它,他們可以爲這些合同創建專門的硬件,並迅速取代主鏈。 所以 … 從頭再來。

下一個算法是一個稱爲隨機電路的東西,在這裏的 google doc 中描述,由我和 Vlad Zamfir 提出,並由 Matthew Wampler-Doty 和其他人分析。 這裏的想法也是模擬挖掘算法中的通用計算,這次是通過執行隨機生成的電路。 沒有確鑿的證據表明基於這些原則的東西是行不通的,但我們在 2014 年接觸到的計算機硬件專家往往對此非常悲觀。 Matthew Wampler-Doty 自己提出了基於 SAT 解決方案的工作證明,但最終也被拒絕了。

最後,我們用一個名爲「Dagger Hashimoto」的算法來完整循環。 「Dashimoto」,有時被稱爲簡稱,借用了 Hashimoto 中的許多想法,這是 Thaddeus Dryja 的工作量算法證明,該算法開創了 「I/O 綁定工作量證明」,其中挖掘速度的主要限制因素不是每秒哈希值,而是每秒 RAM 訪問量的兆字節數。 然而,它將這與 Dagger 關於輕客戶端友好的 DAG 生成數據集的概念相結合。 經過我自己,Matthew,Tim 和其他人的多輪調整後,這些想法最終融入了我們現在稱之爲 [Ethash] 的算法(https://github.com/ethereum/wiki/wiki/Ethash)。

640 (8).jpg

到 2014 年夏天,該協議已經相當穩定,除了工作證明算法直到 2015 年初纔到達 Ethash 階段,並且以 Gavin 的黃紙半正式規範形式存在。

640 (9).jpg

2014 年 8 月,我開發並引入了叔區塊機制 the uncle mechanism,它允許 以太坊的區塊鏈有更短的阻塞時間和更高的容量,同時降低了集中化的風險。 這是作爲 PoC6 的一部分引入的。

與 Bitshares 團隊的討論後, 我們考慮將堆作爲頭等數據結構來添加,儘管我們最終沒有做到這一點,因爲時間不夠,後來的安全審計和 DoS 攻擊表明,安全地完成這一任務實際上比我們當時想象的要困難得多。

9 月,Gavin 和我計劃了協議設計的下兩個主要變化。 首先,除了狀態樹和交易樹之外,每個塊還包含一個「收據樹」。 收據樹將包括交易創建的日誌的哈希值以及中間狀態根。日誌將允許交易創建保存在區塊鏈中的「輸出」,並且可供輕客戶端訪問,但未來的狀態計算無法訪問。這可以用於允許分散的應用程序容易地查詢事件,例如 token 傳輸,購買,正在創建和填寫的兌換單,拍賣的時間等等。

還考慮了其他一些想法,比如從交易的整個執行跟蹤中創建一個默克爾樹,以允許任何事情被證明 ; 之所以選擇日誌,是因爲它們是簡單性和完整性之間的折衷。

第二個是「預編譯」的概念,解決了允許複雜的加密計算在 EVM 中可用而不必處理 EVM 開銷的問題。我們還經歷了許多關於「原生合約」的雄心勃勃的想法,如果礦工們對某些合同的優化實施,他們可以「投票」這些合約的 gasprice,那麼大多數礦工可以更快地執行的合約自然會有低的 gasprice; 但是,所有這些想法都被拒絕了,因爲我們無法提出一種經濟上安全的方式來實現這樣的事情。攻擊者總是可以創建一個合約,執行一些陷阱加密操作,將陷門分配給他們自己和他們的朋友,讓他們更快地執行這個合約,然後投票給 gasprice 並將其用於 DoS 網絡。相反,我們選擇了一種不那麼雄心勃勃的方法,即在協議中簡單指定較少數量的預編譯,用於哈希和簽名方案等常見操作。

Gavin 也是開發「協議抽象」 概念的關鍵初始聲音 – 將協議的許多部分(如以太坊月,交易簽名算法,隨機數等)作爲契約移入協議本身,理論上最終目標是達到 整個以太坊協議可以被描述爲對具有一些預初始化狀態的虛擬機進行函數調用的情況。 這些想法沒有足夠的時間進入最初的 Frontier 版本,但預計這些原則將通過君士坦丁堡的一些變化,Casper 合約和分片規範慢慢開始整合。

這一切都在 PoC7 中實現 ; 在 PoC7 之後,該協議並沒有真正改變太多,除了次要的,雖然在某些情況下很重要,但通過安全審計會產生的細節 ……

2015 年初,由 Jutta Steiner 和其他人組織的啓動前安全審計,包括軟件代碼審計和學術審計。軟件審計主要是關於 C ++和 Go 實現,分別由 Gavin Wood 和 Jeffrey Wilcke 領導,我的 pyethereum 實現也有一個較小的審計。在兩次學術審計中,一次由 Ittay Eyal (「自私挖礦」成名)執行,另一次由 Andrew Miller 和其他來自 Least Authority 的人進行。 Eyal 審計導致了一個小的協議變更:鏈的總難度不包括叔塊。 最小權威審計更側重於智能合約和 gas 經濟學以及 Patricia 樹。該審計導致了若干協議變更。一個小的變更是使用 sha3 (addr)和 sha3 (key)作爲 trie 鍵而不是直接使用地址和密鑰 ; 這將使得對 trie 執行最壞情況攻擊變得更加困難。

640 (10).jpg這個警告可能有點超前了 …

我們討論的另一個重要問題是 gas 限制投票機制。 當時,我們已經對比特幣區塊大小爭論中缺乏進展感到擔憂,並希望在以太坊中有一個更靈活的設計,可以根據需要隨時調整。 但面臨的挑戰是:最佳限制是什麼? 我最初的想法是制定一個動態限制,目標是實際 gas 使用量的長期指數移動平均值的 1.5 倍,這樣從長遠來看,平均塊數將是 2/3 滿足率。 然而,安德魯表明,這在某些方面是可以利用的-具體地說,想要提高上限的礦工只需在自己的區塊中包括交易,而這些區塊消耗了大量 gas,但處理所需時間很少,因此他們總是在不付出成本的情況下創建完整的區塊。因此,安全模式至少是向上的,相當於讓礦工簡單地就 gas 限額進行投票。

我們沒有設法提出一個不太可能破壞的 gas 限制策略,因此安德魯建議的解決方案是讓礦工明確地對 gas 限制進行投票,並且投票的默認策略是 1.5 倍 EMA 規則。 原因是我們距離確定設定最大 gas 限值的正確方法還很遠,而且任何具體方法失敗的風險似乎都大於礦工濫用其投票權的風險。 因此,我們不妨簡單地讓礦工對 gas 限制進行投票,並接受限制將過高或過低的風險,以換取靈活性的好處,以及讓礦工有能力在需要時迅速調高或調低上限。

在 Gavin、 Jeff 和我之間進行了一次小型編程馬拉松之後,3 月份發佈了 pocket9,並打算作爲概念發佈的最終驗證。 一個名爲 「 奧林匹克 」(Olympic) 的測試網絡運行了四個月,使用的是原本打算用於 livenet 的協議,從而確立了以太坊長期計劃。 Vinay Gupta 寫了一篇名爲「The Ethereum Launch Process」的博文,描述了 以太坊 livenet 發展的四個預期階段,並給它們取了現在的名字 : 前沿、 家園、 大都會和寧靜。

Olympic 持續運行了四個月。 在前兩個月,在各種實施中發現了許多錯誤,發生了共識失敗,以及其他問題,但在 6 月左右,網絡顯着穩定。 7 月份決定凍結代碼,然後發佈,7 月 30 日發佈了版本。