TrueBit白皮書解讀 - 元家昕 - 簡書
以太坊可以被描述為一個使用區塊鏈的分散式全球計算機。它允許開發者把程式碼上傳到區塊鏈中,礦工共同執行並確保結果的正確性,作為報酬,開發者需要付出一定量的以太幣,稱為gas。以太坊通過全網驗證的辦法保證智慧合約的正確執行,保證了安全性,作為代價,需要付出大量的算力,驅動這麼一臺巨型機器,所需gas價值不菲。
TrueBit是區塊鏈鏈外擴容的方案之一,正如它的口號Fuel your imagination一樣,其設計初衷是解決以太坊智慧合約的gas限制。
TrueBit基本原理很簡單:
使用者上傳自己所需執行的程式碼,某個外包商代為執行並賺取佣金,其它人監督程式碼執行的正確性,以太坊通過智慧合約作為終極仲裁,獎善罰惡。造假者會獲得經濟懲罰,所以在絕大多數情況下,外包商會誠實的執行程式碼並提供正確的結果,鏈上節點無需完整驗證,從而大大減輕了鏈上的計算負擔,也就節省了使用者的gas消耗。
流程如下:
1. 使用者(下文稱為Task Giver)上傳需要執行的程式碼(下文成為任務),並提供佣金。 2.鏈外第三方(下文稱為Solver)發現這個任務,認為佣金可以接受,執行計算任務並答公示運算結果,同時提供一筆保證金。 3.另外的第三方驗證者(下文稱為 Verifier)重新執行任務,如果發現Solver造假,可以發起挑戰,同樣需要提供一筆保證金。 4.通過鏈上的智慧合約讓Solver和Verifier玩一個驗證遊戲( verification game),通過Task Giver在鏈上提供的執行程式碼驗證答案真偽,提供正確答案的一方獲取佣金,造假的一方從保證金中支付整個驗證過程所需的gas。 5.如果一段時間內沒有人能提供證據證明Solver造假,Solver獲得佣金。
注意在上述過程中,佣金可以設定成比正常在鏈上執行所需的gas少,保證金則至少設定為足以完整在鏈上執行該智慧合約。
如果你只是想了解一下TrueBit,閱讀到這裡就可以結束了。
如果你想知道TrueBit真正精妙之處,現在才剛剛開始。
在這個系統中,我們仍然需要解決兩個問題。
第一個問題被稱為驗證者困境,TrueBit設計的目標之一是要解決驗證者困境問題。
我們知道,pow挖礦會對出礦的礦工給予獎勵,而負責校驗的礦工則沒有任何收益。這在一般的交易場景下沒有問題,因為校驗礦工所付出的算力很有限。但是如果涉及到比較複雜的智慧合約,驗證礦工就面臨一個兩難的選擇:1.老老實實地完整執行指令碼會白白浪費寶貴的算力,在下一區塊的競爭中輸在了起跑線上;2.直接通過校驗並加到鏈上,節省了算力,但是有站錯隊的可能,在後續的競爭選擇了一個錯誤的跑道。
上述TrueBit流程裡,當Solver和Verifier發生爭執時,以太坊充當仲裁法庭的角色,鏈上需要重新執行使用者提供的智慧合約,此時,驗證礦工同樣面臨上述的兩難困境。
TrueBit採用的方法是計算分段,先把整個計算過程分成t段,定位出Solver和Verifier發生爭議的最早一段程式碼,那麼仲裁者只要執行這一段程式碼即可判別真偽,鏈上執行的計算可以減少為原來的1/t。
那麼,接下來的問題就是怎麼找到這段問題程式碼。TrueBit採用了分段查詢的辦法,我們舉個栗子說明:
1.Solver選擇C,把t段計算均勻分成C份,下圖中我們以C=5作為例子 2.Solver把引數C和每一段計算後的圖靈狀態雜湊後上鏈 3.Verifier根據C執行同樣的過程,比對雜湊,找到最早發生不一致的位置,比如說下圖的第四段 4.遞迴上述流程,經過log(t)/log©輪協商最終定位出問題點
通過上述方法,可以有效的減少發生爭議時的鏈上計算量,也就間接解決了礦工的驗證者困境問題,當然它付出的代價是需要更長的時間解決爭議。
第二個問題涉及到Verifier的生態設計
因為TrueBit的懲罰機制,絕大多數Solver都會提供正確的執行結果,這樣會導致一個結果就是Verifier無利可圖。Verifier在整個生態裡是保證安全性的重要一環,如果沒有人願意充當這個角色,會破壞整個系統的安全性。
為了保證生態,TrueBit設計了一個稱為累積獎金(jackpot)的機制。
基本原理就是,系統隨機選擇部分提案,要求Solver給出錯誤的答案(稱為forced error),當有Verifier提出挑戰時,Solver不會受到懲罰,而Verifier則會獲得Jackpot作為獎勵。
這個隨機選擇方法需要滿足下面幾個條件:
1.Task Giver不能在提交任務之前知道選擇的結果,防止人為刷獎勵 2.Solver不能在提交答案之前知道選擇結果,防止Solver偷懶跳過正確答案的計算 3.Verifier不能在發起挑戰前知道選擇結果,防止Verifier選擇性驗證
TrueBit給出的答案就是通過兩個因子來決定隨機選擇結果,一個因子是Solver選擇的私密隨機數,只有在被挑戰時才會公示,另一個是Solver提交答案後下一區塊的雜湊。通過後者,可以保證所有人在Solver提交答案前知道選擇結果,也就是上述1、2點,通過前者,可以保證上述第3點。
整個流程如下:
1.Task Giver建立任務 2.Solver執行計算,同時提供一個正確的答案和一個錯誤的答案,但不展示 3.兩個答案上鍊以後,Solver根據塊雜湊和手中的隨機數解籤兩個答案中的一個 3.Verifier校驗Solver提供的答案,並提出挑戰 4.Solver提供手上隨機數證明是系統“Forced error” 5.Verifier獲得Jackpot,Solver免受懲罰
Jackpot的資金來源於任務的佣金,從所有任務的佣金中抽取一部分放到獎金池子中,稱為稅收,每次中獎的Verifier獲取池子裡部分獎金。合理設定稅收和中獎比例,可以保證Verifier有利可圖,從而維持生態圈健康運作。稅收和中獎比例高,會增加Verifier的數量,提高系統安全性,但相應的,會損害Task Giver的積極性;反之,節省Task Giver成本的同時會降低系統整體安全,最終也是一個trade-off。