以太坊白皮書(中文譯)(1

寫在前面:因為以太坊的白皮書很長,所以我分三次發出。目前為止,以太坊在區塊鏈的地位仍然無人撼動。ICO瘋狂的背後不能不提以太坊的ERC20,還有以太坊加密貓引領的所謂的區塊鏈養寵物的潮流,這裡不對以太坊做任何的褒貶,我們只談思想和技術。能力有限,翻譯有不當之處還請不吝指正。

以太坊:下一代智能合約和去中心化應用平臺

中本聰在2009年開發的比特幣作為貨幣的激進發展經常被致敬,它是數字資產的第一個例子,沒有資產擔保或內在價值,同時也沒有中央發行者或控制者。然而,比特幣實驗的一部分,可以說更重要的一部分,底層的區塊鏈技術,是一個分佈式共識的工具,並且越來越多的注意力都轉向它。常用的基於區塊鏈技術的非傳統應用包括:用區塊鏈上數字資產表示定製的貨幣和金融工具(彩色幣),一個底層物理設備所有權(智能財產),不可替代資產如域名(名字幣),和更復雜的應用(涉及數字資產直接由一段代碼控制,這些代碼實現固定規則-智能合約),以至於基於區塊鏈的去中心化自治組織(DAOs)。以太坊打算提供的是一種區塊鏈,它內置完全成熟的圖靈完備的編程語言,可以用來創建合約,簡單地通過幾行代碼寫出相應邏輯,來實現任意狀態轉移的功能,允許用戶創建上面提到的任意系統,還有實現很多我們還沒有想到的東西。

介紹比特幣和已有概念

歷史

去中心化數字貨幣,以及非傳統應用如財產註冊的概念已經存在了幾十年。二十世紀八九十年代提出的匿名電子現金協議,主要依賴加密學原語的喬姆盲籤技術,提供了一種具有高度隱私性的貨幣,但是這些協議由於高度依賴中心化的中介,大部分未能取得進展。1998年,戴偉的b-money首次提出通過解決數學難題和去中心化共識創建貨幣,但是這個方案對於如何實現去中心化共識的建議還不夠詳細,未能付諸實踐。2005年,哈爾芬尼介紹了一個可重複的工作量證明的概念,和一個系統,這個系統使用了b-money的思想,並結合亞當貝克的難以計算的哈希現金難題創建了一個加密貨幣的概念,但是由於依賴可信的後臺計算絕,無法達到理想。2009年,中本聰在實踐中第一次實現了去中心化貨幣,它結合了通過公鑰密碼學建立所有權管理的原語和跟蹤誰擁有幣的一種共識算法,被稱為"工作量證明"。

工作量證明背後的機制是空間上的突破,因為它同時解決了兩個問題。第一,它提供了一個簡單的適度有效的共識算法,允許網絡中的節點對比特幣賬本狀態的一套規範更新共同協商。第二,它提供了一種機制,允許自由加入共識過程,解決了決定誰影響共識的政治難題,同時防止女巫攻擊。它通過用經濟門檻取代正式門檻來參與,比如要以獨一無二的實體註冊到一個特定的列表裡-在共識投票過程中,一個單獨節點的權重和該節點能帶來的算力成正比。其後,一個替代的方法就被提出來了,稱為權益證明,通過節點持幣比例來計算權重,而非計算資源。對於兩種方法優缺點的討論超出了本文的範圍,但是需要注意的是,兩種方法都可以用來作為加密貨幣的基礎。

比特幣作為一個狀態轉移系統

以太坊白皮書(中文譯)(1/3)

從技術角度看,加密貨幣的賬本如比特幣可以被認為是一個狀態轉移系統,狀態包含了所有已經發行的比特幣的所有權狀態,狀態轉移函數通過輸入一個狀態和交易,輸出一個新的狀態。比如,在一個標準的銀行系統裡,狀態是一張餘額單,一個交易是一個從A到B轉移X美元的請求,狀態轉換函數把A賬戶減少X美元,B賬戶增加X美元。如果開始A賬戶的餘額少於X美元,狀態轉換函數返回錯誤。因此,可以正式定義:

APPLY(S,TX) -> S' or ERROR

在上面定義的銀行系統裡:

APPLY({ Alice: $50, Bob: $50 },"send $20 from Alice to Bob") = { Alice: $30, Bob: $70 }

但是:

APPLY({ Alice: $50, Bob: $50 },"send $70 from Alice to Bob") = ERROR

比特幣的狀態是所有已挖出但未花費的比特幣的集合(技術上稱為未花費交易輸出,或UTXO),每個UTXO包含面額和所有者(用一個20字節的地址來定義,本質上是加密算法裡的公鑰)。一個交易包含一個或多個輸入,每一個輸入包含一個對有效UTXO的引用和一個加密簽名,是用所有者地址對應的私鑰的簽名,還包含一個或多個輸出,每個輸出包含一個新的UTXO,這個UTXO將加入到狀態中。

狀態轉移函數APPLY(S,TX) -> S'大致定義如下:

1. 對每一個TX中的輸入:

-如果引用的UTXO不在S中,返回錯誤。

-如果提供的數字簽名和UTXO所有者不匹配,返回錯誤。

2. 如果所有輸入面額的總和比輸出的所有UTXO面額的總和少,返回錯誤。

3. 返回的S'會刪除所有輸入的UTXO,加上所有輸出的UTXO。

第一步的前半部分防止發送者花費不存在的幣,後半部分防止發送者花費別人的幣。第二步強調了價值平衡。為了將上面的狀態轉移函數用於支付,協議如下。假設愛麗絲想發送11.7btc給鮑勃。首先,愛麗絲找到一組她所有的可用的UTXO,總和至少是11.7btc。事實上,愛麗絲很難正好有11.7btc,她可以得到的最小的數是6+4+2=12。然後她創建了一筆交易,包含三個輸入和兩個輸出。第一個輸出是給鮑勃的11.7btc,第二個輸出將是剩餘的0.3btc的找零,是給愛麗絲自己的。

挖礦

以太坊白皮書(中文譯)(1/3)

如果我們訪問的是值得信賴的中心化服務,這個系統很容易實現,它可以簡單按照確切需求進行編碼,使用中心化的服務器硬盤來跟蹤狀態。然而,比特幣試圖創建的是一個去中心化的貨幣系統,所以我們需要結合狀態轉化系統和共識系統,來確保每個人都同意交易的順序。比特幣的去中心化的共識過程需要網絡中的節點不斷嘗試生成稱為區塊的交易包。該網絡希望大致每十分鐘生成一個區塊,每個區塊鏈包含一個時間戳,一個隨機數,前一個塊的引用(哈希),從前一個塊產生後發生的所有交易的列表。隨著時間的推移,這將創建一個持續的,不斷增長的區塊鏈,不斷更新的區塊鏈代表了比特幣賬本最新的狀態。

檢查一個區塊是否有效的算法,在這個範例中,如下所示:

1. 檢查該區塊的上一個區塊是否存在和有效。

2. 檢查該區塊的時間戳是否比上一個區塊大,並且小於未來兩個小時。

3. 檢查區塊上的工作量證明是否有效。

4. 設S[0]等於上一個區塊結束時的狀態。

5. 假設TX是區塊內交易列表,包含n個交易。對於所有i,i等於0到n-1,設S[i+1]=APPLY(S[i],TX[i]),如果任意一步返回錯誤,該步驟退出並返回假。

6. 如果返回真,並且記錄S[n]作為該區塊後的狀態。

基本上,該區塊內的每一筆交易都要提供一個有效的狀態轉移,從這個交易執行之前的典型狀態轉移到一個新的狀態。注意這個狀態不會以任何方式在該區塊編碼記錄。這是一個被驗證節點記住的完全抽象的概念,要計算某個區塊,只能從創世狀態開始,對每一個區塊依次應用每一筆交易。此外,要注意礦工打包交易進區塊的順序很重要,如果區塊裡有兩筆交易A和B,B花費一個由A創建的UTXO,如果A在B之前則區塊有效,反之區塊無效。

上面提到的一個驗證條件是其他系統不需要的,這個驗證條件是工作量證明。這個精確的條件是每一個區塊的雙SHA256哈希,作為256bit的數字,必須小於一個可以動態調整的目標值,截止到本文的時候,這個目標值接近2^187。這樣做的目的是讓區塊的產生依靠計算難度,從而防止女巫攻擊者按他們的利益重新創建整條區塊鏈。因為SHA256被設計成一個完全不可預測的偽隨機函數,創建有效區塊的唯一方式就是簡單的試錯,不斷對隨機數進行遞增然後計算檢查哈希是否匹配。就現在目標值~2^187來說,網絡在找到有效區塊之前需要平均嘗試~2^69次,通常網絡每隔2016個區塊會對目標值調整一次,這樣讓節點可以大概保持平均每十分鐘產生一個區塊。為了補償礦工的計算工作,每個區塊的礦工有權打包一個給自己12.5btc的交易,這個交易只有輸出,沒有輸入。此外,如果任意一個交易輸入的總面額比輸出的高,這個差值也會作為交易手續費給礦工。順便提一下,這也是比特幣發行的唯一機制,創世狀態一個幣也沒有。

為了更好的理解挖礦,我們檢查一下當有惡意攻擊的時候會發生什麼。因為比特幣底層的密碼技術公認是安全的,攻擊者將攻擊比特幣系統中沒有被密碼技術保護的部分:交易順序。攻擊者策略很簡單:

1. 發送100btc給商戶買商品(最好是快速交貨的數字產品)

2. 等待交貨

3. 產生另一個交易發送相同的100btc給自己

4. 試圖說服網絡發給他自己的那筆交易是最先來的

一旦第一步發生,幾分鐘後就有礦工打包這筆交易到區塊,假設區塊號270。大約一個小時候,又有5個區塊產生,追加到剛才那個區塊後面。這5個塊中的每一個塊都間接指向這筆交易,並且因此確認了它。這時候,商戶將最終接受這個支付,併發貨,因為我們假定是數字產品,發貨是即時的。現在攻擊者創建另一個交易,發送100btc給自己。如果攻擊者簡單的把這筆交易發出去,這筆交易是不會被處理的。礦工將會運行APPLY(S,TX),注意TX花費了狀態裡已經不存在的UTXO。所以,攻擊者創建了一個區塊鏈的分叉,從挖另一個版本的區塊270開始,也指向同樣的區塊269,作為父區塊,並且用新交易替換了舊的。因為區塊數據不一樣了,這需要進行工作量證明。進一步說,攻擊者新版本的區塊270的哈希不同,所以原來區塊271~275並沒有指向它,原來的鏈和攻擊者的新鏈完全的分離的。規則是這樣的,分叉中最長的鏈被認為是真實的,所以合法的礦工將在區塊275的鏈上工作,只有攻擊者自己在區塊270的鏈上工作。攻擊者為了讓自己的鏈變成最長鏈,他需要有比其餘所有礦工的組合更多的算力,這樣才能追上(因此,發生51%攻擊)。

默克爾樹

以太坊白皮書(中文譯)(1/3)

左邊:僅用很少的節點就可以證明一個分支的有效性。

右邊:任何修改默克爾樹某一部分的企圖都會導致鏈上面的某個地方不一致。

比特幣的一個重要的可擴展的特性是區塊以多層數據結構存儲。區塊的哈希實際上僅僅是區塊頭的哈希,大約200字節數據,包含時間戳,隨機數,前一個區塊哈希和默克爾數的根哈希,默克爾樹存儲所有交易在區塊裡。默克爾樹是一種二叉樹,由一組節點組成,樹的底部包含大量的葉子節點,其中包含底層數據,一組中間節點,每個節點都是兩個孩子的哈希,最後生成一個單獨的根節點,也是由兩個孩子節點哈希成的,代表了樹的頂部。使用默克爾樹的目的是允許區塊裡的數據可以分離的傳遞:一個節點可以從一個來源僅下載區塊頭,從其他來源下載與他們有關的樹的一小部分,並且仍然可以確保所有的數據都是正確的。為什麼可以呢?因為哈希值是向上傳播的:如果惡意用戶想用一個假的交易和默克爾樹底部的一個交易進行交換,這將使得上面的節點發生變化,進而這個節點上面的節點也發生變化,最後改變了樹的根,也改變了區塊的哈希,協議使得它作為一個完全不同的區塊進行記錄(幾乎可以肯定是個無效的工作量證明)。

默克爾樹協議對長期可持續發展是至關重要的。比特幣網絡的一個全節點,它存儲每個區塊的整體,2014年四月的時候比特幣網絡需要大概15GB的磁盤空間,並且以每個月以1GB的速度增加。現在對於一些桌面電腦還是可以的,但是手機不行,不遠的將來只有企業和愛好者才能參與。一個被稱為簡化支付驗證的協議允許其他類型的節點存在,我們叫它輕節點,他們下載區塊鏈頭,在上面驗證工作量證明,然後僅下載和他們有關的交易的分支。這允許輕節點很安全的確定任意一個比特幣交易的狀態和他們的餘額,雖然僅下載整個區塊鏈很小的一部分。

非傳統的區塊鏈應用

將區塊鏈思想應用到其它領域的想法早就出現了。1998年,尼克·薩博提出了《用所有權為財產冠名》的概念,這個文檔描述了可複製數據庫技術新進展,將允許一個基於區塊鏈的系統登記土地所有權,創建了一個精心設計的框架,它包含一些概念比如宅地,非法佔有和喬治亞洲土地稅。然而,很遺憾那時候並沒有一個實用的可複製數據庫系統,這個協議從未被實踐過。可是2009年後,自從比特幣的去中心化共識被開發出來,大量非傳統應用開始迅速出現。

---名字幣 – 2010年創建,名字幣是被很好的描述成一個去中心化名字註冊數據庫。在去中心化協議裡,像洋蔥路由,比特幣和比特信,需要一種識別賬戶的方式使得他們可以進行交互,但是所有已有的解決方案裡,可用的識別碼是一個偽隨機數就像1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy。理想情況是能有一個名字叫像"喬治"這樣的的賬戶。然而,問題是如果一個人可以用喬治創建一個賬戶,然後其他人也以同樣的步驟註冊喬治,冒充他。僅有的方案是使用第一申請範式,第一個可以註冊成功,第二個失敗 – 這是一個完全適合比特幣共識協議的問題。名字幣是最早的,最成功的用這個思想實現的名字註冊系統。

---彩色幣 – 彩色幣協議為人們在比特幣區塊鏈上創建他們自己的數字貨幣 – 或者,在更重要的一般意義上的貨幣(數字通證)提供服務。按照彩色幣的協議,人們通過給特定的比特幣UTXO分配一種顏色來發行新幣,協議還遞歸的定義了其他UTXO和交易輸入擁有一樣的顏色(一些特別的規則應用在混合顏色輸入的情況)。這允許用戶的錢包僅包含一種特定顏色的UTXO,並且可以像普通比特幣一樣發送他們,通過回溯區塊鏈來確定他們收到任意一個UTXO的顏色。

---元幣 – 元幣背後的理念是建立在比特幣之上的協議,用比特幣交易存儲元幣交易,但是狀態轉換函數不一樣,記為APPLY'。因為元幣協議不能阻止比特幣區塊鏈上出現的無效的元幣交易,在APPLY'(S,TX)返回錯誤的時候增加一個規則,協議默認是APPLY'(S,TX) = S。這為創建任意的加密貨幣協議提供了一個簡單的機制,這些高級特性靠比特幣本身不能實現,而且開發成本也很低,因為複雜的挖礦和網絡問題已經由比特幣協議處理好了。元幣被用於實現幾個類型的金融合約,名字註冊和去中心化交易所。

因此,一般來說,有兩種方法來建立共識協議:建立一個獨立的網絡,在比特幣上建立一套協議。前一種方法很難實現,儘管像名字幣這樣的應用已經獲得了成功。每個應用都需要創立獨立的區塊鏈,建立和測試所有可能的狀態轉移和網絡代碼。另外,我們預測去中心化技術的應用將會服從冪律分佈,大多數應用太小不足以保證區塊鏈的安全,我們還注意到現有的大量的去中心化應用,尤其是去中心化組織,需要互相交互。

另一方面,基於比特幣的方法缺點是無法繼承簡化支付驗證的特性。比特幣之所以可以實現簡化支付驗證,是因為它使用區塊深度作為驗證區塊有效的代理。在這點上,一旦一個交易的祖先追溯到足夠遠的地方,就可以安全的說它是狀態的合法部分。與之相反,基於區塊鏈的元幣協議,不能強制要求區塊鏈不包含不符合元幣協議的交易。因此,一個元幣協議版本的完全安全的簡化支付驗證版本需要向後掃描所有的區塊鏈確認某些交易是否有效。所有基於比特幣的元幣協議的輕實現依靠一個可信賴的服務器提供數據,可以說是一個非常不理想的結果,尤其是當一個加密貨幣不需要依賴信任的時候。

腳本

即使沒有任何擴展,比特幣協議實際上也可以實現智能合約的一個弱化版本。比特幣的UTXO不僅可以被一個公鑰所有,也可以由一個複雜腳本所有,這個腳本是用一個簡單的基於堆棧的編程語言實現的。在這種範式下,要花費這個UTXO的交易必須提供數據滿足這個腳本。實際上,基本的公鑰所有權機制也是通過一個腳本的實現的:腳本將橢圓曲線的數字簽名作為輸入,通過它驗證交易和UTXO所有者的地址,如果驗證成功就返回1,反之返回0。更復雜的腳本用於其他更復雜的場景。比如,一個人可以創建一個腳本,這個腳本需要三個中的兩個私鑰簽名來驗證(多籤),這對企業賬戶,安全儲蓄賬戶,某些商業代理來說這種設置非常有用,腳本也可以用於對解決問題的用戶發賞金,一個人可以創建這樣一個腳本,"如果你能夠提供已經發送一定面額的狗狗幣給我的簡化驗證支付證明,這個比特幣的UTXO就是你的了",基本上允許不同的加密貨幣之間進行交換。

然而,比特幣中實現的腳本語言有幾個重要限制:

---缺少圖靈完備性 也就是說,雖然比特幣腳本語言支持多種計算,但它也不是無所不能。最主要的缺失是循環。這麼做的原因時防止驗證交易時出現無限循環。理論上,這個是程序員可以克服的障礙,因為任何一個循環通過簡單的多次執行相應的if語句的代碼來模擬,但它會導致腳本在空間上的低效。比如,實現一個替代的橢圓曲線簽名算法,這種算法可能需要256輪的乘法操作,每輪操作都需要單獨寫代碼。

---價值盲 UTXO腳本沒有方法對取款額度進行精細的控制。比如,預言機合約的一個強大的應用就是對沖合約,A和B同時向對沖合約發送價值1000美元的比特幣,30天后,腳本向A發送1000美元的比特幣,向B發送剩餘的比特幣。這需要預言機確定1btc值多少美元,但是與現在已經在用的完全中心化的方案相比,這個方案已經在信任和基礎設施方面有了巨大的改進。然而,因為UTXO是不可細分的,唯一的方法就是非常低效的採用很多不同面值的UTXO(比如,有一個2k的UTXO,k最大是30)並用預言機選擇哪些UTXO發給A,哪個發給B。

---缺少狀態 UTXO只能是花費或未花費狀態,對於多階段合約或腳本就無法實現,因為除了這兩個狀態還需要某些其他內部狀態。這使得實現多階段期權合約,去中心化交換要約或兩階段加密承諾協議(安全的計算獎勵非常必要)非常困難。它也意味著UTXO只能用於建立簡單的,一次性的合約,而不是建立複雜的多狀態的合約,比如去中心化組織,使得元幣協議很難實現。二元狀態結合價值盲也意味著另外一個重要的應用,取款限制無法實現。

---區塊鏈盲 UTXO對區塊鏈數據一無所知,比如隨機數,時間戳和上一個塊的哈希。這一缺陷剝奪了腳本語言中有價值的隨機性的來源,嚴重限制了博彩等其他領域的應用。

因此,我們看到了三種在加密貨幣上構建高級應用的方法:創建一個新的區塊鏈、使用比特幣上的腳本、在比特幣上建立一個元幣協議。構建一個新的區塊鏈,允許自由無限制的實現任意特性,但是需要很大的投入。使用腳本的方法非常容易實現和標準化,但是能力非常有限,還有元幣協議,雖然容易,但是存在擴展性差的缺陷。用以太坊,我們想構建一個替代的框架,在開發易用性上提供更大的好處,還有更強大的輕客戶端屬性,同時允許應用程序共享經濟環境和區塊鏈的安全性。



分享到:


相關文章: