區塊鏈2.0以太坊漫談(1)
當中本聰在2009年1月啟動比特幣區塊鏈時,他同時向世界引入了兩種未經測試的革命性的新概念。第一種就是比特幣(bitcoin),一種去中心化的點對點的網上貨幣,在沒有任何資產擔保、內在價值或者中心發行者的情況下維持著價值。到目前為止,比特幣已經吸引了大量的公眾注意力, 就政治方面而言它是一種沒有中央銀行的貨幣並且有著劇烈的價格波動。然而,中本聰的偉大試驗還有與比特幣同等重要的一部分:基於工作量證明的區塊鏈概念使得人們可以就交易順序達成共識。作為應用的比特幣可以被描述為一個先申請(first-to-file)系統:如果某人有50BTC並且同時向A和B傳送這50BTC,只有被首先被確認的交易才會生效。沒有固有方法可以決定兩筆交易哪一筆先到,這個問題阻礙了去中心化數字貨幣的發展許多年。中本聰的區塊鏈是第一個可靠的去中心化解決辦法。現在,開發者們的注意力開始迅速地轉向比特幣技術的第二部分,區塊鏈怎樣應用於貨幣以外的領域。
常被提及的應用包括使用鏈上數字資產來代表定製貨幣和金融工具(彩色幣),某種基礎物理裝置的所有權(智慧資產),如域名一樣的沒有可替代性的資產(域名幣)以及如去中心化交易所,金融衍生品,點到點賭博和鏈上身份和信譽系統等更高階的應用。另一個常被問詢的重要領域是“智慧合約”- 根據事先任意制訂的規則來自動轉移數字資產的系統。例如,一個人可能有一個儲存合約,形式為“A可以每天最多提現X個幣,B每天最多Y個,A和B一起可以隨意提取,A可以停掉B的提現權”。這種合約的符合邏輯的擴充套件就是去中心化自治組織(DAOs)-長期的包含一個組織的資產並把組織的規則編碼的智慧合約。以太坊的目標就是提供一個帶有內建的成熟的圖靈完備語言的區塊鏈,用這種語言可以建立合約來編碼任意狀態轉換功能,使用者只要簡單地用幾行程式碼來實現邏輯,就能夠建立以上提及的所有系統以及許多我們還想象不到的的其它系統。
去中心化的數字貨幣概念,正如財產登記這樣的替代應用一樣,早在幾十年以前就被提出來了。1980和1990年代的匿名電子現金協議,大部分是以喬姆盲籤技術(Chaumian blinding)為基礎的。這些電子現金協議提供具有高度隱私性的貨幣,但是這些協議都沒有流行起來,因為它們都依賴於一箇中心化的中介機構。1998年,戴偉(Wei Dai)的b-money首次引入了通過解決計算難題和去中心化共識創造貨幣的思想,但是該建議並未給出如何實現去中心化共識的具體方法。2005年,芬尼(Hal Finney)引入了“可重複使用的工作量證明機制”(reusable proofs of work)概念,它同時使用b-money的思想和Adam Back提出的計算困難的雜湊現金(Hashcash)難題來創造密碼學貨幣。但是,這種概念再次迷失於理想化,因為它依賴於可信任的計算作為後端。
因為貨幣是一個先申請應用,交易的順序至關重要,所以去中心化的貨幣需要找到實現去中心化共識的方法。比特幣以前的所有電子貨幣協議所遇到的主要障礙是,儘管對如何建立安全的拜占庭問題容錯(Byzantine-fault-tolerant)多方共識系統的研究已經歷時多年,但是上述協議只解決了問題的一半。這些協議假設系統的所有參與者是已知的,併產生如“如果有N方參與到系統中,那麼系統可以容忍N/4的惡意參與者”這樣形式的安全邊界。然而這個假設的問題在於,在匿名的情況下,系統設定的安全邊界容易遭受攻擊,因為一個攻擊者可以在一臺伺服器或者殭屍網路上建立數以千計的節點,從而單方面確保擁有多數份額。
中本聰的創新是引入這樣一個理念:將一個非常簡單的基於節點的去中心化共識協議與工作量證明機制結合在一起。節點通過工作量證明機制獲得參與到系統的權利,每十分鐘將交易打包到“區塊”中,從而建立出不斷增長的區塊鏈。擁有大量算力的節點有更大的影響力,但獲得比整個網路更多的算力比建立一百萬個節點困難得多。儘管比特幣區塊鏈模型非常簡陋,但是實踐證明它已經足夠好用了,在未來五年,它將成為全世界兩百個以上的貨幣和協議的基礎。
從技術角度講,比特幣賬本可以被認為是一個狀態轉換系統,該系統包括所有現存的比特幣所有權狀態和“狀態轉換函式”。狀態轉換函式以當前狀態和交易為輸入,輸出新的狀態。例如,在標準的銀行系統中,狀態就是一個資產負債表,一個從A賬戶向B賬戶轉賬X美元的請求是一筆交易,狀態轉換函式將從A賬戶中減去X美元,向B賬戶增加X美元。如果A賬戶的餘額小於X美元,狀態轉換函式就會返回錯誤提示。所以我們可以如下定義狀態轉換函式:
在上面提到的銀行系統中,狀態轉換函式如下:
但是:
比特幣系統的“狀態”是所有已經被挖出的、沒有花費的比特幣(技術上稱為“未花費的交易輸出,unspent transactionoutputs 或UTXO”)的集合。每個UTXO都有一個面值和所有者(由20個位元組的本質上是密碼學公鑰的地址所定義[1])。一筆交易包括一個或多個輸入和一個或多個輸出。每個輸入包含一個對現有UTXO的引用和由與所有者地址相對應的私鑰建立的密碼學簽名。每個輸出包含一個新的加入到狀態中的UTXO。
在比特幣系統中,狀態轉換函式APPLY(S,TX)->S’
大體上可以如下定義:
(1)交易的每個輸入:
- 如果引用的UTXO不存在於現在的狀態中(S),返回錯誤提示
- 如果簽名與UTXO所有者的簽名不一致,返回錯誤提示
(2)如果所有的UTXO輸入面值總額小於所有的UTXO輸出面值總額,返回錯誤提示
(3)返回新狀態S’,新狀態S中移除了所有的輸入UTXO,增加了所有的輸出UTXO。
第一步的第一部分防止交易的傳送者花費不存在的比特幣,第二部分防止交易的傳送者花費其他人的比特幣。第二步確保價值守恆。比特幣的支付協議如下:假設Alice想給Bob傳送11.7BTC。事實上,Alice不可能正好有11.7BTC。假設,她能得到的最小數額比特幣的方式是:6+4+2=12。所以,她可以建立一筆有3個輸入,2個輸出的交易。第一個輸出的面值是11.7BTC,所有者是Bob(Bob的比特幣地址),第二個輸出的面值是0.3BTC,所有者是Alice自己,也就是找零。
挖礦:
一個區塊,每個區塊包含一個時間戳、一個隨機數、一個對上一個區塊的引用(即雜湊)和上一區塊生成以來發生的所有交易列表。這樣隨著時間流逝就建立出了一個持續增長的區塊鏈,它不斷地更新,從而能夠代表比特幣賬本的最新狀態。
一個區塊,每個區塊包含一個時間戳、一個隨機數、一個對上一個區塊的引用(即雜湊)和上一區塊生成以來發生的所有交易列表。這樣隨著時間流逝就建立出了一個持續增長的區塊鏈,它不斷地更新,從而能夠代表比特幣賬本的最新狀態
依照這個正規化,檢查一個區塊是否有效的演算法如下:
(1)檢查區塊引用的上一個區塊是否存在且有效。
(2)檢查區塊的時間戳是否晚於以前的區塊的時間戳,而且早於未來2小時。
(3)檢查區塊的工作量證明是否有效。
(4)將上一個區塊的最終狀態賦於S[0]。
(5)假設TX是區塊的交易列表,包含n筆交易。對於屬於0……n-1的所有i,進行狀態轉換S[i+1] = APPLY(S[i],TX[i])。如果任何一筆交易i在狀態轉換中出錯,退出程式,返回錯誤。
(6)返回正確,狀態S[n]是這一區塊的最終狀態。
本質上,區塊中的每筆交易必須提供一個正確的狀態轉換,要注意的是,“狀態”並不是編碼到區塊的。它純粹只是被校驗節點記住的抽象概念,對於任意區塊都可以從創世狀態開始,按順序加上每一個區塊的每一筆交易,(妥妥地)計算出當前的狀態。另外,需要注意礦工將交易收錄進區塊的順序。如果一個區塊中有A、B兩筆交易,B花費的是A建立的UTXO,如果A在B以前,這個區塊是有效的,否則,這個區塊是無效的
區塊驗證演算法的有趣部分是“工作量證明”概念:對每個區塊進行SHA256雜湊處理,將得到的雜湊視為長度為256位元的數值,該數值必須小於不斷動態調整的目標數值,本章寫作時目標數值大約是2^190。工作量證明的目的是使區塊的建立變得困難,從而阻止攻擊者惡意重新生成區塊鏈。因為SHA256是完全不可預測的偽隨機函式,建立有效區塊的唯一方法就是簡單地不斷試錯,不斷地增加隨機數的數值,檢視新的雜湊數值是否小於目標數值。如果當前的目標數值是2^192,就意味著平均需要嘗試2^64次才能生成有效的區塊。一般而言,比特幣網路每隔2016個區塊重新設定目標數值,保證平均每十分鐘生成一個區塊。為了對礦工的計算工作進行獎勵,每一個成功生成區塊的礦工有權在區塊中包含一筆憑空發給他們自己25BTC的交易。另外,如果交易的輸入大於輸出,差額部分就作為“交易費用”付給礦工。順便提一下,對礦工的獎勵是比特幣發行的唯一機制,創世狀態中並沒有比特幣。
為了更好地理解挖礦的目的,讓我們分析比特幣網路出現惡意攻擊者時會發生什麼。因為比特幣的密碼學基礎是非常安全的,所以攻擊者會選擇攻擊沒有被密碼學直接保護的部分:交易順序。攻擊者的策略非常簡單:
(1)向賣家傳送100BTC購買商品(尤其是無需郵寄的電子商品)。
(2)等待直至商品發出。
(3)建立另一筆交易,將相同的100BTC傳送給自己的賬戶。
(4)使比特幣網路相信傳送給自己賬戶的交易是最先發出的。
一旦步驟(1)發生,幾分鐘後礦工將把這筆交易打包到區塊,假設是第270000個區塊。大約一個小時以後,在此區塊後面將會有五個區塊,每個區塊間接地指向這筆交易,從而確認這筆交易。這時賣家收到貨款,並向買家發貨。因為我們假設這是數字商品,攻擊者可以即時收到貨。現在,攻擊者建立另一筆交易,將相同的100BTC傳送到自己的賬戶。如果攻擊者只是向全網廣播這一訊息,這一筆交易不會被處理。礦工會執行狀態轉換函式APPLY(S,TX),發現這筆交易將花費已經不在狀態中的UTXO。所以,攻擊者會對區塊鏈進行分叉,將第269999個區塊作為父區塊重新生成第270000個區塊,在此區塊中用新的交易取代舊的交易。因為區塊資料是不同的,這要求重新進行工作量證明。另外,因為攻擊者生成的新的第270000個區塊有不同的雜湊,所以原來的第270001到第270005的區塊不指向它,因此原有的區塊鏈和攻擊者的新區塊是完全分離的。在發生區塊鏈分叉時,區塊鏈長的分支被認為是誠實的區塊鏈,合法的的礦工將會沿著原有的第270005區塊後挖礦,只有攻擊者一人在新的第270000區塊後挖礦。攻擊者為了使得他的區塊鏈最長,他需要擁有比除了他以外的全網更多的算力來追趕(即51%攻擊)
默克爾樹:
左:僅提供默克爾樹(Merkle tree)上的少量節點已經足夠給出分支的合法證明。
右:任何對於默克爾樹的任何部分進行改變的嘗試都會最終導致鏈上某處的不一致。
比特幣系統的一個重要的可擴充套件特性是:它的區塊儲存在多層次的資料結構中。一個區塊的雜湊實際上只是區塊頭的雜湊,區塊頭是包含時間戳、隨機數、上個區塊雜湊和儲存了所有的區塊交易的默克爾樹的根雜湊的長度大約為200位元組的一段資料。
默克爾樹是一種二叉樹,由一組葉節點、一組中間節點和一個根節點構成。最下面的大量的葉節點包含基礎資料,每個中間節點是它的兩個子節點的雜湊,根節點也是由它的兩個子節點的雜湊,代表了默克爾樹的頂部。默克爾樹的目的是允許區塊的資料可以零散地傳送:節點可以從一個源下載區塊頭,從另外的源下載與其有關的樹的其它部分,而依然能夠確認所有的資料都是正確的。之所以如此是因為雜湊向上的擴散:如果一個惡意使用者嘗試在樹的下部加入一個偽造的交易,所引起的改動將導致樹的上層節點的改動,以及更上層節點的改動,最終導致根節點的改動以及區塊雜湊的改動,這樣協議就會將其記錄為一個完全不同的區塊(幾乎可以肯定是帶著不正確的工作量證明的)。
默克爾樹協議對比特幣的長期持續性可以說是至關重要的。在2014年4月,比特幣網路中的一個全節點-儲存和處理所有區塊的全部資料的節點-需要佔用15GB的記憶體空間,而且還以每個月超過1GB的速度增長。目前,這一儲存空間對臺式計算機來說尚可接受,但是手機已經負載不了如此巨大的資料了。未來只有商業機構和愛好者才會充當完整節點。簡化支付確認(SPV)協議允許另一種節點存在,這樣的節點被成為“輕節點”,它下載區塊頭,使用區塊頭確認工作量證明,然後只下載與其交易相關的默克爾樹“分支”。這使得輕節點只要下載整個區塊鏈的一小部分就可以安全地確定任何一筆比特幣交易的狀態和賬戶的當前餘額。
其它的區塊鏈應用:
將區塊鏈的思想應用到其它領域的想法早就出現了。在2005年,尼克薩博提出了“用所有權為財產冠名”的概念,文中描述了複製資料庫技術的發展如何使基於區塊鏈的系統可以應用於登記土地所有權,建立包括例如房產權、違法侵佔和喬治亞州土地稅等概念的詳細框架。然而,不幸的是在那時還沒有實用的複製資料庫系統,所以這個協議被沒有被付諸實踐。不過,自2009年比特幣系統的去中心化共識開發成功以來,許多區塊鏈的其它應用開始快速出現。
域名幣(namecoin)- 建立於2010年,被稱為去中心化的名稱註冊資料庫。像Tor、Bitcoin和BitMessage這樣的去中心化協議,需要一些確認賬戶的方法,這樣其他人才能夠與使用者進行互動。但是,在所有的現存的解決方案中僅有的可用的身份標識是象1LW79wp5ZBqaHW1jL5TciBCrhQYtHagUWy這樣的偽隨機雜湊。理想的情況下,人們希望擁有一個帶有象“george”這樣的名稱的賬戶。然而,問題是如果有人可以建立“george”賬戶,那麼其他人同樣也可以建立“george”賬戶來假扮。唯一的解決方法是先申請原則(first-to-file),只有第一個註冊者可以成功註冊,第二個不能再次註冊同一個賬戶。這一問題就可以利用比特幣的共識協議。域名幣是利用區塊鏈實現名稱註冊系統的最早的、最成功的系統。
彩色幣(Colored coins)- 彩色幣的目的是為人們在比特幣區塊鏈上建立自己的數字貨幣,或者,在更重要的一般意義上的貨幣 – 數字令牌提供服務。依照彩色幣協議,人們可以通過為某一特別的比特幣UTXO指定顏色,發行新的貨幣。該協議遞迴地將其它UTXO定義為與交易輸入UTXO相同的顏色。這就允許使用者保持只包含某一特定顏色的UTXO,傳送這些UTXO就像傳送普通的比特幣一樣,通過回溯全部的區塊鏈判斷收到的UTXO顏色。
元幣(Metacoins)- 元幣的理念是在比特幣區塊鏈上建立新的協議,利用比特幣的交易儲存元幣的交易,但是採用了不同的狀態轉換函式APPLY。因為元幣協議不能阻止比特幣區塊鏈上的無效的元幣交易,所以增加一個規則如果APPLY'(S,TX)返回錯誤,這一協議將預設APPLY'(S,TX) = S。這為建立任意的、先進的不能在比特幣系統中實現的密碼學貨幣協議提供了一個簡單的解決方法,而且開發成本非常低,因為挖礦和網路的問題已經由比特幣協議處理好了。
因此,一般而言,建立共識協議有兩種方法:建立一個獨立的網路和在比特幣網路上建立協議。雖然像域名幣這樣的應用使用第一種方法已經獲得了成功,但是該方法的實施非常困難,因為每一個應用需要建立獨立的區塊鏈和建立、測試所有狀態轉換和網路程式碼。另外,我們預測去中心化共識技術的應用將會服從冪律分佈,大多數的應用太小不足以保證自由區塊鏈的安全,我們還注意到大量的去中心化應用,尤其是去中心化自治組織,需要進行應用之間的互動。
另一方面,基於比特幣的方法存在缺點,它沒有繼承比特幣可以進行簡化確認支付(SPV) 的特性。比特幣可以實現簡化確認支付,因為比特幣可以將區塊鏈深度作為有效性確認代理。在某一點上,一旦一筆交易的祖先們距離現在足夠遠時,就可以認為它們是合法狀態的一部分。與之相反,基於比特幣區塊鏈的元幣協議不能強迫區塊鏈不包括不符合元幣協議的交易。因此,安全的元幣協議的簡化支付確認需要後向掃描所有的區塊,直到區塊鏈的初始點,以確認某一交易是否有效。目前,所有基於比特幣的元幣協議的“輕”實施都依賴可信任的伺服器提供資料,這對主要目的之一是消除信任需要的密碼學貨幣而言,只是一個相當次優的結果。
指令碼:
即使不對比特幣協議進行擴充套件,它也能在一定程度上實現”智慧合約”。比特幣的UTXO可以被不只被一個公鑰擁有,也可以被基於堆疊的程式語言所編寫的更加複雜的指令碼所擁有。在這一模式下,花費這樣的UTXO,必須提供滿足指令碼的資料。事實上,基本的公鑰所有權機制也是通過指令碼實現的:指令碼將橢圓曲線簽名作為輸入,驗證交易和擁有這一UTXO的地址,如果驗證成功,返回1,否則返回0。更加複雜的指令碼用於其它不同的應用情況。例如,人們可以建立要求集齊三把私鑰中的兩把才能進行交易確認的指令碼(多重簽名),對公司賬戶、儲蓄賬戶和某些商業代理來說,這種指令碼是非常有用的。指令碼也能用來對解決計算問題的使用者傳送獎勵。人們甚至可以建立這樣的指令碼“如果你能夠提供你已經傳送一定數額的的狗幣給我的簡化確認支付證明,這一比特幣UTXO就是你的了”,本質上,比特幣系統允許不同的密碼學貨幣進行去中心化的兌換。
然而,比特幣系統的指令碼語言存在一些嚴重的限制:
(1)缺少圖靈完備性 – 這就是說,儘管比特幣指令碼語言可以支援多種計算,但是它不能支援所有的計算。最主要的缺失是迴圈語句。不支援迴圈語句的目的是避免交易確認時出現無限迴圈。理論上,對於指令碼程式設計師來說,這是可以克服的障礙,因為任何迴圈都可以用多次重複if 語句的方式來模擬,但是這樣做會導致指令碼空間利用上的低效率,例如,實施一個替代的橢圓曲線簽名演算法可能將需要256次重複的乘法,而每次都需要單獨編碼。
(2)價值盲(Value-blindness)。UTXO指令碼不能為賬戶的取款額度提供精細的的控制。例如,預言機合約(oracle contract)的一個強大應用是對衝合約,A和B各自向對衝合約中傳送價值1000美元的比特幣,30天以後,指令碼向A傳送價值1000美元的比特幣,向B傳送剩餘的比特幣。雖然實現對衝合約需要一個預言機(oracle)決定一比特幣值多少美元,但是與現在完全中心化的解決方案相比,這一機制已經在減少信任和基礎設施方面有了巨大的進步。然而,因為UTXO是不可分割的,為實現此合約,唯一的方法是非常低效地採用許多有不同面值的UTXO(例如對應於最大為30的每個k,有一個2^k的UTXO)並使預言機挑出正確的UTXO傳送給A和B。
(3)缺少狀態 – UTXO只能是已花費或者未花費狀態,這就沒有給需要任何其它內部狀態的多階段合約或者指令碼留出生存空間。這使得實現多階段期權合約、去中心化的交換要約或者兩階段加密承諾協議(對確保計算獎勵非常必要)非常困難。這也意味著UTXO只能用於建立簡單的、一次性的合約,而不是例如去中心化組織這樣的有著更加複雜的狀態的合約,使得元協議難以實現。二元狀態與價值盲結合在一起意味著另一個重要的應用-取款限額-是不可能實現的。
(4)區塊鏈盲(Blockchain-blindness)- UTXO看不到區塊鏈的資料,例如隨機數和上一個區塊的雜湊。這一缺陷剝奪了指令碼語言所擁有的基於隨機性的潛在價值,嚴重地限制了博彩等其它領域應用。
我們已經考察了在密碼學貨幣上建立高階應用的三種方法:建立一個新的區塊鏈,在比特幣區塊鏈上使用指令碼,在比特幣區塊鏈上建立元幣協議。建立新區塊鏈的方法可以自由地實現任意的特性,成本是開發時間和培育努力。使用指令碼的方法非常容易實現和標準化,但是它的能力有限。元幣協議儘管非常容易實現,但是存在擴充套件性差的缺陷。在以太坊系統中,我們的目的是建立一個能夠同時具有這三種模式的所有優勢的通用框架。
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 區塊鏈2.0以太坊漫談(2)區塊鏈
- 區塊鏈2.0以太坊漫談(3)區塊鏈
- 區塊鏈2.0以太坊漫談(4)區塊鏈
- 區塊鏈 2.0 :以太坊(九)區塊鏈
- 區塊鏈2.0架構:以太坊區塊鏈的介紹區塊鏈架構
- 區塊鏈2.0以太坊環境搭建區塊鏈
- 漫畫區塊鏈區塊鏈
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- 區塊鏈技術公司談以色用區塊鏈改善網路安全區塊鏈
- 016 | 漫談區塊鏈共識機制區塊鏈
- 區塊鏈2.0以太坊編輯器atom配置詳解區塊鏈
- 區塊鏈 2.0:房地產區塊鏈(四)區塊鏈
- 區塊鏈之以太坊初探區塊鏈
- 區塊鏈2.0以太坊錢包編譯詳解+連線私有鏈+修改區塊鏈編譯
- 區塊鏈2.0以太坊配置solidity編譯器sublime詳解區塊鏈Solid編譯
- 漫畫 | 什麼是區塊鏈?區塊鏈
- 區塊鏈 2.0:公有鏈與私有鏈(七)區塊鏈
- 區塊鏈系列1-區塊鏈概述區塊鏈
- 區塊鏈 2.0:介紹(一)區塊鏈
- 區塊鏈2.0:智慧合約區塊鏈
- 區塊鏈V神:以太坊2.0演算法Rollup的不完整指南區塊鏈演算法
- 漫談分散式系統、拜占庭將軍問題與區塊鏈分散式區塊鏈
- 區塊鏈公司談區塊鏈技術最新應用區塊鏈
- 區塊鏈技術公司談當婚姻遇到區塊鏈區塊鏈
- 區塊鏈安全 - 以太坊短地址攻擊區塊鏈
- 區塊鏈安全————以太坊短地址攻擊區塊鏈
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 以太坊及區塊鏈 程式資源整合區塊鏈
- 區塊鏈公司暢談區塊鏈技術的價值區塊鏈
- 區塊鏈開發公司談區塊鏈的應用場景區塊鏈
- 如何招聘面試區塊鏈以太坊開發人才面試區塊鏈
- 區塊鏈技術術語表 - 以太坊篇區塊鏈
- 區塊鏈 2.0:Hyperledger Fabric 介紹(十)區塊鏈
- 區塊鏈記錄_1區塊鏈
- 談談今年很火的區塊鏈 CDN區塊鏈
- 區塊鏈技術開發公司談區塊鏈保險的特點區塊鏈
- 區塊鏈搭建開發公司談分散式記賬與區塊鏈區塊鏈分散式
- 區塊鏈技術開發公司談區塊鏈如何良性發展區塊鏈