09.19 深入瞭解區塊鏈架構分析:數據層

深入瞭解區塊鏈架構分析:數據層

數據層是最底層的技術,主要實現了兩個功能:數據存儲、賬戶和交易的實現與安全。數據存儲主要基於Merkle樹,通過區塊的方式和鏈式結構實現,大多以KV數據庫的方式實現持久化,比如比特幣和以太坊採用的leveldb。賬戶和交易的實現與安全這個功能基於數字簽名、哈希函數和非對稱加密技術等多種密碼學算法和技術,保證了交易在去中心化的情況下能夠安全的進行。

數據層的系統模型有很多,比如比特幣的UTXO 模型、迅雷鏈的賬戶模型等。

數據存儲系統——數據庫

數據層的一大功能是存儲,存儲系統的選擇原則是性能和易用性。一個網絡系統的整體性能,主要取決於網絡或本地數據存儲系統的I/O性能,比如比特幣用的是谷歌的LevelDB,據說這個數據庫讀寫性能很好,但是很多功能需要開發者自己實現。

數據庫的歷史:在IT界,其實一個特別古老的研究領域。從最初的文件系統,到後來的ER實體關係模型。實體關係模型的提出催生了一系列偉大的數據庫公司和軟件,例如IBM的DB2, Sybase,Oracle,微軟的SQLServer,MySQL等等。以及,由此引發了傳統數據庫的三大成就,關係模型、事務處理、查詢優化。再到後來隨著互聯網的盛行,MangoDB為典型代表的NOSQL數據庫崛起。數據庫技術本身在不停的演進,且一直是熱門的方向,也包括XML為代表的半結構化,基於文本、語音和圖像的非結構化數據處理等。

伴隨著現實的需求不斷升級,數據庫也在不斷髮展的,我們通過ER實體關係模型、通過NOSQL,能很好的解決數據存儲和數據訪問的Scalability問題。我們通過NOSQL數據庫、雲存儲等技術解決了互聯網海量數據的處理問題後,下一個問題接踵而至。那就是如何以一種規模化的方式解決數據真實性和有效性的問題。

區塊鏈的數據庫和傳統分佈式數據庫的比較。

深入瞭解區塊鏈架構分析:數據層

從圖中可以看出,區塊鏈的數據庫使用技術還是數據庫,知識在管理權限、數據節點分佈、去中心化等部分有差異。區塊鏈的不可篡改數據,必然伴隨著數據存儲的膨脹,這個會不會是一個問題呢?

區塊數據(Block)

區塊數據主要是保存交易數據,不同的系統採用的結構不同,下面以比特幣的區塊結構為例做介紹。

比特幣的交易記錄會保存在數據區塊之中,比特幣系統中大約每10分鐘會產生一個區塊,每個數據區塊一般包含區塊頭(Header)和區塊體(Body)兩部分,如圖2-1所示。

深入瞭解區塊鏈架構分析:數據層

區塊結構:

深入瞭解區塊鏈架構分析:數據層

區塊頭的結構說明:

深入瞭解區塊鏈架構分析:數據層

比特幣區塊鏈格式可參考:https://blog.csdn.net/mengzaishenqiu/article/details/80340877

區塊鏈的數據結構成員分散存儲在底層數據庫,最終存儲形式是[k,v]鍵值對,使用的[k,v]型底層數據庫是LevelDB;與交易操作相關的數據,其呈現的集合形式是Block;如果以Block為單位鏈接起來,則構成更大粒度的BlockChain。

鏈式結構

從上面的區塊結構中可以看到,每一個區塊都保存了上一個區塊的hash值,這樣就將這些區塊連接起來。

深入瞭解區塊鏈架構分析:數據層

Merkle樹

默克爾樹(Merkle tree,MT)是一種哈希二叉樹,1979年由Ralph Merkle發明。在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構,每個節點代表一條結構化數據。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現數據快速查詢。二叉樹如下圖所示。

深入瞭解區塊鏈架構分析:數據層

A、Merkle樹結構

由一個根節點(root)、一組中間節點和一組葉節點(leaf)組成。葉節點(leaf)包含存儲數據或其哈希值,中間節點是它的兩個孩子節點內容的哈希值,根節點也是由它的兩個子節點內容的哈希值組成。所以Merkle樹也稱哈希樹。

B、哈希樹的特點

葉節點存儲的是數據文件,而非葉節點存儲的是其子節點的哈希值(Hash,通過SHA1、SHA256等哈希算法計算而來),這些非葉子節點的Hash被稱作路徑哈希值(可以據其確定某個葉節點到根節點的路徑), 葉節點的Hash值是真實數據的Hash值。因為使用了樹形結構, 其查詢的時間複雜度為 O(logn),n是節點數量。

深入瞭解區塊鏈架構分析:數據層

默克爾樹的另一個特點是,底層數據的任何變動,都會傳遞到其父節點,一直到樹根。

C、應用模式

默克爾樹的典型應用場景包括:

  • 快速比較大量數據:當兩個默克爾樹根相同時,則意味著所代表的數據必然相同(哈希算法決定的)。

  • 快速定位修改:例如上例中,如果 D1 中數據被修改,會影響到Hash0-0,Hash0 和 Root。因此,沿著 Root --> 0 --> 0-0,可以快速定位到發生改變的 D1;

  • 零知識證明:例如如何證明某個數據(D0……D3)中包括給定內容 D0,很簡單,構造一個默克爾樹,公佈 N0,N1,N4,Root,D0擁有者可以很容易檢測 D0 存在,但不知道其它內容。

相對於 Hash List,MT的明顯的一個好處是可以單獨拿出一個分支來(作為一個小樹)對部分數據進行校驗,這個很多使用場合就帶來了哈希列表所不能比擬的方便和高效。正是源於這些優點,MT常用於分佈式系統或分佈式存儲中

D、在分佈式存儲系統中的應用原理

為了保持數據一致,分佈系統間數據需要同步,如果對機器上所有數據都進行比對的話,數據傳輸量就會很大,從而造成“網絡擁擠”。為了解決這個問題,可以在每臺機器上構造一棵Merkle Tree,這樣,在兩臺機器間進行數據比對時,從Merkle Tree的根節點開始進行比對,如果根節點一樣,則表示兩個副本目前是一致的,不再需要任何處理;如果不一樣,則沿著hash值不同的節點路徑查詢,很快就能定位到數據不一致的葉節點,只用把不一致的數據同步即可,這樣大大節省了比對時間以及數據的傳輸量。

E、比特幣中的Merkle Tree

比特幣區塊鏈系統中的採用的是Merkle二叉樹,它的作用主要是快速歸納和校驗區塊數據的完整性,它會將區塊鏈中的數據分組進行哈希運算,向上不斷遞歸運算產生新的哈希節點,最終只剩下一個Merkle根存入區塊頭中,每個哈希節點總是包含兩個相鄰的數據塊或其哈希值。

在比特幣系統中使用Merkle樹有諸多優點:首先是極大地提高了區塊鏈的運行效率和可擴展性,使得區塊頭只需包含根哈希值而不必封裝所有底層數據,這使得哈希運算可以高效地運行在智能手機甚至物聯網設備上;其次是Merkle樹可支持“簡化支付驗證協議”(SPV),即在不運行完整區塊鏈網絡節點的情況下,也能夠對交易數據進行檢驗。所以,在區塊鏈中使用Merkle樹這種數據結構是非常具有意義的。

深入瞭解區塊鏈架構分析:數據層

Merkle樹的計算可參考:

https://www.cnblogs.com/fengzhiwu/p/5524324.html

https://blog.csdn.net/qq_33935254/article/details/55505472


哈希函數

Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

哈希能夠實現數據從一個維度向另一個維度的映射,通常使用哈希函數實現這種映射。通常業界使用y = hash(x)的方式進行表示,該哈希函數實現對x進行運算計算出一個哈希值y。

A、哈希算法的特點

哈希算法接受一段明文後,以一種不可逆的方式,將其轉化為一段長度較短、位數固定的散列數據,計算高效。

collision-free 即衝突概率小,如果兩個哈希值是不相同的(根據同一函數),那麼這兩個哈希值的原始輸入也是不相同的;如果兩個哈希值相同,兩個輸入值很可能是相同的,但不絕對肯定二者一定相等(可能出現哈希碰撞)。

能夠隱藏原始信息:例如區塊鏈中各個節點之間對交易的驗證只需要驗證交易的信息熵,而不需要對原始信息進行比對,節點間不需要傳輸交易的原始數據只傳輸交易的哈希即可,常見算法有SHA系列和MD5等算法。

加密過程不可逆,即無法通過輸出的散列數據倒推原本的明文是什麼。

輸入的明文與輸出的散列數據一一對應,任何一個輸入信息的變化,都必將導致最終輸出的散列數據的變化,衝突的概率非常小。

B、哈希的用法

哈希在區塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer),哈希指針是指該變量的值是通過實際數據計算出來的且指向實際的數據所在位置,即其既可以表示實際數據內容又可以表示實際數據的存儲位置。如下圖所示:

深入瞭解區塊鏈架構分析:數據層

HashPointer在區塊鏈中主要有兩處使用,第一個就是構建區塊鏈數據結構,從上面的區塊數據結構中就可以知道,每個區塊都包含了上一個區塊的hash值(即hash pointer),這樣的好處在於後面區塊可以查找前面所有區塊中的信息,而且區塊的HashPointer的計算包含了前面區塊的信息從而一定程度上保證了區塊鏈的不易篡改的特性。第二個就是用於構建Merkle Tree.,Merkle Tree的各個節點使用HashPointer進行構建。

哈希還在其他技術中有所應用例如:交易驗證以及數字簽名等等。


加密算法

加密就是通過一種算法將原始信息進行轉換,接收者能夠通過密鑰對密文進行解密還原成原文的過程。加密算法的典型組件有加解密算法、加密密鑰和解密密鑰。其中加解密算法是固定不變和公開可見的;密鑰則不固定而且需要保護起來,一般來說,對同一種算法,密鑰長度越長,則加密強度越大。

加密過程即通過加密算法和加密密鑰,對明文進行加密,獲得密文。

解密過程即通過解密算法和解密密鑰,對密文進行解密,獲得明文。

根據加解密的密鑰是否相同,算法可以分為對稱加密(symmetric cryptography,又稱公共密鑰加密,common-key cryptography)和非對稱加密(asymmetric cryptography,又稱公鑰加密,public-key cryptography)。兩種模式適用於不同的需求,恰好形成互補,很多時候也可以組合使用,形成混合加密機制。

並非所有加密算法的強度都可以從數學上進行證明。公認的高強度加密算法是在經過長時間各方面實踐論證後,被大家所認可,不代表其不存在漏洞。但任何時候,自行發明加密算法都是一種不太明智的行為。

A、對稱加密

用相同的密鑰來加密和解密,對稱加密的優點是加解密效率高(速度快,空間佔用小),加密強度高。缺點是參與多方都需要持有密鑰,一旦有人洩露則安全性被破壞,如何在不安全通道下分發密鑰是關鍵問題。

加密過程:原文+密鑰=》密文;解密過程:密文-密鑰=》原文。

深入瞭解區塊鏈架構分析:數據層

對稱密碼從實現原理上可以分為兩種:分組密碼和序列密碼。前者將明文切分為定長數據塊作為加密單位,應用最為廣泛。後者則只對一個字節進行加密,且密碼不斷變化,只用在一些特定領域,如數字媒介的加密等。

代表算法包括:

DES(Data Encryption Standard):經典的分組加密算法,1977年由美國聯邦信息處理標準(FIPS)所採用FIPS-46-3,將64位明文加密為64位的密文,其密鑰長度為56位+8位校驗。現在已經很容易被暴力破解。

3DES:三重DES操作:加密解密加密,處理過程和加密強度優於DES,但現在也被認為不夠安全。

AES(Advanced Encryption Standard):美國國家標準研究所(NIST)採用取代DES成為對稱加密實現的標準,1997~2000年NIST從15個候選算法中評選Rijndael算法(由比利時密碼學家Joan Daemon和Vicent Rijmen發明)作為AES,標準為FIPS-197。AES也是分組算法,分組長度為128、192、256位三種。AES的優勢在於處理速度快,整個過程可以數學化描述,目前尚未有有效的破解手段。

適用於大量數據的加解密;不能用於簽名場景;需要提前分發密鑰。其中分組加密每次只能處理固定長度的明文,因此過長的內容需要採用一定模式進行加密,《使用密碼學》中推薦使用密文分組鏈接(Cipher Block Chain,CBC)、計數器(Counter,CTR)模式。

B、非對稱加密

非對稱加密是現代密碼學歷史上最為偉大的發明,可以很好的解決對稱加密需要的提前分發密鑰問題。加密密鑰和解密密鑰是不同的,分別稱為公鑰和私鑰。公鑰一般是公開的,人人可獲取的,私鑰一般是個人自己持有,不能被他人獲取。公鑰用於加密,私鑰用於解密。公鑰由私鑰生成,私鑰可以推導出公鑰,從公鑰無法推導出私鑰。

深入瞭解區塊鏈架構分析:數據層

它的優點是公私鑰分開,不安全通道也可以使用。缺點是加解密速度慢,一般比對稱加解密算法慢2到3個數量級;同時加密強度相比對稱加密要差。

加密過程:原文+接收方公鑰=》密文;解密過程:密文+接收方私鑰=》原文

深入瞭解區塊鏈架構分析:數據層

非對稱加密算法的安全性往往需要基於數學問題來保障,目前主要有基於大數質因子分解、離散對數、橢圓曲線等幾種思路。

代表算法包括:

RSA:經典的公鑰算法,1978年提出。算法利用了對大數進行質因子分解困難的特性,但目前還沒有數學證明兩者難度等價,或許存在未知算法在不進行大數分解的前提下解密。

Diffie-Hellman密鑰交換:基於離散對數無法快速求解,可以在不安全的通道上,雙方協商一個公共密鑰。

ElGamal:利用了模運算下求離散對數困難的特性。被應用在PGP等安全工具中。

橢圓曲線算法(Elliptic curve cryptography,ECC):現代備受關注的算法系列,基於對橢圓曲線上特定點進行特殊乘法逆運算難以計算的特性。最早在1985年提出。ECC系列算法一般被認為具備較高的安全性,但加解密計算過程往往比較費時。

一般適用於簽名場景或密鑰協商,不適於大量數據的加解密。 其中RSA算法等已被認為不夠安全,一般推薦採用橢圓曲線系列算法。

C、混合加密機制

這種方式將加密過程分為兩個階段,階段一使用非對稱加密進行秘鑰的分發使得對方安全地得到對稱加密的秘鑰,階段二使用對稱加密對原文進行加解密,如下圖所示。

深入瞭解區塊鏈架構分析:數據層

典型的場景是現在大家常用的HTTPS機制。

建立安全連接具體步驟如下:

客戶端瀏覽器發送信息到服務器,包括隨機數R1,支持的加密算法類型、協議版本、壓縮算法等。注意該過程為明文。

服務端返回信息,包括隨機數R2、選定加密算法類型、協議版本,以及服務器證書。注意該過程為明文。

瀏覽器檢查帶有該網站公鑰的證書。該證書需要由第三方CA來簽發,瀏覽器和操作系統會預置權威CA的根證書。如果證書被篡改作假(中間人攻擊),很容易通過CA的證書驗證出來。

如果證書沒問題,則用證書中公鑰加密隨機數R3,發送給服務器。此時,只有客戶端和服務器都擁有R1、R2和R3信息,基於R1、R2和R3,生成對稱的會話密鑰(如AES算法)。後續通信都通過對稱加密進行保護。

D、常見加密算法的對比

深入瞭解區塊鏈架構分析:數據層

E、比特幣中加密算法的使用

比特幣系統中使用的就是一種非常典型的非對稱加密算法——橢圓曲線加密算法(ECC)。比特幣系統一般從操作系統底層的一個密碼學安全的隨機源中取出一個256位隨機數作為私鑰,私鑰總數為2256個,所以很難通過遍歷所有可能的私鑰得出與公鑰的對應的私鑰。用戶使用的私鑰還會通過SHA256和Base58轉換成易書寫和識別的50位長度的私鑰,公鑰則首先由私鑰和Secp256k1橢圓曲線算法生成65字節長度的隨機數。

深入瞭解區塊鏈架構分析:數據層

深入瞭解區塊鏈架構分析:數據層

數字簽名

數字簽名又稱之為公鑰數字簽名,是一種類似於寫在紙上的物理簽名。數字簽名主要用於數據更改的簽名者身份識別以及抗抵賴。數字簽名包含三個重要特性:

l 只有自己可以簽署自己的數字簽名,但是他人可以驗證簽名是否是你簽發;

l 數字簽名需要和具體的數字文檔綁定,就好比現實中你的簽名應該和紙質媒介綁定;

l 數字簽名不可偽造;

通過非對稱加密機制可以較容易實現上述三種特性。首先,需要生成個人的公私鑰對:(sk, pk) := generateKeys(keysize),sk私鑰用戶自己保留,pk公鑰可以分發給其他人其次,可以通過sk對一個具體的message進行簽名:sig := sign(sk, message) 這樣就得到了具體的簽名sig最後,擁有該簽名公鑰的一方能夠進行簽名的驗證:isValid := verify(pk, message, sig)在區塊鏈體系中每一條數據交易都需要簽名,在比特幣的設計過程中直接將用戶的公鑰來表徵用戶的比特幣地址。這樣在用戶發起轉賬等比特幣交易時可以方便的進行用戶交易的合法性驗證。

數字簽名就是在信息後面加上另一段內容,作為發送者的證明並且證明信息沒有被篡改。一般是發送者將信息用哈希算法處理得出一個哈希值,然後用私鑰對該哈希值進行加密,得出一個簽名。然後發送者再將信息和簽名一起發送給接收者。接收者使用發送者的公鑰對簽名進行解密,還原出哈希值,再通過哈希算法來驗證信息的哈希值和解密簽名還原出來的哈希值是否一致,從而可以鑑定信息是否來自發送者或驗證信息是否被篡,如下圖所示。

深入瞭解區塊鏈架構分析:數據層

相關知識:數字證書和認證中心

數字證書(Digital Certificate)又稱“數字身份證”、“網絡身份證”是經認證中心授權頒發並經認證中心數字簽名的包含公開秘鑰擁有者及公開秘鑰相關信息的電子文件,可以用來判別數字證書擁有者身份。數字證書包含:公鑰、證書名稱信息、簽發機構對證書的數字簽名以及匹配的私鑰證書可以存儲在網絡中的數據庫中。用戶可以利用網絡彼此交換證書。當證書撤銷後,簽發此證書的CA仍保留此證書的副本,以備日後解 決可能引起的糾紛。

認證中心(Certificate Authority) 一般簡稱CA, CA一般是一個公認可信的第三方機構,其作用主要是為每個用戶頒發一個獨一無二的包含名稱和公鑰的數字證書。CA解決了電子商務中公鑰的可信度問題:負責證明“我確實始我”,CA是受信仟的第三方,公鑰的合法性檢驗,CA證書內容包括:證書持有人的公鑰、證書授權中心名稱、證書有效期、證書授權中心的數字簽名。

CA證書用例-Https訪問網站:

*客戶端通過https向服務器發安全鏈接請求

*服務器用私鑰加密網頁內容,同CA證書一併發給客戶端

*客戶端會根據CA證書驗證是否合法:

*如果驗證失敗,客戶端彈出警告信息

*如果驗證通過,客戶端使用CA證書中的公鑰向服務器發送加密信息

深入瞭解區塊鏈架構分析:數據層


分享到:


相關文章: