Skip to content
This repository has been archived by the owner on Aug 25, 2019. It is now read-only.

Latest commit

 

History

History
279 lines (162 loc) · 25.4 KB

第一章.asciidoc

File metadata and controls

279 lines (162 loc) · 25.4 KB

什麼是以太坊

「世界的計算機」,這是對以太坊平臺常見的一種描述。但那是什麼意思呢?讓我們首先從關注計算機科學的描述開始,然後對以太坊的功能和特性進行更實際的解讀,並將其與比特幣和其他分佈式賬本技術(簡單起見,我們將經常使用「區塊鏈」指代)進行對比。

從計算機科學的角度來說,以太坊是一種確定性但實際上無界的狀態機。它有兩個基本功能,第一個是全球可存取的單例狀態,第二個是對狀態進行更改的虛擬機。

從更實際的角度來說,以太坊是一個開源的、全球的去中心化計算架構,執行稱為 智能合約 的程式。它使用區塊鏈來同步和儲存系統 狀態的變化,以及使用稱為 ether 的密碼貨幣來計量和約束執行資源的成本。

以太坊讓開發者能夠利用內建的經濟學方法來構建強大的去中心化應用程式。在提供了高可取得性、可審計性、透明度及中立性的同時,還可以減少甚至消除了審查機構和交易對手風險。

與比特幣的比較

很多之前有一些密碼貨幣的經驗人會加入以太坊,特別是比特幣。以太坊與其他開放區塊鏈共享許多通用元素:連接參與者的對等網路,用於狀態同步(工作量證明)的共識演算法,數位貨幣(以太)和全局賬本(區塊鏈)。

區塊鏈的組件

開源、公開的區塊鏈通常包括以下組件:

  • 一個連接參與者,並傳播交易和包含已驗證交易的區塊的點對點網路,基於標準的“gossip“協議。

  • 狀態機中實現的一系列共識規則。

  • 消息,以交易的形式表示,代表狀態轉移。

  • 根據共識規則處理交易的狀態機。

  • 分佈式資料庫,區塊鏈,記錄所有狀態轉移的日誌。

  • 共識演算法(例如,Proof-of-Work),通過強制參與者競爭並使用共識規則約束他們,來分散區塊鏈的控制權。

  • 上述內容的一個或多個開源軟體實現。

所有或大部分這些組件通常組合在一個軟體客戶端中。例如,在比特幣中,參考實現由 Bitcoin Core 開源項目開發,並作為 bitcoind 客戶端實現。在以太坊中,沒有參考實現,而是 參考規範,是在 [yellowpaper] 中對系統的數學描述。有許多客戶端根據參考規範建造。

過去,我們使用術語“區塊鏈”來表示上述所有組件,作為包含上述所有特性的技術組合的簡稱。然而,今天,區塊鏈這個詞已經被營銷商和姦商所淡化,他們期待炒作他們的項目併為其創業公司實現不切實際的估值。它自己實際上是毫無意義的。我們需要限定詞來幫助我們理解這些區塊鏈的特徵,例如 _開源,公開,全球,分散,中立和抗審查_等,以確定這些組件給予“區塊鏈”系統的重要湧現特徵。

並不是所有的區塊鏈都是相同的。當你被告知某樣東西是區塊鏈時,你還沒有得到答案,你需要問很多問題來澄清“區塊鏈”是什麼意思。首先詢問上面組件的描述,然後詢問這個“區塊鏈”是否顯示了 開源、公開 等特性。

以太坊的開發

以太坊的目標和構建在很多方面都和之前的開源區塊鏈有所不同,包括比特幣。

以太坊的目的主要不是數位貨幣支付網路。但數位貨幣_ether_對於以太坊的運作來說既是不可或缺的也是必要的,以太也被視為一種_實用貨幣_來支付以太坊平臺的使用。

與具有非常有限的腳本語言的比特幣不同,以太坊被設計成一個通用可編程區塊鏈,運行一個_虛擬機_,能夠執行任意和無限複雜的程式碼。比特幣的腳本語言故意被限制為簡單的真/假消費條件判斷,以太坊的語言是_圖靈完備的_,這意味著它相當於一臺通用計算機,可以運行理論圖靈機可以運行的任何計算。

以太坊的誕生

所有偉大的創新都解決了真正的問題,以太坊也不例外。當人們認識到比特幣模型的力量,並試圖超越密碼貨幣應用,轉向其他項目時,人們構思出了以太坊。但開發人員面臨著一個難題:要麼在比特幣之上構建,要麼啟動一個新的區塊鏈。以比特幣為基礎意味著處於網路的有意約束之中,並試圖找到解決方法。數據儲存的有限類型和大小似乎限制了可以在其上作為第二層解決方案運行的應用程式的類型。開發者需要構建僅使用有限的變量,交易類型和數據集的系統。對於需要更多自由度和更大靈活性的項目,啟動新的區塊鏈是唯一的選擇。但開始一個新的區塊鏈意味著要構建所有的基礎設施元素,測試等。

2013年底,年輕開發者和比特幣愛好者Vitalik Buterin開始考慮進一步擴展比特幣和Mastercoin(一種擴展比特幣,提供基本智能合約的疊加協議)的功能。 2013年10月,Vitalik向Mastercoin團隊提出了一個更通用的方法,該方案允許用靈活且可編寫腳本(但不是圖靈完備的)的合約取代Mastercoin的專業合約語言。雖然Mastercoin團隊印象深刻,但這一提議太過激進,無法適應他們的發展路線圖。

2013年12月,Vitalik開始分享一份白皮書,描述了以太坊背後的想法:一個圖靈完備的可編程和通用區塊鏈。幾十個人看到了這個早期的草案,並向Vitalik提供了反饋,幫助他逐漸提出提案。

本書的兩位作者都收到了白皮書的初稿,並對其進行了評論。Andreas M. Antonopoulos 對這個想法很感興趣,並向Vitalik詢問了很多關於使用單獨的區塊鏈實施智能合約執行的共識規則以及圖靈完備語言的影響等問題。Andreas非常關注以太坊的進展,但他正在寫作“Mastering Bitcoin”一書的早期階段,直到很久以後才直接參與以太坊。然而,Gavin Wood博士是第一批接觸Vitalik並提供幫助提供C ++編程技能的人員之一。Gavin成為了以太坊的聯合創始人,聯合設計師和CTO。

正如Vitalik在他的 "Ethereum Prehistory" 中所述:

當時的以太坊協議完全是我自己的創作。然而,從這裡開始,新的參與者開始加入。迄今為止協議方面最突出的是Gavin Wood。

…​

將以太坊視為構建可編程金錢的平臺而帶來的微妙變化也可以歸功於Gavin,基於區塊鏈的合約可以保存數字資產並根據預設規則將其轉移到通用計算平臺。這起始於著重點和術語的細微變化,隨著對“Web 3”體系的日益重視,這種影響變得更加強烈,這種體系將Ethereum看作是一套去中心化技術的組成部分,另外兩個是Whisper和Swarm。

從2013年12月開始,Vitalik和Gavin完善並發展了這個想法,共同構建了形成以太坊的協議層。

以太坊的創始人們正在考慮一個並非針對特定目的的區塊鏈,而是通過成為_可編程的_來支持各種各樣的應用。這個想法是,通過使用像以太坊這樣的通用區塊鏈,開發人員可以編寫他們的特定應用程式,而不必開發對等網路,區塊鏈,共識演算法等底層機制。以太坊平臺旨在抽象這些詳細信息併為去中心化區塊鏈應用程式提供確定性和安全的編程環境。

就像Satoshi一樣,Vitalik和Gavin不僅僅發明了一種新技術,他們以新穎的方式將新發明與現有技術結合起來,並提供了原型程式碼以向世界證明他們的想法。

創始人多年來一直致力於構建和完善願景。2015年7月30日,第一個以太坊地塊被開採。世界計算機開始為世界服務…​…​

Vitalik Buterin的文章“以太坊史前史”於2017年9月出版,提供了以太坊最早時刻的迷人第一人稱視角。

以太坊開發的四個階段

以太坊的誕生是第一階段的啟動,名為“前沿(Frontier)”。以太坊的發展計劃分四個階段進行,每個新階段都會發生重大變化。每個階段都可能包含子版本,稱為“硬分叉”,它們以不向後兼容的方式改變功能。

四個主要的發展階段代號為前沿(Frontier),家園(Homestead),大都會(Metropolis)和寧靜(Serenity)。中間的硬分叉代號為“冰河時代(Ice Age)”,“DAO”,“蜜桔前哨(Tangerine Whistle)”,“假龍(Spurious Dragon)”,“拜占庭(Byzantium)”和“君士坦丁堡(Constantinople)”。它們在下面列出,以及硬分叉發生的塊號:

之前的過渡

Block #0

"Frontier" - 以太坊的初始階段, 從2015年7月30日持續到2016年3月。

Block #200,000

"Ice Age" - 引入指數級難度增長的一個難題,激勵了到權益證明的過渡。

Block #1,150,000

"Homestead" - 以太坊的第二階段,2016年3月啟動。

Block #1,192,000

"DAO" - 恢復被破壞的DAO合約的硬分叉,導致以太坊和以太坊經典分成兩個競爭系統。

Block #2,463,000

"Tangerine Whistle" - 改變某些IO密集操作的燃氣計算方法和清除拒絕服務攻擊(利用這些操作的低燃氣成本)累積狀態的硬分叉。

Block #2,675,000

"Spurious Dragon" - 解決更多拒絕服務攻擊向量和另一種狀態清除的硬分叉,還包括轉播攻擊保護機制。

當前狀態

我們目前位於_Metropolis_階段,該階段計劃為兩個次級版本的硬分叉 (參見 [hard_fork]) ,代號 ByzantiumConstantinople。拜占庭於2017年10月生效,君士坦丁堡預計將在2018年中期。

Block #4,370,000

“大都會拜占庭” - 大都會是以太坊的第三階段,正是撰寫本書的時間,於2017年10月啟動。拜占庭是Metropolis的兩個硬分叉中的第一個。

未來的計劃

在大都會拜占庭硬分叉之後,大都會還有一個硬分叉計劃。大都會之後是以太坊部署的最後階段,代號為Serenity。

Constantinople

- 大都會階段的第二部分,計劃在2018年中期。預計將包括切換到混合的工作證明/權益證明共識演算法,以及其他變更。

Serenity

以太坊的第四個也是最後一個階段。寧靜尚未有計劃的發佈日期。

以太坊:通用的區塊鏈

原始區塊鏈(比特幣的區塊鏈)追蹤比特幣單位的狀態及其所有權。你可以將比特幣視為分佈式共識 狀態機,其中交易引起全局的_狀態轉移 _,從而更改比特幣的所有權。狀態轉移受共識規則的制約,允許所有參與者(最終)在開採數個區塊後在系統的共同(共識)狀態上匯合。

以太坊也是一個分佈式狀態機。但是,不僅僅追蹤貨幣所有權的狀態,以太坊追蹤通用數據儲存的狀態轉換。通常我們指的是任何可以表示為 鍵值對 key-value tuple_的數據。鍵值數據儲存簡單地儲存任何通過某個鍵引用的值。例如,儲存由“Book Title”鍵引用的值“Mastering Ethereum”。在某些方面,這與通用計算機使用的 _Random訪問儲存器(RAM) 的數據儲存模型具有相同的用途。以太坊有 memory 儲存程式碼和數據,它使用以太坊區塊鏈來跟蹤這些內存隨著時間的變化。就像通用的儲存程式的計算機一樣,以太坊可以將程式碼加載到其狀態機中並運行該程式碼,將結果狀態更改儲存在其區塊鏈中。與通用計算機的兩個重要差異在於,以太坊狀態的變化受共識規則的支配,並且狀態通過共享賬本全球分佈。以太坊回答了這樣一個問題:“跟蹤任何狀態並對狀態機進行編程,以創建一個在共識之下運行的全球計算機會怎樣?”。

以太坊的組件

在Ethereum中,區塊鏈的組件 中描述的區塊鏈系統組件包括:

P2P Network

以太坊在 以太坊主網 上運行,可以通過TCP端口30303訪問,運行稱作 ÐΞVp2p 的協議。

Consensus rules

以太坊的共識規則,在參考規範,即 [yellowpaper] 中定義。

Transactions

Ethereum交易(參見[transactions])是網路消息,包括發送者,接收者,值和數據負載等。

State Machine

以太坊的狀態轉移由 Ethereum虛擬機(EVM) 處理,這是一個執行 bytecode(機器語言指令)的基於棧的虛擬機。稱為“智能合約”的EVM程式以高階語言(如Solidity)編寫,並編譯為字節碼以便在EVM上執行。

Data structures

以太坊的區塊鏈作為 database(通常是Google的LevelDB)儲存在每個節點上,該區塊鏈在稱作 梅克爾帕特里夏樹 Merkle Patricia Tree 的序列化雜湊資料結構中包含交易和系統狀態,。

Consensus Algorithm

以太坊使用的共識演演算法是比特幣的「中本聰共識(Nakamoto Consensus)」,也就是使用連續的單一簽名區塊,透過 PoW 的權重來決定最長鏈,並以此當作全網最新狀態。然而,計劃在不久的將來,將過渡到稱為_Casper_的權益證明(Proof-of-Stake)系統。

Economic security

以太坊目前使用名為_Ethash_的工作量證明(PoW)演算法,但在未來將會改為使用權益證明(PoS)。

Clients

以太坊有幾個可互操作的客戶端軟體實現,其中最突出的是 Go-Ethereum(Geth)_和_Parity

其他參考文獻

”褐皮書”:為更廣泛的讀者以不太正式的語言重寫了“黃皮書”: https://github.com/chronaeon/beigepaper

以太坊狀態機 —— 一個“Awesome”資源列表 https://github.com/ethereum/wiki/wiki/Ethereum-Virtual-Machine-(EVM)-Awesome-List

LevelDB 資料庫 (最經常用於儲存區塊鏈本地副本): http://leveldb.org

Ethash 工作量證明共識演算法: https://github.com/ethereum/wiki/wiki/Ethash

Go-Ethereum (Geth) 客戶端: https://geth.ethereum.org/

Parity 以太坊客戶端: https://parity.io/

以太坊和圖靈完整性

只要你開始閱讀關於以太坊的信息,你將立即聽到“圖靈完備”一詞。他們說,與比特幣不同,以太坊是“圖靈完備”。這到底是什麼意思呢?

術語“圖靈完備”是以英國數學家阿蘭圖靈(Alan Turing)的名字命名的,他被認為是計算機科學之父。1936年,他創建了一個計算機的數學模型,該計算機由一個狀態機構成,該狀態機通過讀寫順序儲存器(類似於無限長度的磁帶)來操縱符號。通過這個構造,Alan Turing繼續提供了一個來回答(否定的)關於 通用可計算性(是否可以解決所有問題)問題的數學基礎。他證明了存在一些不可計算的問題。具體來說,他證明 停機問題 Halting Problem(試圖評估程式是否最終會停止運行)是不可解決的。

Alan Turing進一步將系統定義為_Turing Complete_,如果它可以用來模擬任何圖靈機。這樣的系統被稱為 通用圖靈機 Universal Turing Machine(UTM)

以太坊在一個名為以太坊虛擬機的狀態機中執行儲存程式,在內存中讀寫數據的能力,使其成為一個圖靈完整系統,因此是一臺通用圖靈機。對於有限的儲存,以太坊可以計算任何圖靈機可以計算的演算法。

以太坊的突破性創新是將儲存程式計算機的通用計算架構與去中心化區塊鏈相結合,從而創建分佈式單狀態(單例)世界計算機。以太坊程式“到處”運行,但卻產生了共識規則所保證的共同(共識)狀態。

圖靈完備是一個“特性”

聽說以太坊是圖靈完備的,你可能會得出這樣的結論:這是一個圖靈不完備系統中缺乏的功能。相反,情況恰恰相反。需要努力來限制一個系統,使它不是 Turing Complete 的。即使是最簡單的狀態機也會出現圖靈完備性。事實上,已知最簡單的Turing Complete狀態機(Rogozhin,1996)具有4個狀態並使用6個符號,狀態定義只有22個指令長。

圖靈完備不僅可以最簡單的系統中實現,而且有意設計為受限制的圖靈不完備的系統通常被認為是“意外圖靈完備的”。圖靈不完備的約束系統更難設計,必須仔細維護,以保持圖靈不完備。

關於“意外圖靈完備的”的有趣的參考資料可以在這裡找到: http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html

以太坊是圖靈完備的事實意味著任何複雜的程式都可以在以太坊中計算。但是這種靈活性帶來了一些棘手的安全和資源管理問題。

圖靈完備的含義

圖靈證明,你無法通過在計算機上模擬程式來預測程式是否會終止。簡而言之,我們無法預測程式的運行路徑。圖靈完備系統可以在“無限迴圈”中運行,這是一個用於描述不終止程式的術語(過分簡化地說)。創建一個運行永不結束的迴圈的程式是微不足道的。但由於起始條件和程式碼之間存在複雜的相互作用,無意識的無限迴圈可能會在沒有警告的情況下產生。在以太坊中,這提出了一個挑戰:每個參與節點(客戶端)必須驗證每個交易,運行它所調用的任何智能合約。但正如圖靈證明的那樣,以太坊在沒有實際運行(可能永遠運行)時,無法預測智能合約是否會終止,或者運行多久。可以意外,或有意地,創建智能合約,使其在節點嘗試驗證它時永久運行,實際上是拒絕服務攻擊。當然,在需要毫秒驗證的程式和永遠運行的程式之間,存在無限範圍的令人討厭的資源浪費,內存膨脹,CPU過熱程式,這些程式只會浪費資源。在世界計算機中,濫用資源的程式會濫用世界資源。如果以太坊無法預測資源使用情況,以太坊如何限制智能合約使用的資源?

為了應對這一挑戰,以太坊引入了稱為 燃氣 _gas_的計量機制。隨著EVM執行智能合約,它會仔細考慮每條指令(計算,數據訪問等)。每條指令都有一個以燃氣為單位的預定成本。當交易觸發智能合約的執行時,它必須包含一定量的燃氣,用以設定運行智能合約可消耗的計算上限。如果計算所消耗的燃氣量超過交易中可用的天然氣量,則EVM將終止執行。Gas是以太坊用於允許圖靈完備計算的機制,同時限制任何程式可以使用的資源。

2015年,攻擊者利用了一個成本遠低於應有成本的EVM指令。這允許攻擊者創建使用大量內存的交易,並花幾分鐘時間進行驗證。為了解決這一攻擊,以太坊必須在不向前兼容(硬分叉)的更改中改變特定指令的燃氣核算公式。但是,即使有這種變化,以太坊客戶端也不得不跳過驗證這些交易或浪費數週的時間來驗證這些交易。

從通用區塊鏈到去中心化應用 (DApps)

以太坊作為一種可用於各種用途的通用區塊鏈的方式開始。但很快,以太坊的願景擴展為編程 去中心化應用(DApps) 的平臺。DApps代表比“智能合約”更廣闊的視角。DApp至少是一個智能合約和一個web用戶界面。更廣泛地說,DApp是一個基於開放的,去中心化的,點對點基礎架構服務的Web應用程式。

DApp至少由以下部分組成:

  • 區塊鏈上的智能合約

  • 一個Web前端用戶界面

另外,許多DApp還包括其他去中心化組件,例如:

  • 去中心化(P2P)儲存協議和平臺。

  • 去中心化(P2P)消息傳遞協議和平臺。

Tip

你可能會看到DApps拼寫為 ÐApps. Ð 字符是拉丁字符,稱為“ETH”,暗指以太坊。"ETH", 要顯示此字符,請在HTML中使用十進制實體 #208,並使用Unicode字符 0xCE(UTF-8)或 0x00D0(UTF-16)。

萬維網的進化

2004年,“Web 2.0”一詞引人注目,描述了網路向用戶生成內容,響應接口和交互性的演變。Web 2.0不是技術規範,而是描述Web應用程式新焦點的術語。

DApps的概念旨在將萬維網引入其下一個自然演進,將去中心化對等協議引入Web應用程式的每個方面。用於描述這種演變的術語是 Web3,意思是網路的第三個“版本”。由Gavin Wood首先提出,_web3_代表了Web應用程式的新願景和焦點:從集中擁有和管理的應用程式到基於去中心化協議的應用程式。

在後面的章節中,我們將探索Ethereum + web3js + JavaScript庫,它將你的瀏覽器中運行的JavaScript應用程式與以太坊區塊鏈連接起來。web3.js 庫還包含一個名為 Swarm 的P2P儲存網路接口和一個稱為 Whisper 的P2P消息傳遞服務。通過在你的Web瀏覽器中運行的JavaScript庫中包含這三個組件,開發人員可以使用完整的應用程式開發套件來構建web3 DApps:

web3suite
Figure 1. Web3: A suite of decentralized application components for the next evolution of the web

以太坊的開發文化

到目前為止,我們已經談到了以太坊的目標和技術與其他區塊鏈之前的區別,比如比特幣。以太坊也有非常不同的開發文化。

在比特幣中,開發以保守原則為指導:所有變化都經過仔細研究,以確保現有系統都不會中斷。大部分情況下,只有在向後兼容時才會執行更改。允許現有客戶“選擇加入”,但如果他們決定不升級,將繼續運作。

相比之下,在以太坊中,開發文化的重點是速度和創新。這個咒語是“快速行動,解決事情”。如果需要進行更改,即使這意味著使之前的假設失效,破壞兼容性或強制客戶端進行更新,也會執行更改。以太坊的開發文化的特點是快速創新,快速進化和願意參與實驗。

這對開發者來說意味著什麼,就是你必須保持靈活性,隨著一些潛在的假設變化,準備重建你的基礎設施。不要以為任何東西都是靜態的或永久的。以太坊開發人員面臨的一個重大挑戰是將程式碼部署到不可變賬本與仍在快速發展的開發平臺之間的內在矛盾。你不能簡單地“升級”你的智能合約。你必須準備部署新的,遷移用戶,應用程式和資金,並重新開始。

具有諷刺意味的是,這也意味著構建具有更多自主權和更少集中控制的系統的目標是無法實現的。在接下來的幾年中,自治和分權要求平臺中的穩定性要比以太坊可能獲得的穩定性要高一點。為了“發展”平臺,你必須準備好取消並重啟你的智能合約,這意味著你必須保留一定程度的控制權。

但是,在積極的一面,以太坊正在快速發展。“自行車脫落”的機會很小 - 這個表達意味著爭論一些小細節,比如如何在大樓後面建造自行車棚。如果你開始騎腳踏車,你可能會突然發現其他的開發團隊改變了計劃,並且拋棄了自行車,轉而使用自動氣墊船。在以太坊有很少的神聖原則,最終標準或固定接口。

最終,以太坊核心協議的開發速度將會放慢,其接口將會變得固定。但與此同時,創新是推動原則。你最好跟上,因為沒有人會為你放慢速度。

為什麼學習以太坊?

區塊鏈具有非常陡峭的學習曲線,因為它們將多個學科合併到一個領域:編程,資訊安全,密碼學,經濟學,分佈式系統,對等網路等。以太坊使得這一學習曲線不再陡峭,因此你可以很快就開始了。但就在一個看似簡單的環境表面之下,還有更多。當你學習並開始更深入的觀察時,總會有另一層複雜性和奇蹟。

以太坊是學習區塊鏈的絕佳平臺,它構建了一個龐大的開發者社區,比任何其他區塊鏈平臺都快。相比其他區塊鏈,以太坊是開發者為開發者開發的_開發者的區塊鏈_。熟悉JavaScript應用程式的開發人員可以進入以太坊並開始快速生成工作程式碼。在以太坊的頭幾年,通常看到T恤衫宣佈你可以用五行程式碼創建一個代幣。當然,這是一把雙刃劍。編寫程式碼很容易,但編寫_good_程式碼和_secure_程式碼非常困難。

本書將教你什麼?

這本書深入以太坊的每一個組成部分。你將從一個簡單的交易開始,分析它的工作原理,建立一個簡單的合約,使其更好,並跟蹤它在以太坊系統中的路徑。

你將瞭解以太坊的工作方式,以及為什麼這樣設計。你將能夠理解每個組成部分的工作方式,它們如何組合在一起以及為什麼。