2.Merkle樹
前面介紹了區(qū)塊頭哈希值缘挑、區(qū)塊高度和區(qū)塊頭的結(jié)構(gòu)败去,接著來看看區(qū)塊體。區(qū)塊體存儲著交易信息跪呈,在區(qū)塊中它們是以一棵Merkle樹的數(shù)據(jù)結(jié)構(gòu)進行存儲的,而Merkle樹是一種用來有效地總結(jié)區(qū)塊中所有交易的數(shù)據(jù)結(jié)構(gòu)取逾。Merkle樹是一棵哈希二叉樹耗绿,樹的每個葉子節(jié)點都是一筆交易的哈希值。同樣以比特幣為例砾隅,在比特幣網(wǎng)絡(luò)中误阻,Merkle樹被用來歸納一個區(qū)塊中的所有交易,同時生成整個交易集合的數(shù)字指紋即Merkle樹根晴埂,且提供了一種校驗區(qū)塊是否存在某交易的高效途徑究反。生成一棵Merkle樹需要遞歸地對每兩個哈希節(jié)點進行哈希得到一個新的哈希值,并將新的哈希值存入Merkle樹中儒洛,知道兩兩結(jié)合最終只有一個哈希值時精耐,這個哈希值就是這一區(qū)塊所有交易的Merkle根,存儲到上面介紹的區(qū)塊頭結(jié)構(gòu)中琅锻。
下面通過一個實例來對Merkle樹進一步的介紹卦停。圖1.5是一棵只有4筆交易的Merkle樹,即交易A恼蓬、B惊完、C和D
第一步,需要使用兩次SHA256算法對每筆交易數(shù)據(jù)進行哈希運算处硬,得到每筆交易的哈希值小槐,這里可以得到Ha、Hb郁油、Hc本股、Hd這4個哈希值,也就是這棵Merkle樹的葉子節(jié)點桐腌,例如拄显,
Ha=SHA256(SHA265(交易A)
第二步,對兩個葉子節(jié)點Ha案站、Hb 的哈希值同樣使用兩次SHA256進行組合哈希運算躬审,將會得到一個新的哈希值Hab,對Hc、Hd進行同樣的操作將獲得另一個哈希值Hcd承边,例如
Hab=SHA256(SHA256(Ha+Hb))
第三步遭殉,對現(xiàn)有的兩個哈希值Hab、Hcd進行第二步中的組合運算博助,最后將得到一個新的哈希值Habcd险污,此時我們已經(jīng)沒有了其他同高度節(jié)點,所以最后的Habcd就是這一棵Merkle樹的Merkle根富岳。之后將這個節(jié)點的32字節(jié)哈希值寫入到區(qū)塊頭部Merkle根字段中蛔糯。Merkle樹的整個形成過程結(jié)束。
Habcd=SHA256(SHA256(Hab+Hcd))
因為Merkle樹是一棵二叉樹窖式,所以它需要偶數(shù)個葉子節(jié)點蚁飒,也就是偶數(shù)筆交易。但是在很多情況下萝喘,某個區(qū)塊的交易數(shù)目會出現(xiàn)奇數(shù)筆淮逻。對于這種情況,Merkle樹的解決方案是將最后一筆交易進行一次復(fù)制阁簸,以此構(gòu)造成偶數(shù)個葉子節(jié)點爬早,這種偶數(shù)個葉子節(jié)點的二叉樹葉稱為平衡樹。
圖1.6展示的是一棵更大的Merkle樹强窖,由16個交易構(gòu)成凸椿。通過圖示,可以發(fā)現(xiàn)翅溺,不管一個區(qū)塊中有一筆交易還是十萬筆交易脑漫,最終都能歸納成一個32字節(jié)的哈希值作為Merkle樹的根節(jié)點。
當(dāng)需要證明交易列表中的某筆交易存在時咙崎,一個節(jié)點只需計算log2N個32字節(jié)的哈希值优幸,就可以形成一條從Merkle樹根到特定交易的路徑,Merkle樹的效率如表1.2所示
3.非對稱加密與數(shù)字簽名
非對稱加密是區(qū)塊鏈技術(shù)中用于安全性需求和所有權(quán)認證是采用的加密技術(shù)褪猛,常見的非對稱加密算法有RSA网杆、Elgamal、背包算法伊滋、Rabin碳却、D-H、ECC(橢圓曲線加密算法)和ECDSA(橢圓曲線數(shù)字簽名算法)笑旺,等等昼浦。與對稱加密算法不同的是,非對稱加密算法需要兩個密鑰:公開密鑰和私有密鑰筒主」卦耄基于非對稱加密算法可以使通信雙方在不安全的媒體上交換信息鸟蟹,安全地達成信息的一致。公開密鑰是對外公開的使兔,而私有密鑰是保密的建钥,其他人不能通過公開密鑰推算出對應(yīng)的私鑰。每一個公開密鑰都有其相對應(yīng)的私有密鑰虐沥,如果我們使用公開密鑰對信息進行 加密熊经,那么則必須有對應(yīng)的私有密鑰才能對加密后的信息進行解密;而如果是用私有密鑰加密信息欲险,則只有對應(yīng)的公開密鑰才可以進行解密奈搜。在區(qū)塊鏈中,非對稱加密主要用與信息加密盯荤,數(shù)字簽名等場景。
在信息加密場景中焕盟,如圖1.7所示秋秤,信息發(fā)送者A需要發(fā)送一個信息給信息接收者B,需要先使用B的公鑰對信息進行加密脚翘,B收到后灼卢,使用自己的私鑰就可以對這一信息進行解密,而其他人沒有私鑰来农,是沒辦法對這個加密信息進行解密的鞋真。
而在數(shù)字簽名場景中,如圖1.8所示沃于,發(fā)送者A先用哈希函數(shù)對原文生成一個摘要然后使用私鑰對摘要進行加密涩咖,生成數(shù)字簽名,之后將數(shù)字簽名與原文一起發(fā)送給接收者B繁莹;B收到信息后使用A的公鑰對數(shù)字簽名進行解密得到摘要檩互,由此確保信息是A發(fā)出的,然后再對收到的原文使用哈希函數(shù)產(chǎn)生摘要咨演,并與解密得到的摘要進行對比闸昨,如果相同,則說明收到的信息在傳輸過程中沒有被修改過薄风。