慶生

當區塊鏈再一次走進普羅大衆的視野,並得到科技巨頭們前所未有的重視時,以太坊已經成爲區塊鏈領域無法被忽視的鉅艦。在資本肆無忌憚野蠻增長的混沌時代,以太坊的開發者和社區始終小心翼翼地呵護着這艘小船,把穩方向,一路打怪升級成爲一代鉅艦。

2020年7月30日,不僅是以太坊五週年的破殼日,同樣令人頗具期待的是:數日之後,以太坊2.0的測試網將正式啓動,標誌着以太坊距離世界計算機跨越了一大步。截止目前,以太坊2.0測試網啓動進度已完成超過92%。

劫難

以太坊從誕生至今,從未遠離過質疑和嘲笑。作爲一臺承載邏輯極度複雜的世界信任機器,以太坊曾經遭遇過大量的攻擊和運行挑戰。最著名的莫過於2016年發生的The DAO事件。

2016年6月17日,以太坊創始人Vitalik在Reddit發佈了一篇緊急警告,告知“DAO受到黑客攻擊,請各交易平臺馬上暫停ETH/DAO交易及充值提現”。這場歷時1個月的攻防戰爭最終以以太坊區塊鏈被分裂爲ETH(沿用“以太坊”一名)和ETC(以太經典)告終。在經歷The DAO事件以後,以太坊在很長一段時間內無法擺脫“中心化”的質疑,並受到來自其他外界社區的圍攻。

今天人們的歡慶,彷彿已然忘記昨日的教訓。在未來,以太坊最大的敵人不是外部,恰恰來自於內部本身。確保航母每一個細緻的模塊都運作正常,遠比抵禦外敵要困難得多。

分別

以太坊誕生以後,創始團隊成員逐漸把中心轉移到更加寬廣的領域,或致力於擴展以太坊的生態,或致力於探索新的技術,成爲以太坊的競爭者。如今,除了Vitalik依然專注於以太坊的發展,其他創始人分別致力於以太坊社交框架Akasha(Mihai Alisie)、Jaxx錢包(已離職,Anthony Dilorio)、公有鏈Cardano(Charles Hoskinson)、Polkadot和Web3基金會(Gavin Wood)。

待續

2017年,Vitalik在他的個人網站https://vitalik.ca寫了一篇回顧“以太坊是如何誕生”的文章。乘着以太坊五週年生日之際,我們不妨重新回顧一下這篇《以太坊協議的史前史》。

本文摘自由Vitalik Buterin本人撰寫,靈鈦科技和獨角時代翻譯出版的《理·想:以太坊的區塊鏈創世錄》。同時誠摯感謝以太坊社區的每一位開發者、翻譯者和佈道者,只因有你,區塊鏈的世界不再單調。

以太坊協議的史前史

(2017年9月14日)

編者按:本文是維塔利克對以太坊協議發展歷程的回憶,講述了以太坊協議從構思到初次發佈、迭代的故事。

儘管當前以太坊協議背後的理念在這兩年已經大致穩定下來了,但以太坊當前的構想和完整形式並非一朝一夕形成的。在以太坊區塊鏈面世之後,其協議經歷了一系列重大的演變和決策。本文旨在回顧以太坊協議從開始到發佈的演變過程。至於Geth、cppethereum、pyethereum以及EthereumJ在協議實現的過程中所做的大量工作,以及關於以太坊生態系統的應用和商業歷史,將不在本文討論的範圍內。

同樣不在討論範圍內的還有關於Casper以及分片研究的歷史。毫無疑問,我們可以寫更多的文章來討論弗拉德(Vlad)、加文(Gavin)、我自己以及其他人曾經提出過並且被捨棄的各種觀點,包括工作量證明的證明、輪輔式多鏈、超立方體、影子鏈(可以說是Plamsa的前身)、鏈纖維以及Casper的各種迭代版本,還有弗拉德提出的對在共識協議內參與者的激勵機制及其性質進行推理的快速演變思想。這些觀點背後的故事本身已經複雜到足以另寫一篇文章。因此,暫時不討論它們。

先從最早的版本說起。這個版本最終成了以太坊,但在當時它甚至還不叫以太坊。我在2013年10月訪問以色列的時候,花了很多時間與萬事達幣團隊在一起,甚至還建議他們添加某些功能。再三思考過他們所做的事情以後,我向團隊發送了一份提案,提議讓他們的協議變得更加通用,並且能夠在無需增加龐大而複雜的功能集的情況下支持更多類型的合約:

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

需要注意的是,這一版本與以太坊後期更廣闊的願景大相徑庭:它純粹只專注於萬事達幣當時正在嘗試突破的技術,即雙方合約。在該合約中,A方和B方共同投入資金,隨後雙方可以根據合約中指定的某些公式將資金提取出來(例如,賭注內容爲“如果X發生了,則把所有的資金都給A;反之,則把所有的資金都給B”)。實現這個合約的腳本語言不是圖靈完備的。

萬事達幣團隊對此印象深刻,但是他們並沒有興趣放棄他們所做的一切事情去朝着這個方向發展,而我越發深信這是一個正確的選擇。因此,大約在12月,第二個版本面世了:

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

在這個版本中,你可以看到完成了大量重構的結果。這些結果很大一部分都是11月份我在舊金山的一次長途漫步時想到的。到那時,我意識到智能合約具有完全通用化的潛力。比起腳本語言只能簡單地描述雙方關係,合約本身就是完成成熟的賬戶,並且具有持有、發送和接收資產的能力,甚至可以維持永久存儲(在當時,永久存儲被稱爲“內存”,並且唯一的臨時“內存”是256寄存器)。只不過語言從基於棧的虛擬機轉變爲更符合我意願的基於寄存器的虛擬機。我對此幾乎沒有異議,除了它看起來似乎更加複雜。

“以太(ether)”的字面意思是醚(即燃料,等同於gas)。在每一個計算步驟完成之後,一筆交易所調用的合約的餘額將會減少一些。如果合約的資金耗盡,那麼執行過程將會停止。請注意,這個接收者支付機制意味着合約本身必須要求發送者向該合約支付一筆費用。如果這筆費用沒有到賬,則立即退出執行。這一版本的協議分配了16個免費執行步驟的限額,從而允許合約拒絕不支付費用的交易。

截至此時,以太坊協議還是完全由我一個人構建的。然而,從這時開始,新的參與者開始加入以太坊的陣營。到目前爲止,在協議方面表現最突出的是加文,他在2013年12月通過about.me的私信開始與我聯繫。

傑弗裏·威爾克(Jeffrey Wilcke),Go客戶端(當時被稱爲“ethereal”)的首席開發者,也在同一時期聯繫了我並開始編程。儘管他的貢獻更多是在客戶端開發而不是協議研究方面。

加文的早期貢獻由兩個方面。首先,你可能注意到在初始設計中的合約調用模型是異步的:儘管合約A可以創建一筆內部交易給合約B(“內部交易”是以太坊的行話:最初它們僅被稱作“交易”,隨後又被稱爲“消息調用”或者“調用”)。在第一筆交易的執行完全完成以前,內部交易的執行不會開始。這意味着交易不能使用內部交易作爲從其他合約獲取信息的途徑;想從其他合約獲取信息,只能使用EXTRO操作碼(有點像你用來讀取其他合約存儲的SLOAD),但這個操作碼隨後在加文和其他人的支持下移除了。

在實現我最初的規範時,加文很自然地同步實現了內部交易功能,他甚至沒有意識到兩者意圖的偏差——也就是說,在加文的實現中,當一個合約調用另一個合約時,內部交易會立即得到執行。一旦該執行完成,虛擬機將返回創建內部交易的合約,並繼續執行下一個操作碼。對於我倆,這種方法似乎更加出色,因爲我們決定把它作爲規範的一部分。

其次,是我和他之間的一次討論(發生在舊金山的一次散步中,因此準確的細節將要永遠地消失在歷史的洪流中,但也有可能會存在於NSA的深層檔案內的一兩份副本中)引發了對交易費用模型的重構,從合約支付方式轉向發送方支付方式,並且轉換到燃料架構。比起最初在每個獨立的交易步驟執行後立刻消耗一些以太幣,在這一版本中,交易發起者支付一定的費用並被分配一定量的燃料(大致是一個計算步驟的計數器)。與此同時,計算步驟取決於燃料的限額。如果一筆交易花費了所有的燃料,那麼這些燃料就被花費了,但整個執行過程將被還原。這似乎是最安全的做法,因爲它移除了合約先前需要擔心的所有部分執行攻擊類型。當一筆交易執行完成時,任何未被使用的燃料所收取的費用將被退還。

加文在很大程度上使以太坊的願景發生了十分微妙的變化:從一個用於構建可編程貨幣的平臺——平臺擁有基於區塊鏈的合約,合約能夠持有數字資產並且按照預先設置的規則進行轉賬——到一個通用的計算平臺。這種變化從以太坊的着重點和術語的細微變化開始,後來隨着我們對Web 3集成(它將以太坊視爲去中心化技術套件的一部分,另外兩部分是耳語協議和蜂羣協議,圖1)的日益強調,這一影響也在不斷地增強。

圖1

2014年初前後,我們還根據其他人的建議作了一些修改。在安德魯·米勒(Andrew Miller)等人提出回到基於棧的架構這一想法以後,我們最終還是回去了(圖2)。

圖2

查爾斯·霍斯金森(Charles Hoskinson)建議我們從比特幣的SHA256轉換爲更新的SHA3(或者更準確地說,是keccak256)。儘管有過一段時間爭議,但通過與加文、安德魯以及其他人進行討論,我們還是確立了棧中的值的大小應該被限制在32 Byte。而另一種替代方案——無限制整數——則仍在考慮當中,因爲該方案存在一個問題,即我們很難計算出執行家加法、乘法以及其他操作到底需要多少燃料。

回到2014年1月,我們最初想到的挖礦算法是一個叫匕首 (Dagger) 的東西:

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

匕首是根據有向無環圖 (Directed Acyclic Graph, DAG) 命名的。DAG是一種用在算法中的數學結構,其思想是每隔N個區塊,就會有一個新的DAG由種子僞隨機生成。並且,DAG的底層將會是一個需要用幾十億字節來存儲的節點的集合。然而,在DAG中,生成任意一個獨立的值只需要計算計算幾千個條目。一次匕首計算包含在這種底層的數據集中的任意位置獲得一定數量的值,然後將這些值一起進行哈希運算。這意味着存在一種快速的方式可以進行匕首計算——已經將數據存儲在內存中,然後以一種緩慢但不會導致內存緊張的方式——重新從DAG中生成你需要從頭開始獲取的每一個值。

這個算法的目的就是和當時流行的算法一樣擁有相同的內存受限屬性,就像Scrypt算法,但是仍然對輕客戶端友好。礦工會使用快速的方法,所以他們的挖礦將受限於內存帶寬 (理論上,消費者級別內存的優化程度已經足夠高了,因此用ASIC對其進行進一步優化十分困難),但輕客戶端可以使用內存寬鬆且緩慢的方式進行驗證。快速方法可能只需幾微秒,而慢速且內存寬鬆的方法可能需要幾毫秒,所以這對輕客戶端依然是可行的。

從這裏開始,這個算法伴隨着以太坊的發展歷程發生了幾次變化。接下來的想法是自適應工作量證明。在這個方案中,工作量證明將會涉及執行被隨機選出的以太坊合約,並且這裏麪包含了一個很巧妙的做法去抵抗ASIC:如果ASIC被開發出來了,那麼競爭礦工就會有動機去創建併發布該ASIC不擅長執行的合約。沒有一種ASIC能夠用於通用計算,因爲它僅僅是一個CPU。因此,我們可以利用這類對抗激勵機制來實現本質上在執行通用計算的工作量證明。

由於一個簡單的原因,這個想法後來破碎了。這個原因是長程攻擊。攻擊者可以從區塊 1 開始構建一條鏈,並且只用簡單的合約對這條鏈進行填充。需要注意的是,攻擊者可以爲這種簡單的合約設計出專門的硬件,從而使攻擊鏈迅速趕超主鏈。所以......又回到了原點。

下一個算法被稱爲“隨機電路”,具體的描述可以查看其Google文件。這個算法是我和弗拉德·贊菲爾 (Vlad Zamfir) 提出的,並由馬修·萬普勒·多蒂 (Matthew Wampler-Doty) 和其他人進行分析。這個算法的思路是通過執行僞隨機生成電路來模擬挖礦算法中的通用計算。這一次,沒有任何確鑿的證據表明基於這些原則的東西是行不通的。但我們在2014年接觸的計算機硬件專家都對此表示非常悲觀。馬修·萬普勒·多蒂提出了一種基於SAT解決方案的工作量證明,但最終也被拒絕了。

最後,兜兜轉轉,我們還是提出了Dagger Hashimoto算法,有時簡稱爲Dashimoto。這種算法借鑑了Hashimoto的很多想法。Hashimoto是薩帝厄斯·追亞 (Thaddeus Dryja) 提出的工作量證明機制,它開創了“I/O約束工作量證明”概念。在該機制中,挖礦速度的主要限制因素不是每秒鐘哈希運算的速度,而是RAM每秒可訪問的兆字節數。然而,Dagger Hashimoto將這種工作量證明機制與匕首算法中對輕客戶端友好的DAG所生成的數據集結合了起來。經過我、馬修、蒂姆和其他人多次調整以後,這些想法終於融入了我們現在稱爲“Ethash”的算法中。

到2014年夏天,除了工作量證明大概需要到2015年初才能到達Ethash階段,這個協議已經相當穩定,並且其半正式規範已經以加文的黃皮書形式面世了。

2014年8月,我開發並引入了叔區塊機制。該機制可以使以太坊的區塊鏈具備更短的區塊時間以及更高的處理能力,同時減少了中心化的風險。關於叔區塊機制的介紹,可以參見PoC6。

在與比特股團隊討論之後,我們考慮使用堆作爲頭等數據結構——儘管最後由於時間不夠沒有這樣做,並且後來的安全審計和DoS攻擊讓我們明白:在當時安全地實現這一功能遠比想象中更難。

9月,我和加文計劃對協議設計進行兩處重大的變更。首先,除了狀態樹和交易樹,每一個區塊還將包含一顆收據樹。收據樹將包含由每一筆交易創建的日誌的哈希以及中間的狀態根。日誌將會允許交易創建可以保存在區塊鏈中的輸出,並且可被輕客戶端訪問。然而,未來的狀態計算無法訪問這些日誌。這種方法使得去中心化應用能夠很容易地查詢時間,如代幣轉賬、購買、正在被創建和被撮合的交易所訂單,以及正在進行的拍賣等。

我們還考慮了其他想法,如把默克爾樹從一筆交易的完整執行軌跡中抽取出來,以允許任意內容得到證明。在對簡單性和完整性進行折中以後,我們選擇了使用日誌。

其次就是預編譯的想法。預編譯解決了允許複雜的加密計算在EVM中可用而不必處理EVM開銷的問題。我們還提出過許多關於本地合約的雄心勃勃的想法。在這些想法中,如果礦工擁有關於某些合於的更優的實施方法,那麼他們就會投票下調這些合約的燃料價格。如此一來,那些大多數礦工都能快速執行的合約自然就擁有更低的燃料價格了。然而,所有這些想法都被拒絕了,因爲我們無法提出一種在加密經濟學角度足夠安全的方式來實現它。攻擊者總是可以創建一些合約來執行帶有活動門的加密操作,然後將活動門分發給自己和他們的朋友,從而能夠更快地執行這個合約。隨後,攻擊者投票下調燃料價格並利用這一點對網絡進行DoS攻擊。相反,我們選擇了一個不那麼雄心勃勃的方法,即在協議中簡單地指定較小的預編譯數量,用於哈希和簽名方案等常用操作。

加文也是最初支持開發協議抽象這一想法的關鍵人物。所謂協議抽象,就是將協議的衆多部分,如以太幣餘額、交易簽名算法、隨機數等,作爲合約遷移到協議本身中。其理論上的最終目標是要達到整個以太坊協議能夠被描述爲將函數調用加入到具有特定預初始化狀態的虛擬機中的目標。我們沒有足夠的時間把這些想法都加入到最初的前沿版本中,不過預計這些原則將通過“君士坦丁堡”的一些變化、Casper合約和分片規範慢慢開始被整合。

這些內容都在PoC 7 中實現了。在 PoC 7 之後,該協議並沒有真正發生太大的變化,除了一些輕微但在某些情況下十分重要的變動。這些細節將會在通過安全審計後公佈。

到2015年初,尤塔·斯坦納 (Jutta Steiner) 和其他人組織了發佈前的安全審計,包括軟件代碼審計和學術審計。軟件代碼審計主要是在分別由加文和傑夫瑞主導的C++和Go語言實現上。儘管我的Pyethereum實現也進行了一次簡單的審計。在這兩次學術審計中,一次由尤塔·埃雅爾 (Ittay Eyal) (因提出“自私挖礦”而成名) 負責進行的,另一次由安德魯·米勒和Least Authority的其他成員進行。埃雅爾的審計導致了一個輕微的協議變更,即鏈的總難度值不會包含叔區塊。由Least Authority負責的審計更側重於智能合約、燃料經濟學以及帕特里夏樹。這次審計也導致了幾處的協議變更。其中,比較小的一處變更是使用sha3(addr) 和 sha3(key) 作爲樹的鍵值,而不是直接使用地址和鍵值。這將使得攻擊者更難對樹發起最壞攻擊。

我們討論的另一個重要的問題是燃料限制投票機制。那時候,我們已經對關於比特幣區塊大小的爭論缺乏進展感到擔憂,並希望在以太坊中擁有一個靈活的設計:該設計能夠根據需要隨時間調整。但面臨的挑戰是,最佳的限制是什麼?我最初的想法是制定一個動態的限制,該限制是實際燃料使用量的長期指數移動平均值的1.5倍。因此,從長遠來看,平均區塊都會被佔用2/3的容量。然而,安德魯證明了這種限制在某些方面是可以被利用的——具體來說就是,想要提高限制的礦工僅需要把消耗大量燃料卻只花費很少處理時間的交易都包含在他們自己的區塊中,從而創建出滿載區塊且不會虧損成本。因此,至少從最終的結果來看,這個機制的安全模型相當於只是讓礦工對燃料限制進行投票。

我們沒能提出一個更好的燃料限制策略,安德魯推薦的方案是讓礦工明確地對燃料限制進行投票,而且默認的投票策略是1.5倍的EMA。其原因在於,我們還沒有想出設置最大燃料限制的正確方法,並且任何具體方法失敗的風險都似乎遠遠高於礦工濫用投票權的風險。因此,不妨簡單地讓礦工對燃料限制進行投票,並接受燃料限制過高或過低的風險,從而換取靈活性以及礦工聯合起來根據需要快速調整燃料限制高低的好處。

在我和加文、傑夫進行了一場迷你黑客松之後,PoC 9終於在3月份推出了。其旨在成爲概念證明的最終版本。我們將一個叫作“奧林匹克”的測試網運行了4個月。該測試網用的是將要用在主網中的協議。與此同時,我們還建立了以太坊的長期計劃。維納·古普塔 (Vinay Gupta) 寫了一篇文章——《以太坊的發佈過程》。這篇文章描述了以太坊主網開發的4個階段,並相應給出瞭如今大家耳熟能詳的名字:“前沿”、“家園”、“大都會”和“寧靜”。

“奧林匹克”測試網運行了4個月。前2個月,我們在各種實施版本中發現了很多漏洞,也發生了共識失敗等其他問題。不過在6月前後,網絡已經顯著穩定下來了。到了7月,我們決定凍結代碼;7月30日以太坊主網正式發佈。

來自以太坊基金會的慶生

以太坊5歲啦!

5年前的今天,以太坊創世區塊的誕生標誌着以太坊網絡的正式推出。

今天,社區的大多數成員都在思考以太坊接下來要完成的所有工作,但同樣重要的是,值此5週年之際,我們也需要意識到以太坊如何令人難以置信地帶領我們走了這麼遠的路途,每個迂迴曲折曾是怎樣的披荊斬棘,以及我們所有人 (和技術) 又是實現了多大的成長。

曾經,一些人希望協議能夠按照預期運行,希望構建人員嘗試推出第一批應用程序,且用戶會去嘗試使用這些應用程序,或者希望某一天有人可能會使用以太坊來創造真正的和積極的影響。

因此,儘管我們的焦點仍將集中在剩餘的工作上,但5年前很難想象會有如此多的思想家、實幹家、學生、政府、企業和其他創新者今天都在使用以太坊做出真實而有影響力的改變。同樣,曾未預料到的所有顛簸、分叉,諸多難以置信的聚會/活動、迷因,以及一場場富有激情的辯論也是如此。如果沒有這些“未預料到”的時刻,以太坊社區不可能會實現今天這樣的發展?。

以太坊生態系統早期的每個人都曾等待着第一批合約的上線,而今天我們已經擁有數百萬份合約!我們也早已不再追蹤有多少應用程序被部署,即使是最忠實的追隨者也很難跟蹤協議層面的諸多創新。

在這5年時間裏,以太坊已經發展爲超越了任何建造者、團隊或組織的範疇,但希望你一如既往地思如泉湧,繼續攜手致力於讓以太坊實現我們所有人夢寐以求的一切,甚至更多。

––以太坊基金會團隊

《以太坊協議的史前史》作者:Vitalik Buterin,翻譯:喏唄爾

《以太坊5歲啦!》作者:以太坊基金會,翻譯:Johnny

相關文章