挑戰者:EOS.IO

EOS.IO是類似於以太坊(Ethereum)的區塊鏈基礎設施,一個能夠為開發者提供去中心化的應用(DAPPS)的開發平臺。但是同以太坊相比,EOS.IO有著許多不同的特性,例如在共識機制、吞吐量(EOS.IO的TPS號稱能達到百萬級別,相比之下以太坊只有25,比特幣只有7)、token設定以及資源管理方面都不一樣,也正是這些特性使得EOS吸引了市場的關注。

一、共識機制

(一)DPoS

EOS.IO採用的是股份授權證明機制(Delegated Proof of Stake,DPoS)。這種共識機制避免了在工作量證明(Proof of Work)中產生的“軍備競賽”而浪費大量資源的情況,同時也能夠克服權益證明(Proof of Stake)中缺失客觀性、抗攻擊能力較弱的劣勢[關於工作證明機制與權益證明機制的優劣勢對比,有興趣的讀者可以閱讀BitFury Group的報告“Proof of Stake versus Proof of Work”]。

基於這種算法,持股人(持有區塊鏈代幣的用戶)可以通過投票系統選擇區塊生產者,而區塊生產者可以是任何願意參與的用戶。對於區塊生產者而言,他們可以通過生產區塊而獲得收益(挖礦獎勵)。而可能存在的表現較差或者惡意的區塊生產者(如同時在多條鏈上生產區塊等行為),他們則面臨著被投票移除區塊生產者候選範圍的可能,這樣的懲罰機制減少了其作惡動機。由於任何持有代幣的用戶都擁有投票權,因而這種去中心化的持股人機制自然導致了區塊生成的去中心化。

而對於持股人來說,他們會出於自身利益的考慮,選擇可靠的區塊生產者。因為從短期來看,他們能夠從區塊生產者中獲得區塊生成分紅。並且持股人在投票後其股份具有一段時間的鎖定期,也就是說在一段時間內持股人的代幣無法被使用,只有當一定數量的區塊生產出來後,他們才能拿回自己的代幣。長期來看,持股人手中的代幣的價值取決於整個網絡的價值,良好的網絡運行、可靠的安全環境自然會提升交易量,增加代幣價值。

具體來說,在EOS.IO系統中,每3秒生成一個新的區塊,每一輪中包含21區塊。在一輪結束後,持股人通過投票選取出21個區塊生產者,其中前20位生產者由持股人投票選出,最後1位由前20位區塊生成者投票選出。隨後,利用從區塊中提取的時間作為偽隨機數,將21位區塊生產者的生成順序打亂。打亂順序的做法能夠幫助網絡更加平穩的運行,並且減少惡意生產者之間合作破壞共識的可能性[順序不變的情況下,可能會出現生產者B在每輪生產過程中否定生產者A生成的區塊,因而可能會產生區塊間隔]。

值得注意的一點是,在EOS.IO區塊鏈中,存在著區塊生產者沒有按照規定在特定時間產生新區塊的可能性。如果這樣的情況發生,那麼區塊鏈就會產生一個間隔(6秒),如果有更多的區塊丟失,那麼這個間隔將更大。為了維持區塊鏈的正常運行,如果一個區塊生產者在過去的24小時都沒有生產區塊,那麼這個區塊生產者就有被移除候選名單的可能。但是這個移除僅是暫時的,如果區塊生成者有重新活躍的跡象,那麼就可以繼續進入候選名單。這種“懲罰”機制的設置是為了通過最小化區塊缺口而確保網絡操作的穩定性。

正常情況下,由於區塊生產者之間相互合作,不存在競爭行為,DPoS機制中不會產生分叉。即使由於某種特殊情況產生了分叉,區塊生產者也能夠通過合作馬上切換到最長鏈上繼續作業。而對於惡意的區塊生產者,其在區塊鏈上留下的操作痕跡[Cryptographic evidence]也能夠作為證據,從而將其移除生產者候選名單。

(二)交易確認

交易信息被區塊生成者打包生產區塊後,向其他節點廣播後,經過其他區塊生成者的同意,便能夠得到正式確認。正常情況下,一項交易信息的廣播花費時間為1.5秒,能夠得到確認的可能性達到99.9%[源自白皮書]。

考慮到在現實世界中存在的網絡阻塞、軟件bug等問題的存在,用戶的交易信息可能無法在預計時間內得到確認。為了保證交易的不可逆轉性,用戶可以等待交易信息所在區塊受到超過21位區塊生產者中的15位的確認。在EOS.IO軟件的正常配置情況下,這個過程通常需要45秒。對於可能存在分叉鏈上的用戶,系統可以在分叉產生9秒後警告用戶其正處於分叉鏈上。如果連續丟失了2個區塊,那麼用戶處於分叉鏈的概率為95%,連續丟失3個區塊這個概率能夠上升到99%。

除此之外,每一筆交易信息中還包含其上一區塊頭部的哈希值,這麼做的目的有兩個:一是由於每一個區塊頭部的哈希值都是不同的,這樣防止了處於分叉鏈上的交易信息又重新加入到主鏈;二是能夠告知整個網絡持股人以及其股份的位置(分叉鏈或是主鏈)。

二、指令機

EOS.IO的技術設定與現存的其他區塊鏈技術還有一個很大的不同點:區塊中儲存的不是“狀態”,而是“指令”[Message,這裡翻譯成指令更能體現message在區塊鏈中的作用]。一般來說,一個系統或者軟件的架構對於數據的儲存有兩種選擇,一種是儲存狀態(狀態機,Machine of State);另一種是儲存指令(指令機,Machine of Massage)。狀態機注重的是對於狀態的記錄,例如在比特幣中,比特幣區塊所記錄的內容就是未花費的交易輸出(Unspent Transaction Outputs),是對用戶賬戶餘額記錄的狀態。而指令機則關注於其對應的輸出是如何獲得的。一個非常簡單例子是鍵盤,對於鍵盤上的任意鍵的敲擊就能得到相對應的輸出,而對於狀態並沒有任何記錄。狀態機的優點之一是重新恢復到某個狀態的速度較快;而指令機的優點之一是由指令獲得輸出的速度較快,另外一個優點是一個指令的出發可以按照預先設計觸發其他指令,因而不同指令之間可以相互組合產生多‘米諾骨牌效應’。

EOS.IO在區塊中儲存的正是指令,這麼做有助於提高區塊鏈在速度上的表現,能夠顯著增加每秒處理的交易數量。舉一個簡單的例子,假設現在有一群用戶正在就某項資產進行報價交易。對於狀態機而言,由於區塊中儲存的是狀態,因而在進入區塊之前,不同的用戶報價需要就價格和數量進行協商(輸入),而後得到不同用戶的賬戶餘額(輸出)。只有在這樣的狀態得到確認後,區塊才能夠記錄然後公佈信息。但是對於指令機而言,由於區塊中的輸入是指令,那麼不同的用戶的出售或是購入的報價單可以直接作為指令記錄到區塊中,然後在區塊中組合成一個訂單,將買賣雙方進行匹配得到輸出。這樣便產生兩個主要的優勢,一個區塊中的指令與整體的“指令集合”之間的關係是獨立的,兩者之間依存關係並不大,增加或減少一個指令對於整體而言並不需要重新計算或匹配。但是在狀態機中,單個指令都必須是“指令集合”的整體狀態的一部分,改變其中的一個指令意味著當前狀態的改變,因而需要重新計算匹配以得到一個新的狀態,然後才能夠放入區塊中進行處理。第二個優勢是對於用戶而言,正如上面說到的,只需要將自己的指令提交,並不需要與交易的另一方實現就數量價格等交易細節內容進行協商,二者達成一致後再放入區塊中廣播。

三、平行線程結構

EOS.IO的設計目的之一就是為了解決單位時間內處理交易數量的能力。而平行的線程結構是其能實現巨大吞吐量的原因之一。

在介紹平行結構之前,首先介紹區塊鏈中制約交易數量處理能力的一種情形。用轉賬作為例子,假設Alice賬戶中某種資產的餘額為100,Bob的餘額為0,Cindy的餘額也為0。現在三人進行交易,Alice需要轉賬100給Bob,而Bob需要轉賬100給Cindy。那麼這三人之間的交易便由兩個過程組成:Alice向Bob轉賬,Bob向Cindy轉賬。但是在Alice完成轉賬之前,由於Bob還未收到Alice的支付,其賬戶餘額為0,也就不能向Cindy進行轉賬。因而這三人的交易在區塊鏈中的實現過程是首先在一個區塊中完成確認第一筆轉賬,即Alice向Bob轉賬,之後等待第二個區塊生成時,再對Bob向Cindy轉賬進行確認。這樣的處理方式需要等待兩個區塊生成之間的間隔。

而這個背後的原因是,對於每個賬戶來說,一個區塊中對單個賬戶的操作只能夠進行1次轉入(deposit)或者轉出(withdraw)。但是如果我們重新定義區塊中對賬戶的轉入或轉出次數的限制,將其擴大為2次甚至3次,也就是允許每個區塊中對同一個賬戶進行2次以上的交易操作,那麼上面的那個轉賬的例子中,兩次操作就可以同時進行,並且在一個區塊中得到確認。

挑戰者:EOS.IO

圖1 EOS.IO中的單個區塊結構

這樣的思路在EOS.IO中的具體實現方式為:在EOS.IO的結構中,將區塊細分為了4個層次,分別是循環、線程、交易、指令。其具體的結構關係如圖1所示。區塊內部的四個層次中,真正實現平行處理的層次是線程;而其他的三個層次:循環、交易和指令都是按照先後順序排序的(即執行時必須按照時間順序進行)。從最底層開始,用戶之間通過互相發送接受指令(message)來進行交易,隨後交易進入線程中進行處理,在一個循環中處理完的交易信息有兩個選擇,一是進入當前區塊中的下一個循環,二是等待進入下一個區塊。在同一個循環內的不同線程中,不允許對同一個賬戶進行多線程處理。但是對於在不同循環中的不同線程來說,其處理的交易可以是同一個賬戶的。

再回到之前的轉賬的例子,如果利用這種平行式的處理結構,那麼兩筆交易就可以同時進行,在一個區塊中完成確認第一筆轉賬後,不需要再等待下一個區塊的生產對第二筆轉賬進行確認。首先在同一個區塊中,其中一個循環的一個線程對Alice向Bob轉賬進行處理,而在另外一個循環中可以對Bob向Cindy轉賬進行處理。這裡就對Bob的賬戶的轉入或者轉出的限制放鬆為2次,因為在一個循環中對Bob的賬戶進行轉入,而在另一個循環中對Bob的賬戶進行轉出。這些都是發生在同一個區塊中的,隨後等到區塊生成時,交易也得到了確認,得到最終的結果:Alice的賬戶餘額為0,Bob的餘額也為0,而Cindy的餘額為100。

一個區塊中的循環數量由區塊的大小決定,區塊生產者在生產區塊時會持續增加一個區塊中的循環數量,直到達到上限。通過靜態分析的方式,能夠檢驗同一個區塊中的不同循環內部是交易是否是相互獨立的,即是否存在對一個賬戶的多次處理情況。只要不出現這種情況,那麼區塊內部多線程的平行處理就是可行的。

四、代幣以及資源

(一)代幣

EOS.IO中的代幣為EOS,發行總量為10億枚。根據官方的說法,EOS對於不同的用戶(包括開發者以及區塊生產者)有著不同的用途。其主要的作用就是可以憑藉EOS代幣使用EOS.IO區塊鏈網絡中的資源,如帶寬(bandwidth)、內存(RAM)等,下面將一一介紹。

(二)資源

1、帶寬

帶寬資源是區塊鏈系統內部資源,可用於對應用程序的使用、維護等。帶寬資源的分配是由EOS的數量決定的,用戶擁有的EOS的數量對EOS總數量的佔比就是用戶能夠分配到的帶寬資源的最小佔比。如果其他用戶並沒有使用其分配到的帶寬資源,那麼其他用戶就能夠暫時使用比自己佔比更多的帶寬。具體的使用辦法為,用戶將自己的EOS代幣作為保證金轉入到“份額合約(staking contract)”中,隨後便能夠使用對應數量的帶寬資源。在用戶不再需要或者想要減少使用的帶寬量時,用戶可以選擇退回自己的代幣保證金。要注意的一點是,為了防止帶寬資源的浪費,用戶在贖回自己的代幣保證金時,贖回過程會有3天的延遲。對於擁有代幣但是自己不需要,或者暫時不需要使用帶寬資源的用戶,用戶可以將自己的份額租給其他用戶,並獲得相應的回報。

2、內存

內存作為智能合約的儲存庫,將當前狀態下的所有智能合約儲存起來,以便於未來的讀取。內存資源的使用與帶寬類似,不同的一點是,對於想要取消或者減少使用的內存的用戶,贖回代幣保證金沒有延遲,用戶隨時可以立刻取回自己的代幣。

3、存儲空間

存儲空間是由區塊生產者決定的,用於儲存平臺上的應用程序的信息,對於普通用戶節點來說,用戶可以通過訪問儲存空間來獲得相應的數據。因而儲存空間必須是可隨時訪問的。

4、投票權

投票權在區塊鏈生態發生某些戰略性的變化,以及用於區塊鏈系統的治理時使用,如系統的升級、對於潛在的分叉的治理等。根據用戶所擁有的EOS代幣的份額,給予用戶一定分量的投票權。而投票權對於用戶“繳納”的代幣保證金有著更久的凍結時間:六個月。

(三)價格獨立

不同的用戶對於EOS.IO生態中的資源的需求是不同的。例如,對於去中心化應用的開發者來說,由於維持運行應用的需要,他們對於帶寬、內存的需求更高;而對於持有大量EOS代幣的用戶來說,他們可能更注重整個區塊鏈系統的發展方向,更注重於對於區塊鏈系統治理的投票權。由於這些目的的不同,為了避免某種資產在短時間內的需求過高,而提升其他資源的使用成本的情況(比如當系統需要升級時,投票權的需求大大增加,對代幣需求的增加可能會推高其他資源的使用成本,而不利於普通應用提供服務以及使用),EOS.IO中各種資源的價格都是相互獨立的,這一點由其內部算法保證[關於這一點的具體技術實現細節還有待披露]。

除了獨立的價格之外,有些資源的價格(如內存)並不是隨著用量成比例增加。也就是說,對於某些可能需要加倍自己的資源使用量的用戶,他們為加倍資源所付的成本可能是原來成本的3倍或者更多。這樣設計的目的是考慮到對於正常的用戶來說,維持他們日常使用的資源需求量並不是很大,並且短期內大量增加需求的可能性也比較小,因而這樣設計能夠將區塊鏈的資源以更低的價格分配給更多的用戶。

(四)拒絕服務器攻擊

拒絕服務器攻擊是網絡上最常見的一種攻擊形式之一,指攻擊者大量佔用、浪費目標的系統、帶寬資源,並可能超出其承受範圍,使得目標網絡癱瘓或不再有能力為其原本目標用戶提供服務。用一個簡單的例子解釋,如果攻擊者想要對網絡售票網站進行拒絕服務器攻擊,那麼攻擊者就可以對網站進行大量攻擊訪問,佔用帶寬資源,浪費售票網站服務器處理能力。這樣可能就會使得正常用戶無法使用網絡售票網站購票。

這種攻擊在區塊鏈網絡中也非常常見,除了惡意攻擊之外,造成區塊鏈網絡擁堵,從而無法正常為用戶提供服務的原因還有兩個。一個是區塊鏈平臺每秒能夠處理的交易數量本身就較低,因而在流量高峰時就容易造成擁堵;第二個原因普遍存在於所有要收取交易費用的區塊鏈平臺。由於交易費用的存在,區塊生產者普遍更樂意於處理交易費用高的交易,而許多交易費用低或者並非支付交易費用的交易就得不到處理,這就使得外部攻擊者能夠利用這一點對區塊鏈網絡進行攻擊。關於這一點我們在上一篇文章中已經做過解釋。EOS.IO應對這一點的處理辦法如同上面在帶寬資源中說到的,對於持有一定數量EOS代幣數量的用戶,區塊鏈系統能夠保證給予用戶資源的底線。也就是說即使是在高峰期,用戶也依然能夠使用到他們被保證的最低資源量。

五、治理

在EOS.IO中對於治理的方式包括凍結用戶賬戶、強制改變用戶賬戶密碼等。除了對用戶賬戶的管理,EOS.IO中還存在一部“憲法(Constitution)”,這部“憲法”指使用EOS.IO區塊鏈的所有用戶都必須遵從的義務。對於“憲法”的制定以及修改,EOS.IO有著一套規則,這裡簡單列幾條,有興趣的讀者可以閱讀其白皮書。

  • 區塊生產者提出修改意見並得到21個區塊生產者中的17個人的同意;
  • 在30天內,這些同意的區塊生產者不會改變主意;
  • 所有用戶的交易增加新“憲法”的哈希值簽名;
  • ……

EOS.IO中中“憲法”的意義除了制定用戶及交易都必須遵守的一套準則之外,還在於能夠對區塊鏈運行過程中出現的問題定性,出現的問題到底是一個算法中的bug還是平臺生態系統的理念問題,對於EOS.IO的長久生存有很大的幫助。


分享到:


相關文章: