Comunion 區(qū)塊鏈深度學(xué)習(xí)系列|哈希算法的應(yīng)用
本系列內(nèi)容包含:基本概念及原理、密碼學(xué)、共識(shí)算法、錢包及節(jié)點(diǎn)原理、挖礦原理及實(shí)現(xiàn)。
挖礦
以比特幣網(wǎng)絡(luò)為例,比特幣挖礦主要使用到的算法是SHA-256,其具體流程參見下圖。
我們從上往下進(jìn)行分析:
第一層是:n Version(版本號(hào));
第二層是:hash Preb Block(前一個(gè)區(qū)塊的哈希);
第三層是:hash Merkle Root(交易Merkle樹根),
第四層是:n Time(時(shí)間戳);
第五層是:n Bits(難度值);
第六層是:n Nonce(隨機(jī)數(shù));
第七層是:Hash(哈希函數(shù))。
里面的n代表連續(xù)0的個(gè)數(shù),該值要小于當(dāng)前區(qū)塊難度目標(biāo)值m,挖到塊的條件是前n個(gè)比特位全部為0,n越大,難度越大。假設(shè)最低難度對(duì)應(yīng)最大目標(biāo)值為M,則區(qū)塊難度為:M/m
看過前面課程的朋友應(yīng)該會(huì)有印象,這些全部是區(qū)塊頭中的數(shù)據(jù)字段。
再來看左邊,我們分析一下為什么其中有些是固定而有些是可變的。
1.版本號(hào)和前一個(gè)區(qū)塊哈希是固定的,以比特幣為例,假設(shè)當(dāng)前比特幣區(qū)塊高度為N,如果某人想挖接下來N+1區(qū)塊的話,那么這個(gè)時(shí)候版本號(hào)必須是固定的,前一個(gè)區(qū)塊的哈希必須也是固定的。因?yàn)樵诓淮嬖诜植娴那闆r下,當(dāng)前區(qū)塊包含上一個(gè)區(qū)塊的哈希值;
也就是N-1區(qū)塊的哈希值加上N區(qū)塊數(shù)據(jù)算出N區(qū)塊哈希值,然后將N區(qū)塊哈希值當(dāng)成N+1區(qū)塊的的前一區(qū)塊哈希值。這里有點(diǎn)繞,希望大家多理解一下;
2.交易Merkle根是可變的,為什么說可變呢?因?yàn)樵谕诘V的時(shí)候,肯定會(huì)準(zhǔn)備一個(gè)打包區(qū)塊,打包區(qū)塊形成的時(shí)候,礦工會(huì)根據(jù)自己的需求或根據(jù)利益算法,將交易打包進(jìn)去,最后整理成一個(gè)Merkle根;
3.時(shí)間戳是可變的,挖礦有個(gè)時(shí)間范圍,在這個(gè)時(shí)間范圍內(nèi)挖出的礦都為有效,所以在有效時(shí)間內(nèi)的時(shí)間是可以任意調(diào)節(jié)的;
4.難度值在一定周期內(nèi)是固定的,會(huì)隨著周期的改變而變化;
5.Nonce是可變的,這里就不展開講了,忘記的朋友可以翻閱前面的講解。
在挖礦的時(shí)候,到Nonce的時(shí)候,由于時(shí)間戳和Merkle根都已經(jīng)經(jīng)過計(jì)算固定了,這時(shí)只需要改變Nonce就可以了。此時(shí)可以把這7個(gè)數(shù)據(jù)看成一個(gè)整體,前面6個(gè)數(shù)據(jù)是X,把X放在哈希函數(shù)里面,會(huì)出來一個(gè)值,比如說Y值。
由于比特幣網(wǎng)絡(luò)里使用的哈希算法是SHA-256,當(dāng)Y值出來之后,就會(huì)得到一個(gè)256個(gè)由0和1組成的字符串。這個(gè)字符串出來之后,它會(huì)和X里面的難度值比較大小。
每計(jì)算一次,也就是通過了一個(gè)Nonce,就會(huì)產(chǎn)生一個(gè)Y值,Y值會(huì)和難度值比較大小,如果Y值小于難度值,此時(shí)就找到了一個(gè)有效的Nonce,礦也就挖出來了。
生成地址
地址的生成中也用到了哈希算法。從下圖可以看到從公鑰到比特幣地址生成的流程。
第一層:生成公鑰(如何生成會(huì)在后續(xù)課程解答);
第二層:兩層哈希算法,SHA-265和RIPMD-160(常稱為雙哈?;騂ash160);
第三層:然后雙層哈希計(jì)算,會(huì)產(chǎn)生公鑰哈希;
第四層:Base58Check編碼(在Base58編碼基礎(chǔ)上的改良);
第五層:經(jīng)過編碼,得到一個(gè)編碼串,這個(gè)編碼串就是公鑰哈希即比特幣地址。
形成 Merkle tree 和交易Hash
在默克樹樹結(jié)構(gòu)和形成交易哈希里面也使用到了哈希算法。
上圖的默克樹中,最底層有4個(gè)葉子節(jié)點(diǎn),最左邊H A下面有個(gè)Hash(TxA),意思是:Tx表示交易,A表示交易編號(hào)。
假設(shè)現(xiàn)在使用的哈希算法是SHA-256,那么交易產(chǎn)生時(shí),會(huì)對(duì)HA、HB分別進(jìn)行哈希計(jì)算,會(huì)分別得到2個(gè)由256個(gè)0和1組成的字符串。同理,HC、HD也會(huì)得到相應(yīng)的字符串,這樣四個(gè)交易會(huì)形成總的默克爾根。
區(qū)塊鏈(哈希鏈)
大家都知道在區(qū)塊鏈中,每個(gè)區(qū)塊都是一環(huán)套一環(huán)銜接上去的,就像一個(gè)鏈條一樣。我們通過下面的圖片,具體分析一下。
從圖中可以看出鏈的順序是從下往上增長的,最下面塊的高度是277314,這個(gè)區(qū)塊里面包含上一個(gè)區(qū)塊的哈希值:0000…0bdf(紅框1),這里的0000…0bdf是上一個(gè)區(qū)塊(277312)區(qū)塊頭的哈希值。
同理,277315區(qū)塊里面包含的 上一區(qū)塊頭哈希值:0000…2249(紅框3),也是區(qū)塊277314的區(qū)塊頭哈希值,即:0000…2249(紅框2)。同理277316區(qū)塊也是這樣的情況,這也是我們第一節(jié)希望大家多理解的問題。
這樣的情況就保證了任何人可以從某一個(gè)區(qū)塊中,找到這個(gè)區(qū)塊里面包含的 上一區(qū)塊的哈希值,也就是其父區(qū)塊。
現(xiàn)在我們討論的問題都是針對(duì)于區(qū)塊鏈沒有分叉的一個(gè)情況,到后面我們?cè)敿?xì)分析區(qū)塊鏈分叉之后情況又是怎樣的。
通過這三個(gè)區(qū)塊我們能發(fā)現(xiàn),從某種程度上來說區(qū)塊鏈就是一個(gè)哈希鏈。最新產(chǎn)生的區(qū)塊通過哈希值指向上一個(gè)區(qū)塊,上一個(gè)區(qū)塊在指向上上一個(gè)區(qū)塊……一直指向創(chuàng)世區(qū)塊。通過這個(gè)關(guān)系,這些區(qū)塊形成了鏈條,也就是我們常說的區(qū)塊鏈。
這是哈希算法在區(qū)塊鏈中常用到的具體應(yīng)用,大家可以預(yù)先想一下,為什么區(qū)塊鏈中會(huì)使用哈希算法,而不是其他算法呢?后面的課程我們會(huì)給大家進(jìn)行解答。
寬泛科技專注為人工智能、邊緣計(jì)算、影視后期、動(dòng)漫設(shè)計(jì)、商務(wù)應(yīng)用等領(lǐng)域,
提供基于人臉識(shí)別、深度學(xué)習(xí)、視覺計(jì)算、VR/AR/MR、桌面虛擬化、
數(shù)據(jù)存儲(chǔ)及數(shù)據(jù)可視化、視訊會(huì)議等信息化解決方案及服務(wù)。
如果您有合作需求或?qū)氋F建議,歡迎來信。
郵箱:hezuo@kuanfans.com
合作熱線:(021) 5415 5559
官方網(wǎng)站:www.truecolorclub.cn