區塊鏈技術:名詞解釋大全
作者(於文飛)長期致力於區塊鏈行業分析,新媒體傳播行業分析;在中國聯通、北大金融培訓班,區鏈財經私董會(清華大學深圳研究生院專場)等做過區塊鏈專場培訓,受到高度好評。
註:本連載省略了關於「數字代幣」部分的分析,直接從區塊鏈技術開始。
知識:區塊鏈技術的專用名詞解釋
區塊鏈是基於密碼學的一種分散式存儲方式的技術實現,它的意義在於可以保證信息流通過程的安全和可靠,但是區塊鏈並不是絕對完美的,它取決於幾個方面的限制:
1、區塊鏈自身規模的大小。拋開創世鏈自身的技術壁壘,鏈條節點越多的區塊鏈越安全,反之則並不安全。大家都知道,只要破解區塊鏈的51%的節點,既可以攻破區塊鏈的安全壁壘,所以說,只要黑客的收益大於成本,就有動力去破解。
2、公鑰與私鑰的安全問題。公鑰存在於鏈條過程中,相對與私鑰來講,和用戶的關係並沒有那麼緊密,但是私鑰一旦被黑客知道,區塊鏈的安全性甚至不如普通的社會誠信體系,因為區塊鏈的基因就是一對一的開放。當然,基於區塊鏈的信息流有可追溯性,但是這也是相對的安全,因為很難確定黑客的個人真實身份。
3、信息採集的初始數據的真實性。有時候,你很難保證採集數據的時候,被採集方給你的原始數據就是真實的,當然這並不屬於區塊鏈的範圍,但這卻是很重要的風險之一。
4、密碼學與演算法的制約。所有了解過區塊鏈的朋友可能都聽說過哈希密碼,管技術的問題我們不去討論,很多文章也有各種解釋,我們只探討一下,國內目前的密碼學演算法的技術有多高?區塊鏈之間的信任溝通需要在線交互,除了幾大牛逼的科技企業,又有多少團隊有這麼牛逼的技術或者資源?
5、參與者的目的性。任何新事物的發展都會引來投機者的攪局,區塊鏈技術也不會獨善其身。不良資產的參與會讓整個行業在短時間內飛速膨脹,就像豬吃了四月肥和瘦肉精一樣,看似華美的背後會是行業沒有健康積累的虛胖,最後必定是留下一地雞毛。
當然,很多朋友都想要了解這個行業,畢竟一個新的領域會帶來更多更好的機會,所以,要了解這個行業,就必須了解這個行業的很多術語,這樣你才能讀懂行業文檔,也才能更好的和行業人士交流。
下面這些專業術語是cooboys搜集整理自網路,這些內容是沒有加工過的網路文字摘抄。版權屬於網路作者。
圖靈完備:
一切可計算的問題都能計算,這樣的虛擬機或者編程語言就叫圖靈完備的。圖靈完備意味著你的語言可以做到能夠用圖靈機能做到的所有事情,可以解決所有的可計算問題。
圖靈不完備也不是沒有意義, 有些場景我們需要限制語言本身. 如限制循環和遞歸, 可以保證該語言能寫的程序一定是終止的。
理解一下,就是說圖靈完備的語言,有循環執行語句,判斷分支語句等。理論上能解決任何演算法。但有可能進入死循環而程序崩潰。
圖靈不完備,應該是不允許或限制循環。可以保證,每段程序都不會死循環,都有運行完的時候。
比特幣的腳本系統是圖靈不完備的,而一些競爭幣的智能合約系統是圖靈完備的。
各有優缺點,圖靈不完備會更安全些,圖靈完備會更智能些。
雖然圖靈機會受到存儲能力的物理限制,圖靈完全性通常指具有無限存儲能力的通用物理機器或編程語言。簡單來說,一切可計算的問題都能計算,這樣的虛擬機或者編程語言就叫圖靈完備的。
----------------------------------------------------------------------------
圖靈測試
1945年到1948年,圖靈在國家物理實驗室負責自動計算引擎(ACE)的研究工作。1949年,他成為曼徹斯特大學計算機實驗室的副主任,負責最早的真正的計算機---曼徹斯特一號的軟體工作。在這段時間,他繼續作一些比較抽象的研究,如「計算機械和智能」。圖靈在對人工智慧的研究中,提出了一個叫做圖靈測試(Turing test)的實驗,嘗試定出一個決定機器是否有感覺的標準。
1952年,圖靈寫了一個國際象棋程序。可是,當時沒有一台計算機有足夠的運算能力去執行這個程序,他就模仿計算機,每走一步要用半小時。他與一位同事下了一盤,結果程序輸了。
後來美國新墨西哥州洛斯阿拉莫斯國家實驗室的研究組根據圖靈的理論,在ENIAC上設計出世界上第一個電腦程序的國際象棋-洛斯阿拉莫斯國際象棋。
----------------------------------------------------------------------------
圖靈機(英語:Turing machine)
又稱確定型圖靈機,是英國數學家艾倫·圖靈於1936年提出的一種抽象計算模型,其更抽象的意義為一種數學邏輯機,可以看作等價於任何有限邏輯數學過程的終極強大邏輯機器。
所謂的圖靈機就是指一個抽象的機器,它有一條無限長的紙帶,紙帶分成了一個一個的小方格,每個方格有不同的顏色。有一個機器頭在紙帶上移來移去。機器頭有一組內部狀態,還有一些固定的程序。在每個時刻,機器頭都要從當前紙帶上讀入一個方格信息,然後結合自己的內部狀態查找程序表,根據程序輸出信息到紙帶方格上,並轉換自己的內部狀態,然後進行移動。
----------------------------------------------------------------------------
缺少圖靈完備性
這就是說,儘管比特幣腳本語言可以支持多種計算,但是它不能支持所有的計算。最主要的缺失是循環語句。不支持循環語句的目的是避免交易確認時出現無限循環。理論上,對於腳本程序員來說,這是可以克服的障礙,因為任何循環都可以用多次重複if 語句的方式來模擬,但是這樣做會導致腳本空間利用上的低效率,例如,實施一個替代的橢圓曲線簽名演算法可能將需要256次重複的乘法,而每次都需要單獨編碼。
----------------------------------------------------------------------------
價值盲(Value-blindness)。
UTXO腳本不能為賬戶的取款額度提供精細的的控制。例如,預言機合約(oracle contract)的一個強大應用是對沖合約,A和B各自向對沖合約中發送價值1000美元的比特幣,30天以後,腳本向A發送價值1000美元的比特幣,向B發送剩餘的比特幣。雖然實現對沖合約需要一個預言機(oracle)決定一比特幣值多少美元,但是與現在完全中心化的解決方案相比,這一機制已經在減少信任和基礎設施方面有了巨大的進步。然而,因為UTXO是不可分割的,為實現此合約,唯一的方法是非常低效地採用許多有不同面值的UTXO(例如對應於最大為30的每個k,有一個2^k的UTXO)並使預言機挑出正確的UTXO發送給A和B。
----------------------------------------------------------------------------
缺少狀態 :
UTXO只能是已花費或者未花費狀態,這就沒有給需要任何其它內部狀態的多階段合約或者腳本留出生存空間。這使得實現多階段期權合約、去中心化的交換要約或者兩階段加密承諾協議(對確保計算獎勵非常必要)非常困難。這也意味著UTXO只能用於建立簡單的、一次性的合約,而不是例如去中心化組織這樣的有著更加複雜的狀態的合約,使得元協議難以實現。二元狀態與價值盲結合在一起意味著另一個重要的應用-取款限額-是不可能實現的。
----------------------------------------------------------------------------
區塊鏈盲(Blockchain-blindness):
UTXO看不到區塊鏈的數據,例如隨機數和上一個區塊的哈希。這一缺陷剝奪了腳本語言所擁有的基於隨機性的潛在價值,嚴重地限制了博彩等其它領域應用。
----------------------------------------------------------------------------
智能合約 (Smart Contract):
智能合約是一種存在於區塊鏈上的程序。就如同區塊鏈上的分散式賬本一樣,智能合約也擁有去中心化、透明、不可篡改的特性,另外智能合約也跟一般錢包一樣,可以接受/發送虛擬貨幣,而執行的細節則可以在合約裡面定義。
比如說我今天發布了一個智能合約到區塊鏈上,裡面放了 1 ETH,並且撰寫程序代碼指定如果有人呼叫了 trade() 函式並且帶入 10 BAT (這是另外一種加密貨幣),我就把 1 ETH 跟他交換,這樣我就可以用 1 ETH 換得 10 BAT。
智能合約原理
重要的智能合約通常會公開其源碼讓所有人都可以檢視這份合約,確認其運作是否安全與合理。
當然智能合約還可以做很多其他的應用不限於交換貨幣。而上述的交換加密貨幣是一個簡化過的例子。
講解完這兩個基礎概念,讓我們來談談一般大眾平常使用的加密貨幣交易所,也就是中心化交易所。
----------------------------------------------------------------------------
「幽靈「協議("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將簡單地因為更高的算力份額而更有效率,綜合這兩個因素,區塊產生速度快的塊鏈很可能導致一個礦池擁有實際上能夠控制挖礦過程的算力份額。
----------------------------------------------------------------------------
中心化交易所 (Centralized Exchange):
中心化交易所其實就是大家主流使用的交易所,無論是 Bitfinex, Poloniex, coincheck 等都是中心化交易所。大家使用這些交易所的方式,通常就是到網站上註冊,根據不同國家的法規經過一連串的認證程序後,就可以開始把加密貨幣轉入他們指定的錢包地址後,就可以開始在上面交易加密貨幣。
拿剛剛的例子來說,如果 使用者 A 要拿 1 ETH 交換 10 BAT,中心化交易所會在他們的系統的資料庫當中,建立一筆賣單,內容是 1 ETH 交換 10 BAT。如果有另外一位 使用者 B 也建立了一筆買單,願意用 10 BAT 買 1 ETH,系統就會自動搓合這筆交易,在 用戶 A 的資產清單中扣掉 1 ETH,增加 10 BAT, 使用者 B 反之亦然。
這樣的交易不見得會發生在區塊鏈上真正的貨幣交換,取而代之的可能僅是修改交易所資料庫內的資產數字,用戶看到的只是賬面上數字的變化,交易所只要在用戶提款時準備了充足的加密貨幣匯出即可。
中心化交易所 (Centralized Exchange)
當使用者把加密貨幣轉到他們提供的錢包地址後,交易所就擁有了操作這些加密貨幣的權利,使用者必須要「信任」這個網站會保證貨幣安全,才能把加密貨幣轉給交易所操作。
正因為中心化交易所擁有了存放大量加密貨幣的私鑰,中心化交易非常容易吸引黑客 (Cracker) 的攻擊,而他們的目標絕大部分就是這些存放大量加密貨幣的私鑰,偷走了這些私鑰就代表黑客盜走這些加密貨幣。
中心化交易所 &黑客
以上就是基礎概念以及中心化交易所簡介,下半部分則會講解去中心化交易所以及結論。
----------------------------------------------------------------------------
去中心化交易所 (Decentralized Exchange):
去中心化交易所跟一般中心化交易所最不一樣的地方,就是交易行為發生在區塊鏈上,就比如說 1 ETH 交換 10 BAT 來說,兩者不一樣的地方在於:
中心化交易所,在交易所本身的資料庫中增減用戶資產欄位。
去中心化交易所,在區塊鏈上直接交換,加密貨幣會直接發回使用者的錢包,或是保存在區塊鏈上的智能合約。
這樣直接在區塊鏈上交換的好處在於交易所並不持有用戶大量的加密貨幣,所有的加密貨幣會儲存在區塊鏈上使用者的錢包或智能合約控管。本來需要信任中心化的交易所,現在僅需要信任區塊鏈以及智能合約即可。而用於交易所的智能合約大多會公開源碼讓所有人可以確認這份合約的細節。
----------------------------------------------------------------------------
遠程攻擊:
( Vitalik 在2014年5月發布的博文,提出了遠程攻擊(Long-Range Attacks)的概念。)
我們目前的工作量證明設計是基於區塊鏈的工作量證明,這是我們第二次嘗試構建保證不會給 CPU 造成負擔並且長期來看是抗專用硬體(ASIC)挖礦的演算法(編者按:即在長期挖礦的情況下,使用 ASIC 不能明顯提高優勢)。我們第一次嘗試的是 Dagger,試圖通過有向無環圖構建一個計算時 memory-hard、驗證時 memory-easy 的演算法(譯者按:即計算時會佔用大量內存、驗證時不會),從而進一步發展 Scrypt 等 memory-hard 演算法的概念(從根本上來說是每個節點都有多個父節點的樹)。我們目前的策略要嚴密得多:讓工作量證明執行來自區塊鏈的隨機合約。由於以太坊採用的是圖靈完備的腳本語言,能夠執行以太坊腳本的 ASIC 從定義上來說是用於通用計算的 ASIC,也就是 CPU——技術宅一點來說就是「這是 memory-hard 演算法,因此你沒法並行處理太多指令」。當然還有「那麼能否(對ASIC)進行特定優化,使得速度大大提升?」等問題,不過這些都是假以時日可以解決的小瑕疵。我們的解決方案很巧妙,因為它兼具經濟實惠的特點:如果有人真的創建了一個 ASIC,那會激勵其他人尋找該 ASIC 無法進行的計算類型並用這類合約充斥且污染區塊鏈。不過遺憾的是,這類方案通常面臨一個更大的障礙,從某種程度上來說還是一個根本障礙:遠程攻擊。
遠程攻擊的運行流程基本如下。在傳統的51%攻擊中,我先將100枚比特幣存入一個全新的賬戶,再用這100枚比特幣購買某個即時交付的數字商品(如萊特幣)。我等待賣家交付(比方說要等到6次確認之後),之後我立即從100枚比特幣的轉讓交易達成前的一個區塊開始構建一條新的區塊鏈,並且重新提交一份將這些比特幣轉回我的賬戶的交易。之後,我為自己的分叉鏈使用了超出剩餘網路提供給主鏈的算力來挖礦,最後我的分叉鏈超越並取代了主鏈。結果是我將比特幣和萊特幣雙雙收入囊中。在遠程攻擊中,我開始製造分叉的地方不再提前6個區塊,而可以提前60000個區塊,甚至可以從創世塊開始。
在比特幣中,這種分叉是無效的,因為你只是在徒增趕上主鏈所需的時間。然而,這對基於區塊鏈的工作量證明來說是一個嚴峻的問題。因為如果你直接從創世塊開始製造分叉,儘管你的挖礦過程一開始會很緩慢,但在鏈接幾百個區塊之後就能夠用很容易挖出的合約將這條區塊鏈填滿,而別人要想挖掘這些合約卻難比登天。
關於這類合約,有一則簡單的例子:
i = 0 while sha3(i) != 0x8ff5b6afea3c68b6cd68bd429b9b64a708fa2273a93ea9f9e3c763257affee1f:
i = i + 1
你清楚地知道該合約在與哈希值匹配之前將經歷整整一百萬輪計算,那麼你就可以立刻準確地計算出該合約在這一過程中將經歷幾個步驟、消耗多少gas,最後又會變為什麼狀態,然而其他人別無選擇,只能實實在在地運行代碼。實際上,要構建一個不經過實際運行就能在一般情況下檢測出這類投機取巧的合約的機制是不可能的(此處可經由數學證明,而非憑空臆斷),這既是這類方案的一個重要特性,也是停機問題的必然結果。因此,遠程攻擊者可以用這類合約填補分叉鏈,「挖掘」這類合約,明明走了捷徑,卻讓網路相信他做了大量工作。因此,不出幾日,我們的攻擊者的挖礦速度就會是主鏈的數十億倍,其長度很快就超越了主鏈。
要注意的是,上述攻擊沒有對演算法的實際運行方式作出假設;而只是假設了有效區塊產生的條件取決於區塊鏈本身, 而且每單位算力在區塊鏈上可以產生的影響力程度具有廣泛的可變性。一種解決方案是人為抑制這種可變性;這需要通過一個哈希樹計算堆棧追蹤合約演算法來實現,這樣一來就無捷徑可走了,因為即使你知道計算會在一百萬步之後終止併產生一個輸出值,你依然需要親自運行一百萬步來計算出所有中間的哈希值。然而,雖然這解決了遠程攻擊問題,但也導致了主要計算並非通用計算,而是計算出許許多多SHA3哈希值——使得演算法再度易於受到專用硬體的影響。
----------------------------------------------------------------------------
權益證明:
還有一種遠程攻擊是純權益證明演算法。在純權益證明中, 假設在創世塊產生之時或之後不久,攻擊者持有代幣總量的1%。之後,攻擊者開始製造自己的分叉鏈並開始挖礦。雖然,攻擊者在當時只有1%的概率被選中生產區塊,他們輕易就能產生100倍數量的區塊,以此創造出一條更長的區塊鏈。我原本認為這是個根本問題,但它實際是可以變通解決的。
例如,一種解決方案是注意每個區塊必須有對應的時間戳,而且用戶要抵制那些時間戳遠遠早於他們自己時間戳的鏈。這樣一來,遠程攻擊就必須合乎相同的時間長度,但是由於它涉及的代幣單位少得多,其得分也會低得多。另一種解決方案至少需要代幣總量的一定百分比(如30%)為每個區塊或是每第N個區塊背書,這樣絕對能抵禦少於該百分比的代幣量的一切攻擊。我們自己的權益證明演算法 Slasher 很容易就能更新成上述任一解決方案。
因此從長期看來,純權益證明或混合工作量/權益證明似乎都是區塊鏈的發展方向。在採用混合工作量/權益證明的情況下,人們很容易就能找到一個方案,利用權益證明來解決上述通過基於區塊鏈的工作量證明解決的問題。對於 Ethereum 1.0,我們可能會採用權益證明,可能會是一種混合型方案,可能還是那套老掉牙的 SHA3 演算法。我們明白 ASIC 不會有所發展,因為 Ethereum 2.0 到來在即,ASIC 的生產商會認為此舉無利可圖。
----------------------------------------------------------------------------
分散式軟體系統:
分散式軟體系統(Distributed Software Systems)是支持分散式處理的軟體系統,是在由通信網路互聯的多處理機體系結構上執行任務的系統。它包括分散式操作系統、分散式程序設計語言及其編譯(解釋)系統、分散式文件系統和分散式資料庫系統等。
分散式操作系統負責管理分散式處理系統資源和控制分散式程序運行。它和集中式操作系統的區別在於資源管理、進程通信和系統結構等方面。
分散式程序設計語言用於編寫運行於分散式計算機系統上的分散式程序。一個分散式程序由若干個可以獨立執行的程序模塊組成,它們分布於一個分散式處理系統的多台計算機上被同時執行。它與集中式的程序設計語言相比有三個特點:分布性、通信性和穩健性。
分散式文件系統具有執行遠程文件存取的能力,並以透明方式對分布在網路上的文件進行管理和存取。
分散式資料庫系統由分布於多個計算機結點上的若干個資料庫系統組成,它提供有效的存取手段來操縱這些結點上的子資料庫。分散式資料庫在使用上可視為一個完整的資料庫,而實際上它是分布在地理分散的各個結點上。當然,分布在各個結點上的子資料庫在邏輯上是相關的。
分散式資料庫系統是由若干個站集合而成。這些站又稱為節點,它們在通訊網路中聯接在一起,每個節點都是一個獨立的資料庫系統,它們都擁有各自的資料庫、中央處理機、終端,以及各自的局部資料庫管理系統。因此分散式資料庫系統可以看作是一系列集中式資料庫系統的聯合。它們在邏輯上屬於同一系統,但在物理結構上是分散式的。
分散式資料庫系統已經成為信息處理學科的重要領域,正在迅速發展之中,原因基於以下幾點:
1、它可以解決組織機構分散而數據需要相互聯繫的問題。比如銀行系統,總行與各分行處於不同的城市或城市中的各個地區,在業務上它們需要處理各自的數據,也需要彼此之間的交換和處理,這就需要分散式的系統。
2、如果一個組織機構需要增加新的相對自主的組織單位來擴充機構,則分散式資料庫系統可以在對當前機構影響最小的情況下進行擴充。
3、均衡負載的需要。數據的分解採用使局部應用達到最大,這使得各處理機之間的相互干擾降到最低。負載在各處理機之間分擔,可以避免臨界瓶頸。
4、當現有機構中已存在幾個資料庫系統,而且實現全局應用的必要性增加時,就可以由這些資料庫自下而上構成分散式資料庫系統。
5、相等規模的分散式資料庫系統在出現故障的幾率上不會比集中式資料庫系統低,但由於其故障的影響僅限於局部數據應用,因此就整個系統來講它的可靠性是比較高的。
特點
1、在分散式資料庫系統里不強調集中控制概念,它具有一個以全局資料庫管理員為基礎的分層控制結構,但是每個局部資料庫管理員都具有高度的自主權。
2、在分散式資料庫系統中數據獨立性概念也同樣重要,然而增加了一個新的概念,就是分散式透明性。所謂分散式透明性就是在編寫程序時好象數據沒有被分布一樣,因此把數據進行轉移不會影響程序的正確性。但程序的執行速度會有所降低。
3、集中式資料庫系統不同,數據冗餘在分散式系統中被看作是所需要的特性,其原因在於:首先,如果在需要的節點複製數據,則可以提高局部的應用性。其次,當某節點發生故障時,可以操作其它節點上的複製數據,因此這可以增加系統的有效性。當然,在分散式系統中對最佳冗餘度的評價是很複雜的。
分散式系統的類型,大致可以歸為三類:
1、分散式數據,但只有一個總? 據庫,沒有局部資料庫。
2、分層式處理,每一層都有自己的資料庫。
3、充分分散的分散式網路,沒有中央控制部分,各節點之間的聯接方式又可以有多種,如鬆散的聯接,緊密的聯接,動態的聯接,廣播通知式聯接等。
----------------------------------------------------------------------------
默克爾樹:
默克爾樹是一種二叉樹,由一組葉節點、一組中間節點和一個根節點構成。最下面的大量的葉節點包含基礎數據,每個中間節點是它的兩個子節點的哈希,根節點也是由它的兩個子節點的哈希,代表了默克爾樹的頂部。默克爾樹的目的是允許區塊的數據可以零散地傳送:節點可以從一個源下載區塊頭,從另外的源下載與其有關的樹的其它部分,而依然能夠確認所有的數據都是正確的。之所以如此是因為哈希向上的擴散:如果一個惡意用戶嘗試在樹的下部加入一個偽造的交易,所引起的改動將導致樹的上層節點的改動,以及更上層節點的改動,最終導致根節點的改動以及區塊哈希的改動,這樣協議就會將其記錄為一個完全不同的區塊(幾乎可以肯定是帶著不正確的工作量證明的)。
默克爾樹
默克爾樹協議對比特幣的長期持續性可以說是至關重要的。在2014年4月,比特幣網路中的一個全節點-存儲和處理所有區塊的全部數據的節點-需要佔用15GB的內存空間,而且還以每個月超過1GB的速度增長。目前,這一存儲空間對台式計算機來說尚可接受,但是手機已經負載不了如此巨大的數據了。未來只有商業機構和愛好者才會充當完整節點。簡化支付確認(SPV)協議允許另一種節點存在,這樣的節點被成為「輕節點」,它下載區塊頭,使用區塊頭確認工作量證明,然後只下載與其交易相關的默克爾樹「分支」。這使得輕節點只要下載整個區塊鏈的一小部分就可以安全地確定任何一筆比特幣交易的狀態和賬戶的當前餘額。
----------------------------------------------------------------------------
什麼是共識機制:
區塊鏈從本質上而言是一種分散式賬本技術。傳統的賬本,通常會以資料庫的形式,集中存儲在銀行或公司的伺服器節點上。而在區塊鏈的網路中,每個節點都會保有一份完整的賬本,且所有節點的賬本內容完全一致。每個節點都可以根據自己本地的賬本去查找交易,也可以往賬本中添加交易。
這樣就帶來了一個問題,如果所有節點同時一起寫入賬本數據,那麼肯定數據會不一致。因此需要一種機制來保證區塊鏈中的每一區塊只能由一個節點來負責寫入,並且讓所有其他節點一致認同這次寫入。如何選出寫入賬本數據的節點,這就是共識機制。
----------------------------------------------------------------------------
拜占庭將軍問題:
拜占庭將軍問題[1][2](Byzantine Generals Problem)是對上述場景的一種建模。拜占庭將軍問題是一個共識問題: 首先由Leslie Lamport與另外兩人在1982年提出,被稱為The Byzantine Generals Problem或者Byzantine Failure。核心描述是軍中可能有叛徒,卻要保證進攻一致,由此引申到計算領域,發展成了一種容錯理論,即拜占庭容錯(BFT,Byzantine Fault Tolerance)。
拜占庭將軍問題可以描述如下:
拜占庭帝國想要進攻一個強大的敵人,為此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵禦5支常規拜占庭軍隊的同時襲擊。基於一些原因,這10支軍隊不能集合在一起單點突破,必須在分開的包圍狀態下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通信兵相互通信來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不確定他們中是否有叛徒,叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們能否找到一種分散式的協議來讓他們能夠遠程協商,從而贏取戰鬥?這就是著名的拜占庭將軍問題。
解決問題的難點在於,將軍中可能出現叛徒,叛徒可以通過選擇性地發送消息,從而達到混淆進攻決策的目的。假設有9位將軍投票,其中1名叛徒。8名忠誠的將軍中出現了4人投進攻,4人投撤離的情況。這時候叛徒可能故意給4名投進攻的將領送信表示投票進攻,而給4名投撤離的將領送信表示投撤離。這樣一來在4名投進攻的將領看來,投票結果是5人投進攻,從而發起進攻;而在4名投撤離的將軍看來則是5人投撤離。這樣各支軍隊的一致協同就遭到了破壞。
拜占庭將軍問題對應到分散式系統中,可以表述為分散式的節點間需要對某一個message達成共識(只要過半數節點認同這個message即可)。節點之間可以交換信息,但是由於惡意節點的存在,惡意節點會發布錯誤的消息,或是給不同的節點發送不同的消息。在這樣的場景下,怎樣設計一種機制去讓節點能夠達成共識的問題。
拜占庭問題的傳統解法
口頭協議:
首先明確口頭協議的定義。我們將滿足以下三個條件的方式稱為口頭協議:
每個被發送的消息都能夠被正確的投遞
信息接收者知道是誰發送的消息
能夠知道缺少的消息
Lamport論證得出結論:將軍之間採用口頭協議進行通信,若叛徒數少於1/3,則拜占庭將軍問題可解。也就是說,若叛徒數為m,當將軍總數n至少為3m+1時,問題可解。本文中不再詳細介紹通信機制和論證過程,有興趣的讀者可以查閱文章[1]中「口頭協議」一節和[2]中的「Early solutions」下的第一種。
書面協議:
在口頭協議上加上一個條件,使之成為書面協議
發送者對消息加上簽名,簽名不可偽造,一旦被篡改即可發現,而叛徒的簽名可被其他叛徒偽造;
任何人都可以驗證簽名的可靠性。
可以論證,在將軍之間使用書面協議通信的基礎上,不管將軍總數n和叛徒數量m,忠誠的將軍總能達到一致。書面協議的本質就是引入了簽名系統,這使得所有消息都可以追溯到底有誰認同了它。這一優勢,大大節省了成本,他化解了口頭協議中1/3要求,只要採用了書面協議,忠誠的將軍就可以達到一致。即惡意的節點不超過半數,分散式系統就能達成共識。對推導細節感興趣的讀者可以同樣參照[1][2]。
----------------------------------------------------------------------------
PBFT:
實用拜占庭容錯協議(PBFT,Practical Byzantine Fault Tolerance)是Miguel Castro (卡斯特羅)和Barbara Liskov(利斯科夫)在1999年提出來的,解決了原始拜占庭容錯演算法(即上文中的口頭協議)效率不高的問題,將演算法複雜度由指數級降低到多項式級,使得拜占庭容錯演算法在實際系統應用中變得可行。
PBFT演算法的結論是n>=3f+1 n是系統中的總節點數,f是允許出現故障的節點數。換句話說,如果這個系統允許出現f個故障,那麼這個系統必須包括n個節點,才能解決故障。這和上文口頭協議的結論一樣,或者這麼說,PBFT是優化了口頭協議機制的效率,但是結論並未改變。
?比特幣中對於拜占庭問題的解法
拜占庭問題之所以難解,在於任何時候系統中都可能存在多個提案(因為提案成本很低),並且要完成最終的一致性確認過程十分困難,容易受干擾。但是一旦確認,即為最終確認。
比特幣的區塊鏈網路在設計時提出了創新的 PoW(Proof of Work) 演算法思路。一個是限制一段時間內整個網路中出現提案的個數(增加提案成本),另外一個是放寬對一致性確認的需求,約定好大家都確認並沿著已知最長的鏈進行拓寬。系統的最終確認是概率意義上的存在。這樣,即便有人試圖惡意破壞,也會付出很大的經濟代價(付出超過系統一半的算力)。
或者通俗來說,比特幣的PoW共識弱化了拜占庭問題中對於一致性的要求,在同一時刻訪問不同比特幣的節點,所得到的共識並不一致,且一致性還會隨著時間改變(分叉的情況)。但是可用性和分支容錯性都得到了提升。
後來的各種 PoX 系列演算法,也都是沿著這個思路進行改進,採用經濟上的懲罰來制約破壞者。
?Bitcoin的共識協議,可以參照Mastering Bitcoin中有詳細的描述。
其步驟如下:
本地維持所有未被確認的交易,稱之為交易池,每新接收到一筆交易就加入到交易池中。
本地維持整個區塊鏈,每新接收到一個block,則加入到區塊鏈中,並根據最長鏈原則確定主鏈。
當新接收到的block加入到區塊鏈的時候,開始挖礦。
構建一個空的block,選取交易池中費率最高的交易填充block,費率的定義為交易費/交易大小。
根據主鏈,填充block header中的previous block hash欄位。
根據block中所有交易的交易費和挖礦獎勵,構建coin base交易。挖礦獎勵大約 每四年(或準確說是每210,000個塊)減少一半,開始時為2009年1月每個區塊獎勵50個比特幣。
修改block header中的nonce, timestamp, merkle root(通過修改coinbase data),讓hash(block header)
由於滿足hash要求的block head只能通過大量遍歷獲得,所以挖礦的過程需要消耗大量的算力,直到得到合適的欄位取值為止。
發布得到的block,其他節點驗證通過後加入區塊鏈中。
2010 年左右,挖礦還是一個很有前途的行業。但是現在,建議還是不要考慮了,因為從概率上說,由於當前參與挖礦的計算力實在過於龐大(已經超出了大部分的超算中心),獲得比特幣的收益已經眼看要 cover 不住電費了。
從普通的 CPU(2009 年)、到後來的 GPU(2010 年) 和 FPGA(2011 年末)、到後來的 ASIC 礦機(2013 年初,目前單片算力已達每秒數百億次 Hash 計算)、再到現在眾多礦機聯合組成礦池。短短數年間,比特幣礦機的技術走完了過去幾十年的集成電路技術進化歷程,並且還頗有創新之處。
----------------------------------------------------------------------------
Ethereum:
由於ASIC礦機被大量運用在比特幣的挖礦過程中,所以如果出現其他基於hash運算達到共識的區塊鏈,則很容易受到原本服務於比特幣的ASIC礦機攻擊。因此Ethereum在設計其PoW共識演算法的時候,就意識到應該讓演算法在普通的個人電腦上運行更有優勢,從而避免被ASIC進行攻擊。
Ethash設計時就明確兩大目標:
抵禦礦機性能(ASIC-resistance),團隊希望CPU也能參與挖礦獲得收益。
輕客戶端可快速驗證(Light client verifiability)。
基於以上兩個目標,開發團隊最後倒騰出來的Ethash挖礦時基本與CPU性能無關,卻和內存大小和內存帶寬成正相關。不過在實現上還是借鑒了SHA3的設計思路,但是使用的」SHA3_256」 ,」SHA3_512」與標準實現很不同。
Ethash基本流程是這樣的[6]:對於每一個塊,首先計算一個種子(seed),該種子只和當前塊的信息有關;然後根據種子生成一個32M的隨機數據集(Cache);緊接著根據Cache生成一個1GB大小的數據集合(DAG),DAG可以理解為一個完整的搜索空間,挖礦的過程就是從DAG中隨機選擇元素(類似於比特幣挖礦中查找合適Nonce)再進行哈希運算。可以從Cache快速計算DAG指定位置的元素,進而哈希驗證。此外還要求對Cache和DAG進行周期性更新,每1000個塊更新一次,並且規定DAG的大小隨著時間推移線性增長,從1G開始,每年大約增長7G左右。
----------------------------------------------------------------------------
PoS:
可以看到,PoW會存在兩點問題:
費電。無論是比特幣的共識還是以太坊的Ethash,挖礦的過程中都帶來了巨大的電力消耗。網上有報道稱,現在每挖一個比特幣的成本在6000-8000美元之間;比特幣現在每天消耗的電量相當於一個小國家的耗電量。
礦池的優勢。隨著算力的不斷提升,單個礦機挖出一枚幣的概率降到了極低。因此,很多礦機的擁有者聯合在了一起形成礦池。礦池中的礦機並行地分擔計算量,當挖出新的block獲得獎勵後,再根據計算量的貢獻分享獎勵。礦池的出現導致了比特幣的中心化。從下圖中可以看出,65%的算力集中在了5大礦池的手裡。如果這些礦池對比特幣網路進行攻擊,則網路會面臨較大的風險。
?因此,業內提出了PoS(Proof of Stake)[7]的思想:
把生產block的工作交給擁有更多token的人,擁有的越多,作為block producer的概率越高。
生產block的過程中得到token獎勵,可以理解為持有token帶來的利息。
擁有大量token的人如果攻擊網路,則會造成token價格的下降,對這些人是不利的,所以這些block producer攻擊網路的意願較低。
生產block只需證明自己持有的token即可,不需要消耗多少算力,節約能源。
----------------------------------------------------------------------------
Peercoin PoS v1:
最初的一版PoS由Peercoin設計實現[8]。其中,用戶要產出block必須滿足以下條件。
hash(stake_modifier, current_time, UTXO)
具體解釋如下:
用戶在每一秒時間(current_time),遍歷自己所有的UTXO,代入上述公式中,看是否能滿足不等式條件;如果滿足,就把相應的UTXO記錄在block中,並發布block。
stake_modifier是對前一個block中部分欄位hash後的值,加入這一項是為了防止用戶提前預知自己何時有權挖礦。
difficulty會根據近期的block產出時間動態調整,保證block產出時間間隔穩定
由於每秒只需要完成和自己UTXO數量相等的hash計算,所以需要的算力較低
從不等式可以看出,持有的UTXO越多、UTXO中token數額越大(coin(UTXO))、UTXO持有時間越長(age(UTXO),或稱之為幣齡),不等式越容易成立,越容易進行挖礦。
生成block的獎勵設置為了coin(UTXO) * age(UTXO),即UTXO數額越大持有時間越長,獎勵越高。
為了將符合條件的UTXO記錄進block,並且兼容原本的PoW模式,Peercoin設計了coinstake的邏輯。
保留原本第一個transaction為coinbase,但要求輸入數量必須等於1,且輸入的prevout欄位必須置空值,輸出數量必須大於等於1。
令第二個transaction為coinstake,要求輸入數量大於等於1,且第一個輸入為滿足條件的UTXO,輸出數量大於等於2,且第一個輸出必須置空值,第二個輸出為block獎勵。
該版本的PoS面臨著如下的問題:
因為構造新的block沒有算力成本,所以當區塊鏈出現fork的時候,用戶有可能會傾向於同時在多個branch一起挖礦來獲得潛在更高的收益,這樣製造了大量的分支,破壞了一致性。這個問題多次被以太坊團隊提及,並稱之為nothing at stake問題[12],以太坊在其PoS方案CASPER中致力於解決該問題,下文Ethereum Casper一節中將詳細描述。
出現了攢幣齡的現象,即關閉節點,直到age(UTXO)足夠大的時候再啟動節點挖礦,從而節省電力,這樣引起了在線節點數太少系統脆弱的問題。
可以攢夠足夠的幣齡後,保證自己有足夠的UTXO能夠連續生產block,從而發動double-spend攻擊。
Ethereum在其白皮書中承諾最終將從PoW過渡到PoC,並且其PoC的方案,名叫CASPER[12],正在積極開發中。CASPER一個主要改進點是其將致力於解決nothing at stake問題,主要的方式是懲罰在多個分支上同時進行挖礦的用戶,甚至讓這些用戶失去用於stake的那部分token。
其方案描述如下:
用戶質押自己的一部分token進入智能合約,然後開始挖礦。
如果成功挖到block並被網路接受,則用戶獲得獎勵。
如果用戶被系統發現試圖進行nothing at stake行為,則其質押的token將被銷毀
但對於nothing at stake問題,業界一直是有爭議的[13]。主要觀點就是執行這種攻擊的代價太高,而且對攻擊者是毫無收益的。這和PoW的前提假設一樣,擁有大量礦機的人可以對比特幣發動double-spend等攻擊,但是這樣的攻擊對其並無收益,且會損失大量算力,所以這種攻擊並沒有大量發生。
----------------------------------------------------------------------------
Delegated Methods:
以上的PoW和PoS的挖礦過程,是全網所有節點共同參與的,每一時刻都有成千上萬個節點同時去爭取產出下一個block,因此會時有發生區塊鏈分叉(fork)的問題。即同一時刻,兩個節點同時產出了next block,但由於網路時延的問題,block產出的時候兩個節點並不知道有其他節點已經產出了另一個block,因此這兩個block都被發布到了網路中。[5]中對分叉的問題有詳細的描述,可以進行參考。
正是由於分叉的存在,block的產出時間間隔不能太短。各區塊鏈通過動態調整的挖礦難度,將block時間間隔穩定在自己期望的水平。例如最初比特幣的間隔是10分鐘,後續的以太坊是15秒左右。如果時間間隔進一步調短(即降低挖礦難度),分叉問題就會大量顯現,不利於共識的達成和系統的穩定。
block產出時間過長導致了兩個問題:
交易確認所需的時間過長。通常來說,一筆交易進入區塊鏈後,都建議經過6個block之後才真正確認交易,因為6個block之後想要再分叉並且追趕主鏈的難度已經超乎想像了。因此,在區塊鏈上確認交易需要分鐘級別的時間。
TPS (Transactions Per Second) 受到制約。TPS受到了block generation time和max block size的共同制約。其中max block size的存在是為了防止DOS攻擊等因素[14],有一定的天花板,因而縮減block generation time至關重要。
為了縮短block產出時間,delegated開頭命名的系列方法被提了出來。其基本思想就是,選出少量的代表來負責生產block。這樣即使縮短block的時間間隔,也不會有嚴重的分叉發生。甚至可以使用PBFT這種沒有分叉的方法來達成代表之間的一致共識。
----------------------------------------------------------------------------
EOS DPOS:
EOS提出的DPOS方案[15],其步驟簡述如下:
TAG:互聯網創業圈 |