區塊鏈2.0以太坊漫談(3)
進一步的應用:
(1)儲蓄錢包。 假設Alice想確保她的資金安全,但她擔心丟失或者被黑客盜走私鑰。她把以太幣放到和Bob簽訂的一個合約裡,如下所示,這合同是一個銀行:
(1)Alice單獨每天最多可提取1%的資金。
(2)Bob單獨每天最多可提取1%的資金,但Alice可以用她的私鑰建立一個交易取消Bob的提現許可權。
(3)Alice 和 Bob 一起可以任意提取資金。 一般來講,每天1%對Alice足夠了,如果Alice想提現更多她可以聯絡Bob尋求幫助。如果Alice的私鑰被盜,她可以立即找到Bob把她的資金轉移到一個新合同裡。如果她弄丟了她的私鑰,Bob可以慢慢地把錢提出。如果Bob表現出了惡意,她可以關掉他的提現許可權。
(2)作物保險。一個人可以很容易地以天氣情況而不是任何價格指數作為資料輸入來建立一個金融衍生品合約。如果一個愛荷華的農民購買了一個基於愛荷華的降雨情況進行反向賠付的金融衍生品,那麼如果遇到乾旱,該農民將自動地收到賠付資金而如果有足量的降雨他會很開心因為他的作物收成會很好。
(3)一個去中心化的資料釋出器。 對於基於差異的金融合約,事實上通過過“謝林點”協議將資料釋出器去中心化是可能的。謝林點的工作原理如下:N方為某個指定的資料提供輸入值到系統(例如ETH/USD價格),所有的值被排序,每個提供25%到75%之間的值的節點都會獲得獎勵,每個人都有激勵去提供他人將提供的答案,大量玩家可以真正同意的答案明顯預設就是正確答案,這構造了一個可以在理論上提供很多數值,包括ETH/USD價格,柏林的溫度甚至某個特別困難的計算的結果的去中心化協議。
(4)雲端計算。EVM技術還可被用來建立一個可驗證的計算環境,允許使用者邀請他人進行計算然後選擇性地要求提供在一定的隨機選擇的檢查點上計算被正確完成的證據。這使得建立一個任何使用者都可以用他們的桌上型電腦,膝上型電腦或者專用伺服器參與的雲端計算市場成為可能,現場檢查和安全保證金可以被用來確保系統是值得信任的(即沒有節點可以因欺騙獲利)。雖然這樣一個系統可能並不適用所有任務;例如,需要高階程式間通訊的任務就不易在一個大的節點雲上完成。然而一些其它的任務就很容易實現並行;基因演算法這樣的專案就很容易在這樣的平臺上進行。
(5)點對點賭博。任意數量的點對點賭博協議都可以搬到以太坊的區塊鏈上,例如Frank Stajano和Richard Clayton的Cyberdice。 最簡單的賭博協議事實上是這樣一個簡單的合約,它用來賭下一個區塊的哈稀值與猜測值之間的差額, 據此可以建立更復雜的賭博協議,以實現近乎零費用和無欺騙的賭博服務。
(6)預測市場。 不管是有神諭還是有謝林幣,預測市場都會很容易實現,帶有謝林幣的預測市場可能會被證明是第一個主流的作為去中心化組織管理協議的“futarchy”應用。
(7)鏈上去中心化市場,以身份和信譽系統為基礎。
其他雜項:
改進版幽靈協議的實施:
“幽靈“協議("Greedy Heaviest Observed Subtree"(GHOST) protocol)是由Yonatan Sompolinsky 和 Aviv Zohar在2013年12月引入的創新。幽靈協議提出的動機是當前快速確認的塊鏈因為區塊的高作廢率而受到低安全性困擾;因為區塊需要花一定時間(設為t)擴散至全網,如果礦工A挖出了一個區塊然後礦工B碰巧在A的區塊擴散至B之前挖出了另外一個區塊,礦工B的區塊就會作廢並且沒有對網路安全作出貢獻。此外,這裡還有中心化問題:如果A是一個擁有全網30%算力的礦池而B擁有10%的算力,A將面臨70%的時間都在產生作廢區塊的風險而B在90%的時間裡都在產生作廢區塊。因此,如果作廢率高,A將簡單地因為更高的算力份額而更有效率,綜合這兩個因素,區塊產生速度快的塊鏈很可能導致一個礦池擁有實際上能夠控制挖礦過程的算力份額。
正如Sompolinsky 和 Zohar所描述的,通過在計算哪條鏈“最長”的時候把廢區塊也包含進來,幽靈協議解決了降低網路安全性的第一個問題;這就是說,不僅一個區塊的父區塊和更早的祖先塊,祖先塊的作廢的後代區塊(以太坊術語中稱之為“叔區塊”)也被加進來以計算哪一個區塊擁有支援其的最大工作量證明。我們超越了Sompolinsky 和 Zohar所描述的協議以解決第二個問題 – 中心化傾向,以太坊付給以“叔區塊”身份為新塊確認作出貢獻的廢區塊87.5%的獎勵,把它們納入計算的“侄子區塊”將獲得獎勵的12.5%,不過,交易費用不獎勵給叔區塊。 以太坊實施了一個只下探到第五層的簡化版本的幽靈協議。其特點是,廢區塊只能以叔區塊的身份被其父母的第二代至第五代後輩區塊,而不是更遠關係的後輩區塊(例如父母區塊的第六代後輩區塊,或祖父區塊的第三代後輩區塊)納入計算。這樣做有幾個原因。首先,無條件的幽靈協議將給計算給定區塊的哪一個叔區塊合法帶來過多的複雜性。其次,帶有以太坊所使用的補償的無條件的幽靈協議剝奪了礦工在主鏈而不是一個公開攻擊者的鏈上挖礦的激勵。最後,計算表明帶有激勵的五層幽靈協議即使在出塊時間為15s的情況下也實現了了95%以上的效率,而擁有25%算力的礦工從中心化得到的益處小於3%
費用。
因為每個釋出的到區塊鏈的交易都佔用了下載和驗證的成本,需要有一個包括交易費的規範機制來防範濫發交易。比特幣使用的預設方法是純自願的交易費用,依靠礦工擔當守門人並設定動態的最低費用。因為這種方法是“基於市場的”,使得礦工和交易傳送者能夠按供需來決定價格,所以這種方法在比特幣社群被很順利地接受了。然而,這個邏輯的問題在於,交易處理並非一個市場;雖然根據直覺把交易處理解釋成礦工給傳送者提供的服務是很有吸引力的,但事實上一個礦工收錄的交易是需要網路中每個節點處理的,所以交易處理中最大部分的成本是由第三方而不是決定是否收錄交易的礦工承擔的。於是,非常有可能發生公地悲劇。
然而,當給出一個特殊的不夠精確的簡化假設時,這個基於市場的機制的漏洞很神奇地消除了自己的影響。論證如下。假設:
- 一個交易帶來 k 步操作, 提供獎勵 kR給任何收錄該交易的礦工,這裡 R 由交易釋出者設定, k 和 R 對於礦工都是事先(大致上)可見的。
- 每個節點處理每步操作的成本都是 C (即所有節點的效率一致)。
- 有 N 個挖礦節點,每個算力一致(即全網算力的1/N)。
- 沒有不挖礦的全節點。
當預期獎勵大於成本時,礦工願意挖礦。這樣,因為礦工有1/N 的機會處理下一個區塊,所以預期的收益是 kR/N , 礦工的處理成本簡單為 kC. 這樣當 kR/N > kC, 即 R > NC時。礦工願意收錄交易。注意 R 是由交易傳送者提供的每步費用,是礦工從處理交易中獲益的下限。 NC 是全網處理一個操作的成本。所以,礦工僅有動機去收錄那些收益大於成本的交易。 然而,這些假設與實際情況有幾點重要的偏離:
- 因為額外的驗證時間延遲了塊的廣播因而增加了塊成為廢塊的機會,處理交易的礦工比其它的驗證節點付出了更高的成本。
- 不挖礦的全節點是存在的。
- 實踐中算力分佈可能最後是極端不平均的。
以破壞網路為己任的投機者,政敵和瘋子確實存在,並且他們能夠聰明地設定合同使得他們的成本比其它驗證節點低得多。 上面第1點驅使礦工收錄更少的交易,第2點增加了 NC; 因此這兩點的影響至少部分互相抵消了. 第3點和第4點是主要問題;作為解決方案我們簡單地建立了一個浮動的上限:沒有區塊能夠包含比BLK_LIMIT_FACTOR 倍長期指數移動平均值更多的運算元。具體地:
BLK_LIMIT_FACTOR和 EMA_FACTOR 是暫且被設為 65536 和 1.5 的常數,但可能會更深入的分析。
計算和圖靈完備:
需要強調的是以太坊虛擬機器是圖靈完備的; 這意味著EVM程式碼可以實現任何可以想象的計算,包括無限迴圈。EVM程式碼有兩種方式實現迴圈。首先, JUMP 指令可以讓程式跳回至程式碼前面某處,還有允許如 while x < 27: x = x * 2 一樣的條件語句的JUMPI 指令實現條件跳轉。其次,合約可以呼叫其它合約,有通過遞迴實現迴圈的潛力。這很自然地導致了一個問題:惡意使用者能夠通過迫使礦工和全節點進入無限迴圈而不得不關機嗎? 這問題出現是因為電腦科學中一個叫停機問題的問題:一般意義上沒有辦法知道,一個給定的程式是否能在有限的時間內結束執行。
正如在狀態轉換章節所述,我們的方案通過為每一個交易設定執行執行的最大計算步數來解決問題,如果超過則計算被恢復原狀但依然要支付費用。訊息以同樣的方式工作。為顯示這一方案背後的動機,請考慮下面的例子:
(1)一個攻擊者建立了一個執行無限迴圈的合約,然後傳送了一個啟用迴圈的交易給礦工,礦工將處理交易,執行無限迴圈直到瓦斯耗盡。即使瓦斯耗盡交易半途停止,交易依然正確(回到原處)並且礦工依然從攻擊者哪裡掙到了每一步計算的費用。
(2)一個攻擊者建立一個非常長的無限迴圈意圖迫使礦工長時間內一直計算致使在計算結束前若干區塊已經產生於是礦工無法收錄交易以賺取費 用。然而,攻擊者需要釋出一個 STARTGAS 值以限制可執行步數,因而礦工將提前知道計算將耗費過多的步數。
(3)一個攻擊者看到一個包含諸如 send(A,self.storage); self.storage = 0格式的合約然後傳送帶有隻夠執行第一步的費用的而不夠執行第二步的交易(即提現但不減少賬戶餘額)。合約作者無需擔心防衛類似攻擊,因為如果執行中途停止則所有變更都被回覆。
(4)一個金融合約靠提取九個專用資料釋出器的中值來工作以最小化風險,一個攻擊者接管了其中一個資料提供器,然後把這個按DAO章節所述的可變地址呼叫機制設計成可更改的資料提供器轉為執行一個無限迴圈,以求嘗試逼迫任何從此金融合約索要資金的嘗試都會因瓦斯耗盡而中止。然而,該金融合約可以在訊息裡設定瓦斯限制以防範此類問題。 圖靈完備的替代是圖靈不完備,這裡 JUMP 和 JUMPI 指令不存在並且在某個給定時間每個合約只允許有一個拷貝存在於呼叫堆疊內。在這樣的系統裡,上述的費用系統和圍繞我們的方案的效率的不確定性可能都是不需要的,因為執行一個合約的成本將被它的大小決定。
此外,圖靈不完備甚至不是一個大的限制,在我們內部設想的所有合約例子中,至今只有一個需要迴圈,而且即使這迴圈也可以被26個單行程式碼段的重複所代替。考慮到圖靈完備帶來的嚴重的麻煩和有限的益處,為什麼不簡單地使用一種圖靈不完備語言呢?事實上圖靈不完備遠非一個簡潔的解決方案。為什麼?請考慮下面的合約:
現在,傳送一個這樣的交易給A,這樣,在51個交易中,我們有了一個需要花費2^50 步計算的合約,礦工可能嘗試通過為每一個合約維護一個最高可執行步數並且對於遞迴呼叫其它合約的合約計算可能執行步數從而預先檢測這樣的邏輯炸彈,但是這會使礦工禁止建立其它合約的合約(因為上面26個合約的建立和執行可以很容易地放入一個單獨合約內)。另外一個問題點是一個訊息的地址欄位是一個變數,所以通常來講可能甚至無法預先知道一個合約將要呼叫的另外一個合約是哪一個。
於是,最終我們有了一個驚人的結論:圖靈完備的管理驚人地容易,而在缺乏同樣的控制時圖靈不完備的管理驚人地困難,那為什麼不讓協議圖靈完備呢?
貨幣和發行:
以太坊網路包含自身的內建貨幣以太幣,以太幣扮演雙重角色,為各種數字資產交易提供主要的流動性,更重要的是提供了了支付交易費用的一種機制。為便利及避免將來的爭議期間(參見當前的mBTC/uBTC/聰的爭論),不同面值的名稱將被提前設定:
1: 偉
10^12: 薩博
10^15: 芬尼
10^18: 以太
這應該被當作是“元”和“分”或者“比特幣”和“聰”的概念的擴充套件版,在不遠的將來,我們期望“以太”被用作普通交易,“芬尼”用來進行微交易,“薩博”和“偉”用來進行關於費用和協議實施的討論。
發行模式如下:
(1)通過發售活動,以太幣將以每BTC 1337-2000以太的價格發售,一個旨在為以太坊組織籌資並且為開發者支付報酬的機制已經在其它一些密碼學貨幣平臺上成功使用。早期購買者會享受較大的折扣,發售所得的BTC將完全用來支付開發者和研究者的工資和懸賞,以及投入密碼學貨幣生態系統的專案。
(2)0.099x (x為發售總量)將被分配給BTC融資或其它的確定性融資成功之前參與開發的早期貢獻者,另外一個0.099x將分配給長期研究專案。
(3)自上線時起每年都將有0.26x(x為發售總量)被礦工挖出。
發行分解:
永久線性增長模型降低了在比特幣中出現的財富過於集中的風險,並且給予了活在當下和將來的人公平的機會去獲取貨幣,同時保持了對獲取和持有以太幣的激勵,因為長期來看“貨幣供應增長率”是趨於零的。我們還推斷,隨著時間流逝總會發生因為粗心和死亡等原因帶來的幣的遺失,假設幣的遺失是每年貨幣供應量的一個固定比例,則最終總的流通中的貨幣供應量會穩定在一個等於年貨幣發行量除以遺失率的值上(例如,當遺失率為1%時,當供應量達到30x時,每年有0.3x被挖出同時有0.3x丟失,達到一個均衡)。
除了線性的發行方式外,和比特幣一樣以太幣的的供應量增長率長期來看也趨於零。
挖礦的中心化:
比特幣挖礦演算法基本上是讓礦工千萬次地輕微改動區塊頭,直到最終某個節點的改動版本的雜湊小於目標值(目前是大約2190)。然而,這種挖礦演算法容易被兩種形式的中心化攻擊。第一種,挖礦生態系統被專門設計的因而在比特幣挖礦這一特殊任務上效率提高上千倍的ASICs(專用積體電路)和電腦晶片控制。這意味著比特幣挖礦不再是高度去中心化的和追求平等主義的,而是需要鉅額資本的有效參與。第二種,大部分比特幣礦工事實上不再在本地完成區塊驗證;而是依賴中心化的礦池提供區塊頭。這個問題可以說很嚴重:在本文寫作時,最大的兩個礦池間接地控制了大約全網50%的算力,雖然當一個礦池或聯合體嘗試51%攻擊時礦工可以轉換到其它礦池這一事實減輕了問題的嚴重性。
以太坊現在的目的是使用一個基於為每1000個隨機數隨機產生唯一雜湊的函式的挖礦演算法,用足夠寬的計算域,去除專用硬體的優勢。這樣的策略當然不會使中心化的收益減少為零,但是也不需要。注意每單個使用者使用他們的私人膝上型電腦或桌上型電腦就可以幾乎免費地完成一定量的挖礦活動,但當到了100%的CPU使用率之後更多地挖礦就會需要他們支付電力和硬體成本。ASIC挖礦公司需要從第一個雜湊開始就為電力和硬體支付成本。所以,如果中心化收益能夠保持在(E + H) /E 以下,那麼即使ASICs被製造出來普通礦工依然有生存空間。另外,我們計劃將挖礦演算法設計成挖礦需要訪問整個區塊鏈,迫使礦工儲存完成的區塊鏈或者至少能夠驗證每筆交易。這去除了對中心化礦池的需要;雖然礦池依然可以扮演平滑收益分配的隨機性的角色,但這功能可以被沒有中心化控制的P2P礦池完成地同樣好。這樣即使大部分普通使用者依然傾向選擇輕客戶端,通過增加網路中的全節點數量也有助於抵禦中心化。
擴充套件性:
擴充套件性問題是以太坊常被關注的地方,與比特幣一樣,以太坊也遭受著每個交易都需要網路中的每個節點處理這一困境的折磨。比特幣的當前區塊鏈大小約為20GB,以每小時1MB的速度增長。如果比特幣網路處理Visa級的2000tps的交易,它將以每三秒1MB的速度增長(1GB每小時,8TB每年)。以太坊可能也會經歷相似的甚至更糟的增長模式,因為在以太坊區塊鏈之上還有很多應用,而不是像比特幣只是簡單的貨幣,但以太坊全節點只需儲存狀態而不是完整的區塊鏈歷史這一事實讓情況得到了改善。
大區塊鏈的問題是中心化風險。如果塊鏈大小增加至比如100TB,可能的場景將是隻有非常小數目的大商家會執行全節點,而常規使用者使用輕的SPV節點。這會增加對全節點合夥欺詐牟利(例如更改區塊獎勵,給他們自己BTC)的風險的擔憂。輕節點將沒有辦法立刻檢測到這種欺詐。當然,至少可能存在一個誠實的全節點,並且幾個小時之後有關詐騙的資訊會通過Reddit這樣的渠道洩露,但這時已經太晚:任憑普通使用者做出怎樣的努力去廢除已經產生的區塊,他們都會遇到與發動一次成功的51%攻擊同等規模的巨大的不可行的協調問題。在比特幣這裡,現在這是一個問題,但Peter Todd建議的一個改動可以緩解這個問題。
近期,以太坊會使用兩個附加的策略以應對此問題。首先,因為基於區塊鏈的挖礦演算法,至少每個礦工會被迫成為一個全節點,這保證了一定數量的全節點。其次,更重要的是,處理完每筆交易後,我們會把一箇中間狀態樹的根包含進區塊鏈。即使區塊驗證是中心化的,只要有一個誠實的驗證節點存在,中心化的問題就可以通過一個驗證協議避免。如果一個礦工釋出了一個不正確的區塊,這區塊要麼是格式錯,要麼狀態S[n]是錯的。因為S[0]是正確的,必然有第一個錯誤狀態S[i]但S[i-1]是正確的,驗證節點將提供索引i,一起提供的還有處理APPLY(S[i-1],TX[i]) -> S[i]所需的帕特里夏樹節點的子集。這些節點將受命進行這部分計算,看產生的S[i]與先前提供的值是否一致。
另外,更復雜的是惡意礦工釋出不完整區塊進行攻擊,造成沒有足夠的資訊去確定區塊是否正確。解決方案是質疑-迴應協議:驗證節點對目標交易索引發起質疑,接受到質疑資訊的輕節點會對相應的區塊取消信任,直到另外一個礦工或者驗證者提供一個帕特里夏節點子集作為正確的證據。
綜述:去中心化應用
上述合約機制使得任何一個人能夠在一個虛擬機器上建立通過全網共識來執行命令列應用(從根本上來說是),它能夠更改一個全網可訪問的狀態作為它的“硬碟”。然而,對於多數人來說,用作交易傳送機制的命令列介面缺乏足夠的使用者友好使得去中心化成為有吸引力的替代方案。最後,一個完整的“去中心化應用”應該包括底層的商業邏輯元件【無論是否在以太坊完整實施,使用以太坊和其它系統組合(如一個P2P訊息層,其中一個正在計劃放入以太坊客戶端)或者僅有其它系統的方式】和上層的圖形使用者介面元件。以太坊客戶端被設計成一個網路瀏覽器,但包括對“eth”, Javascript API物件的支援,可被客戶端裡看到的特定的網頁用來與以太坊區塊鏈互動。從“傳統”網頁的角度看來,這些網頁是完全靜態的內容,因為區塊鏈和其它去中心化協議將完全代替伺服器來處理使用者發起的請求。最後,去中心化協議有希望自己利用某種方式使用以太坊來儲存網頁。
結論:
以太坊協議最初是作為一個通過高度通用的語言提供如鏈上契約,提現限制和金融合約,賭博市場等高階功能的升級版密碼學貨幣來構思的。以太坊協議將不直接“支援”任何應用,但圖靈完備程式語言的存在意味著理論上任意的合約都可以為任何交易型別和應用建立出來。然而關於以太坊更有趣的是,以太坊協議比單純的貨幣走得更遠,圍繞去中心化儲存,去中心化計算和去中心化預測市場以及數十個類似概念建立的協議和去中心化應用,有潛力從根本上提升計算行業的效率,並通過首次新增經濟層為其它的P2P協議提供有力支撐,最終,同樣會有大批與金錢毫無關係的應用出現。
以太坊協議實現的任意狀態轉換概念提供了一個具有獨特潛力的平臺;與封閉式的,為諸如資料儲存,賭博或金融等單一目的設計的協議不同,以太坊從設計上是開放式的,並且我們相信它極其適合作為基礎層服務於在將來的年份裡出現的極其大量的金融和非金融協議。
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 區塊鏈2.0以太坊漫談(1)區塊鏈
- 區塊鏈2.0以太坊漫談(2)區塊鏈
- 區塊鏈2.0以太坊漫談(4)區塊鏈
- 區塊鏈 2.0 :以太坊(九)區塊鏈
- 區塊鏈2.0以太坊環境搭建區塊鏈
- 區塊鏈2.0架構:以太坊區塊鏈的介紹區塊鏈架構
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- 區塊鏈之以太坊初探區塊鏈
- 區塊鏈2.0以太坊編輯器atom配置詳解區塊鏈
- 區塊鏈2.0以太坊配置solidity編譯器sublime詳解區塊鏈Solid編譯
- 區塊鏈2.0以太坊錢包編譯詳解+連線私有鏈+修改區塊鏈編譯
- 區塊鏈安全 - 以太坊短地址攻擊區塊鏈
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 區塊鏈安全————以太坊短地址攻擊區塊鏈
- 以太坊及區塊鏈 程式資源整合區塊鏈
- 區塊鏈V神:以太坊2.0演算法Rollup的不完整指南區塊鏈演算法
- 如何招聘面試區塊鏈以太坊開發人才面試區塊鏈
- 區塊鏈比較:以太坊 Cosmos Cardano EOS和Hyperledger區塊鏈
- 第6章 區塊鏈開發平臺:以太坊區塊鏈
- 使用truffle部署以太坊智慧合約到區塊鏈區塊鏈
- 以太坊創世區塊與鏈配置載入分析
- 以太坊·將資料寫入到區塊鏈中區塊鏈
- java使用spring boot和web3j開發以太坊區塊鏈dappJavaSpring BootWeb區塊鏈APP
- 016 | 漫談區塊鏈共識機制區塊鏈
- 以太坊原始碼分析(21)chain_indexer 區塊鏈索引原始碼AIIndex區塊鏈索引
- AWS推出以太坊和超級賬本區塊鏈模板區塊鏈
- python 通過 Web3.py 連線以太坊區塊鏈的幾種方式PythonWeb區塊鏈
- python 透過 Web3.py 連線以太坊區塊鏈的幾種方式PythonWeb區塊鏈
- 區塊鏈分散式賬本Fabric、Corda和以太坊比較區塊鏈分散式
- 區塊鏈之--2小時構建以太坊智慧合約區塊鏈
- 以太坊DApp開發入門教程——區塊鏈投票系統APP區塊鏈
- 漫畫區塊鏈區塊鏈
- 區塊鏈 2.0:房地產區塊鏈(四)區塊鏈
- 以太坊原始碼分析(8)區塊分析原始碼
- 加拿大政府機構建立以太坊區塊鏈瀏覽器區塊鏈瀏覽器
- 區塊鏈100講:淺析以太坊網路智慧合約原理區塊鏈
- 以太坊和比特幣區塊鏈的異同(一些QA)比特幣區塊鏈
- 【區塊鏈】實戰·以太坊智慧合約程式設計引導區塊鏈程式設計