?、?深入了解區塊鏈的共識機制及算法原理
所謂“共識機制”,是通過特殊節點的投票,在很短的時間內完成對交易的驗證和確認;對一筆交易,如果利益不相干的若干個節點能夠達成共識,我們就可以認為全網對此也能夠達成共識。再通俗一點來講,如果中國一名微博大V、美國一名虛擬幣玩家、一名非洲留學生和一名歐洲旅行者互不相識,但他們都一致認為你是個好人,那么基本上就可以斷定你這人還不壞。
要想整個區塊鏈網絡節點維持一份相同的數據,同時保證每個參與者的公平性,整個體系的所有參與者必須要有統一的協議,也就是我們這里要將的共識算法。比特幣所有的節點都遵循統一的協議規范。協議規范(共識算法)由相關的共識規則組成,這些規則可以分為兩個大的核心:工作量證明與最長鏈機制。所有規則(共識)的最終體現就是比特幣的最長鏈。共識算法的目的就是保證比特幣不停地在最長鏈條上運轉,從而保證整個記賬系統的一致性和可靠性。
區塊鏈中的用戶進行交易時不需要考慮對方的信用、不需要信任對方,也無需一個可信的中介機構或中央機構,只需要依據區塊鏈協議即可實現交易。這種不需要可信第三方中介就可以順利交易的前提是區塊鏈的共識機制,即在互不了解、信任的市場環境中,參與交易的各節點出于對自身利益考慮,沒有任何違規作弊的動機、行為,因此各節點會主動自覺遵守預先設定的規則,來判斷每一筆交易的真實性和可靠性,并將檢驗通過的記錄寫入到區塊鏈中。各節點的利益各不相同,邏輯上將它們沒有合謀欺騙作弊的動機產生,而當網絡中有的節點擁有公共信譽時,這一點尤為明顯。區塊鏈技術運用基于數學原理的共識算法,在節點之間建立“信任”網絡,利用技術手段從而實現一種創新式的信用網絡。
目前區款連行業內主流的共識算法機制包含:工作量證明機制、權益證明機制、股份授權證明機制和Pool驗證池這四大類。
工作量證明機制即對于工作量的證明,是生成要加入到區塊鏈中的一筆新的交易信息(即新區塊)時必須滿足的要求。在基于工作量證明機制構建的區塊鏈網絡中,節點通過計算隨機哈希散列的數值解爭奪記賬權,求得正確的數值解以生成區塊的能力是節點算力的具體表現。工作量證明機制具有完全去中心化的優點,在以工作量證明機制為共識的區塊鏈中,節點可以自由進出。大家所熟知的比特幣網絡就應用工作量證明機制來生產新的貨幣。然而,由于工作量證明機制在比特幣網絡中的應用已經吸引了全球計算機大部分的算力,其他想嘗試使用該機制的區塊鏈應用很難獲得同樣規模的算力來維持自身的安全。同時,基于工作量證明機制的挖礦行為還造成了大量的資源浪費,達成共識所需要的周期也較長,因此該機制并不適合商業應用。
2012年,化名Sunny King的網友推出了Peercoin,該加密電子貨幣采用工作量證明機制發行新幣,采用權益證明機制維護網絡安全,這是權益證明機制在加密電子貨幣中的首次應用。與要求證明人執行一定量的計算工作不同,權益證明要求證明人提供一定數量加密貨幣的所有權即可。權益證明機制的運作方式是,當創造一個新區塊時,礦工需要創建一個“幣權”交易,交易會按照預先設定的比例把一些幣發送給礦工本身。權益證明機制根據每個節點擁有代幣的比例和時間,依據算法等比例地降低節點的挖礦難度,從而加快了尋找隨機數的速度。這種共識機制可以縮短達成共識所需的時間,但本質上仍然需要網絡中的節點進行挖礦運算。因此,PoS機制并沒有從根本上解決PoW機制難以應用于商業領域的問題。
股份授權證明機制是一種新的保障網絡安全的共識機制。它在嘗試解決傳統的PoW機制和PoS機制問題的同時,還能通過實施科技式的民主抵消中心化所帶來的負面效應。
股份授權證明機制與董事會投票類似,該機制擁有一個內置的實時股權人投票系統,就像系統隨時都在召開一個永不散場的股東大會,所有股東都在這里投票決定公司決策?;贒PoS機制建立的區塊鏈的去中心化依賴于一定數量的代表,而非全體用戶。在這樣的區塊鏈中,全體節點投票選舉出一定數量的節點代表,由他們來代理全體節點確認區塊、維持系統有序運行。同時,區塊鏈中的全體節點具有隨時罷免和任命代表的權力。如果必要,全體節點可以通過投票讓現任節點代表失去代表資格,重新選舉新的代表,實現實時的民主。
股份授權證明機制可以大大縮小參與驗證和記賬節點的數量,從而達到秒級的共識驗證。然而,該共識機制仍然不能完美解決區塊鏈在商業中的應用問題,因為該共識機制無法擺脫對于代幣的依賴,而在很多商業應用中并不需要代幣的存在。
Pool驗證池基于傳統的分布式一致性技術建立,并輔之以數據驗證機制,是目前區塊鏈中廣泛使用的一種共識機制。
Pool驗證池不需要依賴代幣就可以工作,在成熟的分布式一致性算法(Pasox、Raft)基礎之上,可以實現秒級共識驗證,更適合有多方參與的多中心商業模式。不過,Pool驗證池也存在一些不足,例如該共識機制能夠實現的分布式程度不如PoW機制等
這里主要講解區塊鏈工作量證明機制的一些算法原理以及比特幣網絡是如何證明自己的工作量的,希望大家能夠對共識算法有一個基本的認識。
工作量證明系統的主要特征是客戶端要做一定難度的工作來得到一個結果,驗證方則很容易通過結果來檢查客戶端是不是做了相應的工作。這種方案的一個核心特征是不對稱性:工作對于請求方是適中中的,對于驗證方是易于驗證的。它與驗證碼不同,驗證碼是易于被人類解決而不是易于被計算機解決。
下圖所示的為工作量證明流程。
舉個例子,給個一個基本的字符創“hello,world!”,我們給出的工作量要求是,可以在這個字符創后面添加一個叫做nonce(隨機數)的整數值,對變更后(添加nonce)的字符創進行SHA-256運算,如果得到的結果(一十六進制的形式表示)以“0000”開頭的,則驗證通過。為了達到這個工作量證明的目標,需要不停地遞增nonce值,對得到的字符創進行SHA-256哈希運算。按照這個規則,需要經過4251次運算,才能找到前導為4個0的哈希散列。
通過這個示例我們對工作量證明機制有了一個初步的理解。有人或許認為如果工作量證明只是這樣一個過程,那是不是只要記住nonce為4521使計算能通過驗證就行了,當然不是了,這只是一個例子。
下面我們將輸入簡單的變更為“Hello,World!+整數值”,整數值取1~1000,也就是說將輸入變成一個1~1000的數組:Hello,World!1;Hello,World!2;...;Hello,World!1000。然后對數組中的每一個輸入依次進行上面的工作量證明—找到前導為4個0的哈希散列。
由于哈希值偽隨機的特性,根據概率論的相關知識容易計算出,預計要進行2的16次方次數的嘗試,才能得到前導為4個0的哈希散列。而統計一下剛剛進行的1000次計算的實際結果會發現,進行計算的平均次數為66958次,十分接近2的16次方(65536)。在這個例子中,數學期望的計算次數實際就是要求的“工作量”,重復進行多次的工作量證明會是一個符合統計學規律的概率事件。
統計輸入的字符創與得到對應目標結果實際使用的計算次數如下:
對于比特幣網絡中的任何節點,如果想生成一個新的區塊加入到區塊鏈中,則必須解決出比特幣網絡出的這道謎題。這道題的關鍵要素是工作量證明函數、區塊及難度值。工作量證明函數是這道題的計算方法,區塊是這道題的輸入數據,難度值決定了解這道題的所需要的計算量。
比特幣網絡中使用的工作量證明函數正是上文提及的SHA-256。區塊其實就是在工作量證明環節產生的。曠工通過不停地構造區塊數據,檢驗每次計算出的結果是否滿足要求的工作量,從而判斷該區塊是不是符合網絡難度。區塊頭即比特幣工作量證明函數的輸入數據。
難度值是礦工們挖掘的重要參考指標,它決定了曠工需要經過多少次哈希運算才能產生一個合法的區塊。比特幣網絡大約每10分鐘生成一個區塊,如果在不同的全網算力條件下,新區塊的產生基本都保持這個速度,難度值必須根據全網算力的變化進行調整??偟脑瓌t即為無論挖礦能力如何,使得網絡始終保持10分鐘產生一個新區塊。
難度值的調整是在每個完整節點中獨立自動發生的。每隔2016個區塊,所有節點都會按照統一的格式自動調整難度值,這個公式是由最新產生的2016個區塊的花費時長與期望時長(按每10分鐘產生一個取款,則期望時長為20160分鐘)比較得出來的,根據實際時長一期望時長的比值進行調整。也就是說,如果區塊產生的速度比10分鐘快,則增加難度值;反正,則降低難度值。用公式來表達如下:
新難度值=舊難度值*(20160分鐘/過去2016個區塊花費時長)。
工作量證明需要有一個目標值。比特幣工作量證明的目標值(Target)的計算公式如下:
目標值=最大目標值/難度值,其中最大目標值為一個恒定值
目標值的大小與難度值成反比,比特幣工作量證明的達成就是礦中計算出來的區塊哈希值必須小于目標值。
我們也可以將比特幣工作量的過程簡單的理解成,通過不停變更區塊頭(即嘗試不同nonce值)并將其作為輸入,進行SHA-256哈希運算,找出一個有特定格式哈希值的過程(即要求有一定數量的前導0),而要求的前導0個數越多,難度越大。
可以把比特幣將這道工作量證明謎題的步驟大致歸納如下:
該過程可以用下圖表示:
比特幣的工作量證明,就是我們俗稱“挖礦”所做的主要工作。理解工作量證明機制,將為我們進一步理解比特幣區塊鏈的共識機制奠定基礎。
?、?區塊鏈哈希算法是什么
哈希算法也被稱為“散列”,是區塊鏈的四大核心技術之一。是能計算出一個數字消息所對應的、長度固定的字符串(又稱消息摘要)的算法。由于一段數據只有一個哈希值,所以哈希算法可以用于檢驗數據的完整性。在快速查找和加密算法的應用方面,哈希算法的使用非常普遍。
在互聯網時代,盡管人與人之間的距離更近了,但是信任問題卻更嚴重了。 現存的第三方中介組織的技術架構都是私密而且中心化的,這種模式永遠都無法從根本上解決互信以及價值轉移的問題。因此,區塊鏈技術將會利用去中心化的數據庫架構完成數據交互信任背書,實現全球互信的一大跨步。在這一過 程中,哈希算法發揮了重要作用。
散列算法是區塊鏈中保證交易信息不被篡改的單向密碼機制。區塊鏈通過散列算法對一個交易區塊中的交易進行加密,并把信息壓縮成由一串數字和字母組成的散列字符串。區塊鏈的散列值能夠唯一而準確地標識一個區塊。在驗證區塊的真實性時,只需要簡單計算出這個區塊的散列值,如果沒有變化就 意味著這個區塊上的信息是沒有被篡改過的。
鏈喬教育在線旗下學碩創新區塊鏈技術工作站是中國教育部學校規劃建設發展中心開展的“智慧學習工場2020-學碩創新工作站 ”唯一獲準的“區塊鏈技術專業”試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。
?、?POA(Proof of Activity)區塊鏈共識算法
POA(Proof of Activity)算法是一個區塊鏈的共識算法,基本原理是結合POW(Proof of work)和POS(Proof of stake)算法的特點進行工作,POW算法和POS算法的具體內容可以參考:
POW算法 : https://www.jianshu.com/p/b23cbafbbad2
POS算法 : https://blog.csdn.net/wgwgnihao/article/details/80635162
POA算法相比于其他算法可以改進網絡拓撲,維持在線節點比例,需求更少的交易費同時減少共識算法過程中的能量損耗。
POA算法需求的網絡中同樣包含兩類節點,礦工和普通參與者,其中普通參與者不一定一直保持在線。POA算法首先由礦工構造區塊頭,由塊頭選出N個幣,這N個幣的所有者參與后續的校驗和生成塊的過程。
從這里可以看到POA算法不僅與算力有關,后續的N個參與者的選舉則完全由參與者在網絡中所擁有的幣的總數量決定。擁有越多幣的參與者越有機會被選為N個后續的參與者。而后續N個參與者參與的必要條件是這N個參與者必須在線,這也是POA命名的由來,POA算法的維護取決于網絡中的活躍節點(Active)。
POA算法的一個理想的基本流程是,類似于POW協議,礦工構造出一個符合難度要求的塊頭,通過礦工得到的塊頭計算衍生出N個幣的編號,從區塊鏈中追溯可以得到這幾個幣目前所述的參與者。礦工將這個塊頭發送給這N個參與者,其中前N-1個參與者對這個塊進行校驗和簽名,最后第N個參與者校驗并將交易加入到該塊中,將這個區塊發布出去,即完成一個區塊的出塊。
一個理想過程如下圖所示:
在實際運行中,無法保證網絡上所有參與者都在線,而不在線的參與者則無法進行校驗和簽名,這個無法被校驗和簽名的塊頭則會被廢棄。
即在實際運行中,應該是一個礦工構造出塊頭后廣播給各個參與者簽名,同時繼續重新構造新的塊頭,以免上一個塊頭衍生的N個參與者存在有某一個沒有在線,而導致塊頭被廢棄。
因此,在這種情況下,一個塊是否被確認不僅與礦工的計算能力有關同時也與網絡上的在線比例有關。
與純POW相比,在與比特幣(POW)同樣10分鐘出一個塊的情況下,POA由于會有參與者不在線而產生的損耗,因此,10分鐘內礦工可以構造的塊的數量會更多,即塊頭的難度限制會降低,那么礦工在挖礦過程中會造成的能量損耗也會降低。
與純POS相比,可以看到POA的出塊流程并不會將構造區塊過程中的相關信息上鏈,可以明顯減少區塊鏈上用于維護協議產生的冗余信息的量。
本節對上訴協議中一些參數設置進行分析
在礦工構造出塊頭后對塊頭進行校驗和區塊構造的N個參與者的數量選定比較類似于比特幣中每一個塊的出塊時間的選取。比特幣中選擇了10分鐘作為每一個塊的期望出塊時間并通過動態調節難度來適應。
這里N的取值同樣可以選擇選定值或者動態調節。動態調節需要更加復雜的協議內容,同時可能會帶來區塊鏈的數據膨脹,而復雜的協議也增加了攻擊者攻擊的可能性。另外暫時沒有辦法證明動態調節可以帶來什么好處。靜態調節在后續的分析(4 安全分析)中可以得到N=3的取值是比較合適的。
從上面的描述可以看到,構造新的區塊的除了礦工還有從塊頭中衍生出來的N個幣所有者。在構造出一個新的區塊后,這些參與者同樣應該收到一定的激勵,以維持參與者保持在線狀態。
礦工與參與者之間的非配比例與參與者的在線狀態相關。給予參與者的激勵與參與者保持在線狀態的熱情密切相關,越多參與者保持在線狀態,能更好地維持網絡的穩定。因此,可以在網絡上在線參與者不夠多的時候,提高參與者得到的激勵分成比例,從而激發更多的參與者上線。
如何確定當前參與者的在線情況呢?可以最后第N個參與者構造區塊時,將構造出來但是被廢棄的塊頭加入到區塊中,如果被丟棄的塊頭數量過多,說明在線人數過低,應當調節分成比例。
同時最后第N個參與者與其他參與者的分成同樣需要考慮,第N個參與者需要將交易加入區塊中,即需要維護UTXO池,同時第N個參與者還需要將被丟棄的塊頭加入新構建的區塊中。
為了激勵其將廢棄區塊頭加入新構建的區塊中,可以按照加入的區塊頭,適當增加一點小的激勵。雖然加入更多的區塊頭,可以在下一輪的時候增加分成的比例,應當足夠激勵參與者往區塊中加入未使用的塊頭了(這里參與者不可能為了增加分成而更多地加入區塊頭,每一個區塊頭都意味著一位礦工的工作量)。
一個參與者如果沒有維護UTXO池則無法構造區塊,但是可以參與前N-1個的簽名,因此為了激勵參與者維護UTXO池,作為最后一個構造區塊的參與者,必須給予更多的激勵,比如是其他參與者的兩倍。
從3.2的描述中可以知道一個用戶必須在線且維護UTXO池才可能盡可能地獲得利益。這種機制勢必會導致一些用戶將自己的賬戶托管給一個中心化的機構。這個機構一直保持在線,并為用戶維護其賬戶,在被選為構造區塊的參與者時參與區塊的構建并獲取利益。最后該機構將收益按照某種形式進行分成。
上面說到參與者必須用自己的密鑰進行簽名,而托管給某個機構后,這個機構在可以用這個密鑰簽名構造區塊的同時,也有可能使用這個密鑰消費用戶的財產。這里可以采用一種有限花銷的密鑰,這個密鑰有兩個功能,一個是將賬戶中的部分財產消費出去,另一個是將所有財產轉移到一個指定賬戶。在托管的時候可以使用這個密鑰,在被通知部分財產被花費后可以立即將所有財產轉移到自己的另一個賬戶下,以保證財產的安全。
從上面的分析可以看到,POA的安全性與攻擊者所擁有的算力和攻擊者所擁有的股權有關。假設攻擊者擁有的在線股權占比為 ,則攻擊者的算力需要達到其他所有算力的 倍才能達成分叉。假設攻擊者股權總占比為 ,網絡中誠實用戶的在線比例為 ,則攻擊者的算力需要達到其他所有算力的 倍才能達成攻擊。
攻擊的分析表格如下:
從上文的分析可以看到,POA算法相比于其他算法可以改進網絡拓撲,維持在線節點比例,需求更少的交易費同時減少共識算法過程中的能量損耗。同時,PoA協議的攻擊成本要高于比特幣的純PoW協議。
參考文獻:Proof of Activity: Extending Bitcoins Proof of Work via Proof of Stake
?、?區塊鏈技術中的哈希算法是什么
1.1. 簡介
計算機行業從業者對哈希這個詞應該非常熟悉,哈希能夠實現數據從一個維度向另一個維度的映射,通常使用哈希函數實現這種映射。通常業界使用y = hash(x)的方式進行表示,該哈希函數實現對x進行運算計算出一個哈希值y。
區塊鏈中哈希函數特性:
函數參數為string類型;
固定大小輸出;
計算高效;
collision-free 即沖突概率?。簒 != y => hash(x) != hash(y)
隱藏原始信息:例如區塊鏈中各個節點之間對交易的驗證只需要驗證交易的信息熵,而不需要對原始信息進行比對,節點間不需要傳輸交易的原始數據只傳輸交易的哈希即可,常見算法有SHA系列和MD5等算法
1.2. 哈希的用法
哈希在區塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer)
哈希指針是指該變量的值是通過實際數據計算出來的且指向實際的數據所在位置,即其既可以表示實際數據內容又可以表示實際數據的存儲位置。下圖為Hash Pointer的示意圖
?、?什么是區塊鏈加密算法
區塊鏈加密算法(EncryptionAlgorithm)
非對稱加密算法是一個函數,通過使用一個加密鑰匙,將原來的明文文件或數據轉化成一串不可讀的密文代碼。加密流程是不可逆的,只有持有對應的解密鑰匙才能將該加密信息解密成可閱讀的明文。加密使得私密數據可以在低風險的情況下,通過公共網絡進行傳輸,并保護數據不被第三方竊取、閱讀。
區塊鏈技術的核心優勢是去中心化,能夠通過運用數據加密、時間戳、分布式共識和經濟激勵等手段,在節點無需互相信任的分布式系統中實現基于去中心化信用的點對點交易、協調與協作,從而為解決中心化機構普遍存在的高成本、低效率和數據存儲不安全等問題提供了解決方案。
區塊鏈的應用領域有數字貨幣、通證、金融、防偽溯源、隱私保護、供應鏈、娛樂等等,區塊鏈、比特幣的火爆,不少相關的top域名都被注冊,對域名行業產生了比較大的影響。
?、?區塊鏈要什么技術開發
區塊鏈要什么技術開發:
一、區塊鏈理論:區塊鏈開發者要對區塊鏈的理論知識具備熟悉的掌握能力,這是作為一名區塊鏈開發者最基本的要求。在里面的內容包括了區塊鏈網絡架構、去中心化等相關應用技術。拓展技術理論是對以太坊開發的掌握。
二、智能合約:智能合約是需要區塊鏈開發者用區塊鏈編程語言寫出來的一串代碼,根據不同場景構思邏輯后開發出來的信任機制,旨在消除第三方的介入,創造出高效、高信任的區塊鏈網絡。區塊鏈開發者要實現這串代碼自動執行,且是不可逆的操作效果。
三、密碼學:區塊鏈應用場景很多都是具備高加密性的,點對點的加密模式是密碼學的特點。區塊鏈開發者通過研究密碼學,了解到錢包、密鑰、廣泛的加密和解密技術等加密概念
四、分布式架構:區塊鏈開發人者必須懂得分布式架構和網絡的功能。去中心化網絡是區塊鏈架構的基礎,在區塊鏈網絡中信息的傳遞要遵循去中心化的方式,這樣每個人才能享受到同等的網絡權益。
?、?區塊鏈密碼算法是怎樣的
區塊鏈作為新興技術受到越來越廣泛的關注,是一種傳統技術在互聯網時代下的新的應用,這其中包括分布式數據存儲技術、共識機制和密碼學等。隨著各種區塊鏈研究聯盟的創建,相關研究得到了越來越多的資金和人員支持。區塊鏈使用的Hash算法、零知識證明、環簽名等密碼算法:
Hash算法
哈希算法作為區塊鏈基礎技術,Hash函數的本質是將任意長度(有限)的一組數據映射到一組已定義長度的數據流中。若此函數同時滿足:
?。?)對任意輸入的一組數據Hash值的計算都特別簡單;
?。?)想要找到2個不同的擁有相同Hash值的數據是計算困難的。
滿足上述兩條性質的Hash函數也被稱為加密Hash函數,不引起矛盾的情況下,Hash函數通常指的是加密Hash函數。對于Hash函數,找到使得被稱為一次碰撞。當前流行的Hash函數有MD5,SHA1,SHA2,SHA3。
比特幣使用的是SHA256,大多區塊鏈系統使用的都是SHA256算法。所以這里先介紹一下SHA256。
1、 SHA256算法步驟
STEP1:附加填充比特。對報文進行填充使報文長度與448模512同余(長度=448mod512),填充的比特數范圍是1到512,填充比特串的最高位為1,其余位為0。
STEP2:附加長度值。將用64-bit表示的初始報文(填充前)的位長度附加在步驟1的結果后(低位字節優先)。
STEP3:初始化緩存。使用一個256-bit的緩存來存放該散列函數的中間及最終結果。
STEP4:處理512-bit(16個字)報文分組序列。該算法使用了六種基本邏輯函數,由64 步迭代運算組成。每步都以256-bit緩存值為輸入,然后更新緩存內容。每步使用一個32-bit 常數值Kt和一個32-bit Wt。其中Wt是分組之后的報文,t=1,2,...,16 。
STEP5:所有的512-bit分組處理完畢后,對于SHA256算法最后一個分組產生的輸出便是256-bit的報文。
2、環簽名
2001年,Rivest, shamir和Tauman三位密碼學家首次提出了環簽名。是一種簡化的群簽名,只有環成員沒有管理者,不需要環成員間的合作。環簽名方案中簽名者首先選定一個臨時的簽名者集合,集合中包括簽名者。然后簽名者利用自己的私鑰和簽名集合中其他人的公鑰就可以獨立的產生簽名,而無需他人的幫助。簽名者集合中的成員可能并不知道自己被包含在其中。
環簽名方案由以下幾部分構成:
?。?)密鑰生成。為環中每個成員產生一個密鑰對(公鑰PKi,私鑰SKi)。
?。?)簽名。簽名者用自己的私鑰和任意n個環成員(包括自己)的公鑰為消息m生成簽名a。
?。?)簽名驗證。驗證者根據環簽名和消息m,驗證簽名是否為環中成員所簽,如果有效就接收,否則丟棄。
環簽名滿足的性質:
?。?)無條件匿名性:攻擊者無法確定簽名是由環中哪個成員生成,即使在獲得環成員私鑰的情況下,概率也不超過1/n。
?。?)正確性:簽名必需能被所有其他人驗證。
?。?)不可偽造性:環中其他成員不能偽造真實簽名者簽名,外部攻擊者即使在獲得某個有效環簽名的基礎上,也不能為消息m偽造一個簽名。
3、環簽名和群簽名的比較
?。?)匿名性。都是一種個體代表群體簽名的體制,驗證者能驗證簽名為群體中某個成員所簽,但并不能知道為哪個成員,以達到簽名者匿名的作用。
?。?)可追蹤性。群簽名中,群管理員的存在保證了簽名的可追蹤性。群管理員可以撤銷簽名,揭露真正的簽名者。環簽名本身無法揭示簽名者,除非簽名者本身想暴露或者在簽名中添加額外的信息。提出了一個可驗證的環簽名方案,方案中真實簽名者希望驗證者知道自己的身份,此時真實簽名者可以通過透露自己掌握的秘密信息來證實自己的身份。
?。?)管理系統。群簽名由群管理員管理,環簽名不需要管理,簽名者只有選擇一個可能的簽名者集合,獲得其公鑰,然后公布這個集合即可,所有成員平等。
鏈喬教育在線旗下學碩創新區塊鏈技術工作站是中國教育部學校規劃建設發展中心開展的“智慧學習工場2020-學碩創新工作站 ”唯一獲準的“區塊鏈技術專業”試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。
?、?區塊鏈 --- 共識算法
PoW算法是一種防止分布式服務資源被濫用、拒絕服務攻擊的機制。它要求節點進行適量消耗時間和資源的復雜運算,并且其運算結果能被其他節點快速驗算,以耗用時間、能源做擔保,以確保服務與資源被真正的需求所使用。
PoW算法中最基本的技術原理是使用哈希算法。假設求哈希值Hash(r),若原始數據為r(raw),則運算結果為R(Result)。
R = Hash(r)
哈希函數Hash()的特性是,對于任意輸入值r,得出結果R,并且無法從R反推回r。當輸入的原始數據r變動1比特時,其結果R值完全改變。在比特幣的PoW算法中,引入算法難度d和隨機值n,得到以下公式:
Rd = Hash(r+n)
該公式要求在填入隨機值n的情況下,計算結果Rd的前d字節必須為0。由于哈希函數結果的未知性,每個礦工都要做大量運算之后,才能得出正確結果,而算出結果廣播給全網之后,其他節點只需要進行一次哈希運算即可校驗。PoW算法就是采用這種方式讓計算消耗資源,而校驗僅需一次。
PoS算法要求節點驗證者必須質押一定的資金才有挖礦打包資格,并且區域鏈系統在選定打包節點時使用隨機的方式,當節點質押的資金越多時,其被選定打包區塊的概率越大。
POS模式下,每個幣每天產生1幣齡,比如你持有100個幣,總共持有了30天,那么,此時你的幣齡就為3000。這個時候,如果你驗證了一個POS區塊,你的幣齡就會被清空為0,同時從區塊中獲得相對應的數字貨幣利息。
節點通過PoS算法出塊的過程如下:普通的節點要成為出塊節點,首先要進行資產的質押,當輪到自己出塊時,打包區塊,然后向全網廣播,其他驗證節點將會校驗區塊的合法性。
DPoS算法和PoS算法相似,也采用股份和權益質押。
但不同的是,DPoS算法采用委托質押的方式,類似于用全民選舉代表的方式選出N個超級節點記賬出塊。
選民把自己的選票投給某個節點,如果某個節點當選記賬節點,那么該記賬節點往往在獲取出塊獎勵后,可以采用任意方式來回報自己的選民。
這N個記賬節點將輪流出塊,并且節點之間相互監督,如果其作惡,那么會被扣除質押金。
通過信任少量的誠信節點,可以去除區塊簽名過程中不必要的步驟,提高了交易的速度。
拜占庭問題:
拜占庭是古代東羅馬帝國的首都,為了防御在每塊封地都駐扎一支由單個將軍帶領的軍隊,將軍之間只能靠信差傳遞消息。在戰爭時,所有將軍必須達成共識,決定是否共同開戰。
但是,在軍隊內可能有叛徒,這些人將影響將軍們達成共識。拜占庭將軍問題是指在已知有將軍是叛徒的情況下,剩余的將軍如何達成一致決策的問題。
BFT:
BFT即拜占庭容錯,拜占庭容錯技術是一類分布式計算領域的容錯技術。拜占庭假設是對現實世界的模型化,由于硬件錯誤、網絡擁塞或中斷以及遭到惡意攻擊等原因,計算機和網絡可能出現不可預料的行為。拜占庭容錯技術被設計用來處理這些異常行為,并滿足所要解決的問題的規范要求。
拜占庭容錯系統 :
發生故障的節點被稱為 拜占庭節點 ,而正常的節點即為 非拜占庭節點 。
假設分布式系統擁有n臺節點,并假設整個系統拜占庭節點不超過m臺(n ≥ 3m + 1),拜占庭容錯系統需要滿足如下兩個條件:
另外,拜占庭容錯系統需要達成如下兩個指標:
PBFT即實用拜占庭容錯算法,解決了原始拜占庭容錯算法效率不高的問題,算法的時間復雜度是O(n^2),使得在實際系統應用中可以解決拜占庭容錯問題
PBFT是一種狀態機副本復制算法,所有的副本在一個視圖(view)輪換的過程中操作,主節點通過視圖編號以及節點數集合來確定,即:主節點 p = v mod |R|。v:視圖編號,|R|節點個數,p:主節點編號。
PBFT算法的共識過程如下:客戶端(Client)發起消息請求(request),并廣播轉發至每一個副本節點(Replica),由其中一個主節點(Leader)發起提案消息pre-prepare,并廣播。其他節點獲取原始消息,在校驗完成后發送prepare消息。每個節點收到2f+1個prepare消息,即認為已經準備完畢,并發送commit消息。當節點收到2f+1個commit消息,客戶端收到f+1個相同的reply消息時,說明客戶端發起的請求已經達成全網共識。
具體流程如下 :
客戶端c向主節點p發送
主節點收到客戶端的請求,需要進行以下交驗:
a. 客戶端請求消息簽名是否正確。
非法請求丟棄。正確請求,分配一個編號n,編號n主要用于對客戶端的請求進行排序。然后廣播一條<
副本節點i收到主節點的PRE-PREPARE消息,需要進行以下交驗:
a. 主節點PRE-PREPARE消息簽名是否正確。
b. 當前副本節點是否已經收到了一條在同一v下并且編號也是n,但是簽名不同的PRE-PREPARE信息。
c. d與m的摘要是否一致。
d. n是否在區間[h, H]內。
非法請求丟棄。正確請求,副本節點i向其他節點包括主節點發送一條
主節點和副本節點收到PREPARE消息,需要進行以下交驗:
a. 副本節點PREPARE消息簽名是否正確。
b. 當前副本節點是否已經收到了同一視圖v下的n。
c. n是否在區間[h, H]內。
d. d是否和當前已收到PRE-PPREPARE中的d相同
非法請求丟棄。如果副本節點i收到了2f+1個驗證通過的PREPARE消息,則向其他節點包括主節點發送一條
主節點和副本節點收到COMMIT消息,需要進行以下交驗:
a. 副本節點COMMIT消息簽名是否正確。
b. 當前副本節點是否已經收到了同一視圖v下的n。
c. d與m的摘要是否一致。
d. n是否在區間[h, H]內。
非法請求丟棄。如果副本節點i收到了2f+1個驗證通過的COMMIT消息,說明當前網絡中的大部分節點已經達成共識,運行客戶端的請求操作o,并返回
如果主節點作惡,它可能會給不同的請求編上相同的序號,或者不去分配序號,或者讓相鄰的序號不連續。備份節點應當有職責來主動檢查這些序號的合法性。
如果主節點掉線或者作惡不廣播客戶端的請求,客戶端設置超時機制,超時的話,向所有副本節點廣播請求消息。副本節點檢測出主節點作惡或者下線,發起View Change協議。
View Change協議 :
副本節點向其他節點廣播
當主節點p = v + 1 mod |R|收到 2f 個有效的VIEW-CHANGE消息后,向其他節點廣播
副本節點收到主節點的NEW-VIEW消息,驗證有效性,有效的話,進入v+1狀態,并且開始 中的PRE-PREPARE消息處理流程。
在上述算法流程中,為了確保在View Change的過程中,能夠恢復先前的請求,每一個副本節點都記錄一些消息到本地的log中,當執行請求后副本節點需要把之前該請求的記錄消息清除掉。
最簡單的做法是在Reply消息后,再執行一次當前狀態的共識同步,這樣做的成本比較高,因此可以在執行完多條請求K(例如:100條)后執行一次狀態同步。這個狀態同步消息就是CheckPoint消息。
副本節點i發送
這是理想情況,實際上當副本節點i向其他節點發出CheckPoint消息后,其他節點還沒有完成K條請求,所以不會立即對i的請求作出響應,它還會按照自己的節奏,向前行進,但此時發出的CheckPoint并未形成stable。
為了防止i的處理請求過快,設置一個上文提到的 高低水位區間[h, H] 來解決這個問題。低水位h等于上一個stable checkpoint的編號,高水位H = h + L,其中L是我們指定的數值,等于checkpoint周期處理請求數K的整數倍,可以設置為L = 2K。當副本節點i處理請求超過高水位H時,此時就會停止腳步,等待stable checkpoint發生變化,再繼續前進。
在區塊鏈場景中,一般適合于對強一致性有要求的私有鏈和聯盟鏈場景。例如,在IBM主導的區塊鏈超級賬本項目中,PBFT是一個可選的共識協議。在Hyperledger的Fabric項目中,共識模塊被設計成可插拔的模塊,支持像PBFT、Raft等共識算法。
Raft基于領導者驅動的共識模型,其中將選舉一位杰出的領導者(Leader),而該Leader將完全負責管理集群,Leader負責管理Raft集群的所有節點之間的復制日志。
下圖中,將在啟動過程中選擇集群的Leader(S1),并為來自客戶端的所有命令/請求提供服務。 Raft集群中的所有節點都維護一個分布式日志(復制日志)以存儲和提交由客戶端發出的命令(日志條目)。 Leader接受來自客戶端的日志條目,并在Raft集群中的所有關注者(S2,S3,S4,S5)之間復制它們。
在Raft集群中,需要滿足最少數量的節點才能提供預期的級別共識保證, 這也稱為法定人數。 在Raft集群中執行操作所需的最少投票數為 (N / 2 +1) ,其中N是組中成員總數,即 投票至少超過一半 ,這也就是為什么集群節點通常為奇數的原因。 因此,在上面的示例中,我們至少需要3個節點才能具有共識保證。
如果法定仲裁節點由于任何原因不可用,也就是投票沒有超過半數,則此次協商沒有達成一致,并且無法提交新日志。
數據存儲:Tidb/TiKV
日志:阿里巴巴的 DLedger
服務發現:Consul& etcd
集群調度:HashiCorp Nomad
只能容納故障節點(CFT),不容納作惡節點
順序投票,只能串行apply,因此高并發場景下性能差
Raft通過解決圍繞Leader選舉的三個主要子問題,管理分布式日志和算法的安全性功能來解決分布式共識問題。
當我們啟動一個新的Raft集群或某個領導者不可用時,將通過集群中所有成員節點之間協商來選舉一個新的領導者。 因此,在給定的實例中,Raft集群的節點可以處于以下任何狀態: 追隨者(Follower),候選人(Candidate)或領導者(Leader)。
系統剛開始啟動的時候,所有節點都是follower,在一段時間內如果它們沒有收到Leader的心跳信號,follower就會轉化為Candidate;
如果某個Candidate節點收到大多數節點的票,則這個Candidate就可以轉化為Leader,其余的Candidate節點都會回到Follower狀態;
一旦一個Leader發現系統中存在一個Leader節點比自己擁有更高的任期(Term),它就會轉換為Follower。
Raft使用基于心跳的RPC機制來檢測何時開始新的選舉。 在正常期間, Leader 會定期向所有可用的 Follower 發送心跳消息(實際中可能把日志和心跳一起發過去)。 因此,其他節點以 Follower 狀態啟動,只要它從當前 Leader 那里收到周期性的心跳,就一直保持在 Follower 狀態。
當 Follower 達到其超時時間時,它將通過以下方式啟動選舉程序:
根據 Candidate 從集群中其他節點收到的響應,可以得出選舉的三個結果。
共識算法的實現一般是基于復制狀態機(Replicated state machines),何為 復制狀態機 :
簡單來說: 相同的初識狀態 + 相同的輸入 = 相同的結束狀態 。不同節點要以相同且確定性的函數來處理輸入,而不要引入一下不確定的值,比如本地時間等。使用replicated log是一個很不錯的注意,log具有持久化、保序的特點,是大多數分布式系統的基石。
有了Leader之后,客戶端所有并發的請求可以在Leader這邊形成一個有序的日志(狀態)序列,以此來表示這些請求的先后處理順序。Leader然后將自己的日志序列發送Follower,保持整個系統的全局一致性。注意并不是強一致性,而是 最終一致性 。
日志由有序編號(log index)的日志條目組成。每個日志條目包含它被創建時的任期號(term),和日志中包含的數據組成,日志包含的數據可以為任何類型,從簡單類型到區塊鏈的區塊。每個日志條目可以用[ term, index, data]序列對表示,其中term表示任期, index表示索引號,data表示日志數據。
Leader 嘗試在集群中的大多數節點上執行復制命令。 如果復制成功,則將命令提交給集群,并將響應發送回客戶端。類似兩階段提交(2PC),不過與2PC的區別在于,leader只需要超過一半節點同意(處于工作狀態)即可。
leader 、 follower 都可能crash,那么 follower 維護的日志與 leader 相比可能出現以下情況
當出現了leader與follower不一致的情況,leader強制follower復制自己的log, Leader會從后往前試 ,每次AppendEntries失敗后嘗試前一個日志條目(遞減nextIndex值), 直到成功找到每個Follower的日志一致位置點(基于上述的兩條保證),然后向后逐條覆蓋Followers在該位置之后的條目 。所以丟失的或者多出來的條目可能會持續多個任期。
要求候選人的日志至少與其他節點一樣最新。如果不是,則跟隨者節點將不投票給候選者。
意味著每個提交的條目都必須存在于這些服務器中的至少一個中。如果候選人的日志至少與該多數日志中的其他日志一樣最新,則它將保存所有已提交的條目,避免了日志回滾事件的發生。
即任一任期內最多一個leader被選出。這一點非常重要,在一個復制集中任何時刻只能有一個leader。系統中同時有多余一個leader,被稱之為腦裂(brain split),這是非常嚴重的問題,會導致數據的覆蓋丟失。在raft中,兩點保證了這個屬性:
因此, 某一任期內一定只有一個leader 。
當集群中節點的狀態發生變化(集群配置發生變化)時,系統容易受到系統故障。 因此,為防止這種情況,Raft使用了一種稱為兩階段的方法來更改集群成員身份。 因此,在這種方法中,集群在實現新的成員身份配置之前首先更改為中間狀態(稱為聯合共識)。 聯合共識使系統即使在配置之間進行轉換時也可用于響應客戶端請求,它的主要目的是提升分布式系統的可用性。
?、?區塊鏈的加密技術
數字加密技能是區塊鏈技能使用和開展的關鍵。一旦加密辦法被破解,區塊鏈的數據安全性將受到挑戰,區塊鏈的可篡改性將不復存在。加密算法分為對稱加密算法和非對稱加密算法。區塊鏈首要使用非對稱加密算法。非對稱加密算法中的公鑰暗碼體制依據其所依據的問題一般分為三類:大整數分化問題、離散對數問題和橢圓曲線問題。第一,引進區塊鏈加密技能加密算法一般分為對稱加密和非對稱加密。非對稱加密是指集成到區塊鏈中以滿意安全要求和所有權驗證要求的加密技能。非對稱加密通常在加密和解密進程中使用兩個非對稱暗碼,稱為公鑰和私鑰。非對稱密鑰對有兩個特點:一是其間一個密鑰(公鑰或私鑰)加密信息后,只能解密另一個對應的密鑰。第二,公鑰可以向別人揭露,而私鑰是保密的,別人無法通過公鑰計算出相應的私鑰。非對稱加密一般分為三種首要類型:大整數分化問題、離散對數問題和橢圓曲線問題。大整數分化的問題類是指用兩個大素數的乘積作為加密數。由于素數的出現是沒有規律的,所以只能通過不斷的試算來尋找解決辦法。離散對數問題類是指基于離散對數的困難性和強單向哈希函數的一種非對稱分布式加密算法。橢圓曲線是指使用平面橢圓曲線來計算一組非對稱的特殊值,比特幣就采用了這種加密算法。非對稱加密技能在區塊鏈的使用場景首要包含信息加密、數字簽名和登錄認證。(1)在信息加密場景中,發送方(記為A)用接收方(記為B)的公鑰對信息進行加密后發送給
B,B用自己的私鑰對信息進行解密。比特幣交易的加密就屬于這種場景。(2)在數字簽名場景中,發送方A用自己的私鑰對信息進行加密并發送給B,B用A的公鑰對信息進行解密,然后確保信息是由A發送的。(3)登錄認證場景下,客戶端用私鑰加密登錄信息并發送給服務器,服務器再用客戶端的公鑰解密認證登錄信息。請注意上述三種加密計劃之間的差異:信息加密是公鑰加密和私鑰解密,確保信息的安全性;數字簽名是私鑰加密,公鑰解密,確保了數字簽名的歸屬。認證私鑰加密,公鑰解密。以比特幣體系為例,其非對稱加密機制如圖1所示:比特幣體系一般通過調用操作體系底層的隨機數生成器生成一個256位的隨機數作為私鑰。比特幣的私鑰總量大,遍歷所有私鑰空間獲取比特幣的私鑰極其困難,所以暗碼學是安全的。為便于辨認,256位二進制比特幣私鑰將通過SHA256哈希算法和Base58進行轉化,構成50個字符長的私鑰,便于用戶辨認和書寫。比特幣的公鑰是私鑰通過Secp256k1橢圓曲線算法生成的65字節隨機數。公鑰可用于生成比特幣交易中使用的地址。生成進程是公鑰先通過SHA256和RIPEMD160哈希處理,生成20字節的摘要成果(即Hash160的成果),再通過SHA256哈希算法和Base58轉化,構成33個字符的比特幣地址。公鑰生成進程是不可逆的,即私鑰不能從公鑰推導出來。比特幣的公鑰和私鑰通常存儲在比特幣錢包文件中,其間私鑰最為重要。丟掉私鑰意味著丟掉相應地址的所有比特幣財物。在現有的比特幣和區塊鏈體系中,現已依據實踐使用需求衍生出多私鑰加密技能,以滿意多重簽名等愈加靈敏雜亂的場景。
?、?區塊鏈的密碼技術有
密碼學技術是區塊鏈技術的核心。區塊鏈的密碼技術有數字簽名算法和哈希算法。
數字簽名算法
數字簽名算法是數字簽名標準的一個子集,表示了只用作數字簽名的一個特定的公鑰算法。密鑰運行在由SHA-1產生的消息哈希:為了驗證一個簽名,要重新計算消息的哈希,使用公鑰解密簽名然后比較結果??s寫為DSA。
數字簽名是電子簽名的特殊形式。到目前為止,至少已經有 20 多個國家通過法律 認可電子簽名,其中包括歐盟和美國,我國的電子簽名法于 2004 年 8 月 28 日第十屆全 國人民代表大會常務委員會第十一次會議通過。數字簽名在 ISO 7498-2 標準中定義為: “附加在數據單元上的一些數據,或是對數據單元所作的密碼變換,這種數據和變換允許數據單元的接收者用以確認數據單元來源和數據單元的完整性,并保護數據,防止被人(例如接收者)進行偽造”。數字簽名機制提供了一種鑒別方法,以解決偽造、抵賴、冒充和篡改等問題,利用數據加密技術、數據變換技術,使收發數據雙方能夠滿足兩個條件:接收方能夠鑒別發送方所宣稱的身份;發送方以后不能否認其發送過該數據這一 事實。
數字簽名是密碼學理論中的一個重要分支。它的提出是為了對電子文檔進行簽名,以 替代傳統紙質文檔上的手寫簽名,因此它必須具備 5 個特性。
?。?)簽名是可信的。
?。?)簽名是不可偽造的。
?。?)簽名是不可重用的。
?。?)簽名的文件是不可改變的。
?。?)簽名是不可抵賴的。
哈希(hash)算法
Hash,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,其中散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,但是不可逆向推導出輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
哈希(Hash)算法,它是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。同時,哈希函數可以將任意長度的輸入經過變化以后得到固定長度的輸出。哈希函數的這種單向特征和輸出數據長度固定的特征使得它可以生成消息或者數據。
以比特幣區塊鏈為代表,其中工作量證明和密鑰編碼過程中多次使用了二次哈希,如SHA(SHA256(k))或者RIPEMD160(SHA256(K)),這種方式帶來的好處是增加了工作量或者在不清楚協議的情況下增加破解難度。
以比特幣區塊鏈為代表,主要使用的兩個哈希函數分別是:
1.SHA-256,主要用于完成PoW(工作量證明)計算;
2.RIPEMD160,主要用于生成比特幣地址。如下圖1所示,為比特幣從公鑰生成地址的流程。