以太坊能夠被描述爲一個使用區塊鏈的分佈式全球計算機。它容許開發者把代碼上傳到區塊鏈中,礦工共同執行並確保結果的正確性,做爲報酬,開發者須要付出必定量的以太幣,稱爲gas。以太坊經過全網驗證的辦法保證智能合約的正確執行,保證了安全性,做爲代價,須要付出大量的算力,驅動這麼一臺巨型機器,所需gas價值不菲。安全
TrueBit是區塊鏈鏈外擴容的方案之一,正如它的口號Fuel your imagination同樣,其設計初衷是解決以太坊智能合約的gas限制。分佈式
TrueBit基本原理很簡單:區塊鏈
用戶上傳本身所需執行的代碼,某個外包商代爲執行並賺取佣金,其它人監督代碼執行的正確性,以太坊經過智能合約做爲終極仲裁,獎善罰惡。造假者會得到經濟懲罰,因此在絕大多數狀況下,外包商會誠實的執行代碼並提供正確的結果,鏈上節點無需完整驗證,從而大大減輕了鏈上的計算負擔,也就節省了用戶的gas消耗。設計
流程以下:3d
1. 用戶(下文稱爲Task Giver)上傳須要執行的代碼(下文成爲任務),並提供佣金。遞歸
2.鏈外第三方(下文稱爲Solver)發現這個任務,認爲佣金能夠接受,執行計算任務並答公示運算結果,同時提供一筆保證金。遊戲
3.另外的第三方驗證者(下文稱爲Verifier)從新執行任務,若是發現Solver造假,能夠發起挑戰,一樣須要提供一筆保證金。開發
4.經過鏈上的智能合約讓Solver和Verifier玩一個驗證遊戲(verification game),經過Task Giver在鏈上提供的執行代碼驗證答案真僞,提供正確答案的一方獲取佣金,造假的一方從保證金中支付整個驗證過程所需的gas。get
5.若是一段時間內沒有人能提供證據證實Solver造假,Solver得到佣金。it
注意在上述過程當中,佣金能夠設置成比正常在鏈上執行所需的gas少,保證金則至少設置爲足以完整在鏈上執行該智能合約。
若是你只是想了解一下TrueBit,閱讀到這裏就能夠結束了。
若是你想知道TrueBit真正精妙之處,如今纔剛剛開始。
在這個系統中,咱們仍然須要解決兩個問題。
第一個問題被稱爲驗證者困境,TrueBit設計的目標之一是要解決驗證者困境問題。
咱們知道,pow挖礦會對出礦的礦工給予獎勵,而負責校驗的礦工則沒有任何收益。這在通常的交易場景下沒有問題,由於校驗礦工所付出的算力頗有限。可是若是涉及到比較複雜的智能合約,驗證礦工就面臨一個兩難的選擇:
老老實實地完整執行腳本會白白浪費寶貴的算力,在下一區塊的競爭中輸在了起跑線上;
直接經過校驗並加到鏈上,節省了算力,可是有站錯隊的可能,在後續的競爭選擇了一個錯誤的跑道。
上述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(C)輪協商最終定位出問題點
經過上述方法,能夠有效的減小發生爭議時的鏈上計算量,也就間接解決了礦工的驗證者困境問題,固然它付出的代價是須要更長的時間解決爭議。
第二個問題涉及到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提交答案前知道選擇結果,也就是上述一、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。
本文來源:簡書
做者:元家昕
活動推薦:技術沙龍|百萬年薪招區塊鏈開發者,區塊鏈熱度什麼時候降溫?(免費報名)