本系列內容包含:基本概念及原理、密碼學、共識演算法、錢包及節點原理、挖礦原理及實現。
挖礦
以比特幣網路為例,比特幣挖礦主要使用到的演算法是SHA-256,其具體流程參見下圖。
我們從上往下進行分析:
第一層是:n Version(版本號);
第二層是:hash Preb Block(前一個區塊的雜湊);
第三層是:hash Merkle Root(交易Merkle樹根),
第四層是:n Time(時間戳);
第五層是:n Bits(難度值);
第六層是:n Nonce(隨機數);
第七層是:Hash(雜湊函式)。
裡面的n代表連續0的個數,該值要小於當前區塊難度目標值m,挖到塊的條件是前n個位元位全部為0,n越大,難度越大。假設最低難度對應最大目標值為M,則區塊難度為:M/m
看過前面課程的朋友應該會有印象,這些全部是區塊頭中的資料欄位。
再來看左邊,我們分析一下為什麼其中有些是固定而有些是可變的。
1.版本號和前一個區塊雜湊是固定的,以比特幣為例,假設當前比特幣區塊高度為N,如果某人想挖接下來N+1區塊的話,那麼這個時候版本號必須是固定的,前一個區塊的雜湊必須也是固定的。因為在不存在分叉的情況下,當前區塊包含上一個區塊的雜湊值;
也就是N-1區塊的雜湊值加上N區塊資料算出N區塊雜湊值,然後將N區塊雜湊值當成N+1區塊的的前一區塊雜湊值。這裡有點繞,希望大家多理解一下;
2.交易Merkle根是可變的,為什麼說可變呢?因為在挖礦的時候,肯定會準備一個打包區塊,打包區塊形成的時候,礦工會根據自己的需求或根據利益演算法,將交易打包進去,最後整理成一個Merkle根;
3.時間戳是可變的,挖礦有個時間範圍,在這個時間範圍內挖出的礦都為有效,所以在有效時間內的時間是可以任意調節的;
4.難度值在一定週期內是固定的,會隨著週期的改變而變化;
5.Nonce是可變的,這裡就不展開講了,忘記的朋友可以翻閱前面的講解。
在挖礦的時候,到Nonce的時候,由於時間戳和Merkle根都已經經過計算固定了,這時只需要改變Nonce就可以了。此時可以把這7個資料看成一個整體,前面6個資料是X,把X放在雜湊函式里面,會出來一個值,比如說Y值。
由於比特幣網路裡使用的雜湊演算法是SHA-256,當Y值出來之後,就會得到一個256個由0和1組成的字串。這個字串出來之後,它會和X裡面的難度值比較大小。
每計算一次,也就是透過了一個Nonce,就會產生一個Y值,Y值會和難度值比較大小,如果Y值小於難度值,此時就找到了一個有效的Nonce,礦也就挖出來了。
生成地址
地址的生成中也用到了雜湊演算法。從下圖可以看到從公鑰到比特幣地址生成的流程。
第一層:生成公鑰(如何生成會在後續課程解答);
第二層:兩層雜湊演算法,SHA-265和RIPMD-160(常稱為雙雜湊或Hash260);
第三層:然後雙層雜湊計算,會產生公鑰雜湊;
第四層:Base58Check編碼(在Base58編碼基礎上的改良);
第五層:經過編碼,得到一個編碼串,這個編碼串就是公鑰雜湊即比特幣地址。
形成 Merkle tree 和交易Hash
在默克樹樹結構和形成交易雜湊裡面也使用到了雜湊演算法。
上圖的默克樹中,最底層有4個葉子節點,最左邊H A下面有個Hash(TxA),意思是:Tx表示交易,A表示交易編號。
假設現在使用的雜湊演算法是SHA-256,那麼交易產生時,會對HA、HB分別進行雜湊計算,會分別得到2個由256個0和1組成的字串。同理,HC、HD也會得到相應的字串,這樣四個交易會形成總的默克爾根。
區塊鏈(雜湊鏈)
大家都知道在區塊鏈中,每個區塊都是一環套一環銜接上去的,就像一個鏈條一樣。我們透過下面的圖片,具體分析一下。
從圖中可以看出鏈的順序是從下往上增長的,最下面塊的高度是277314,這個區塊裡面包含上一個區塊的雜湊值:0000…0bdf(紅框1),這裡的0000…0bdf是上一個區塊(277312)區塊頭的雜湊值。
同理,277315區塊裡面包含的 上一區塊頭雜湊值:0000…2249(紅框3),也是區塊277314的區塊頭雜湊值,即:0000…2249(紅框2)。同理277316區塊也是這樣的情況,這也是我們第一節希望大家多理解的問題。
這樣的情況就保證了任何人可以從某一個區塊中,找到這個區塊裡面包含的 上一區塊的雜湊值,也就是其父區塊。
現在我們討論的問題都是針對於區塊鏈沒有分叉的一個情況,到後面我們詳細分析區塊鏈分叉之後情況又是怎樣的。
透過這三個區塊我們能發現,從某種程度上來說區塊鏈就是一個雜湊鏈。最新產生的區塊透過雜湊值指向上一個區塊,上一個區塊在指向上上一個區塊……一直指向創世區塊。透過這個關係,這些區塊形成了鏈條,也就是我們常說的區塊鏈。
這是雜湊演算法在區塊鏈中常用到的具體應用,大家可以預先想一下,為什麼區塊鏈中會使用雜湊演算法,而不是其他演算法呢?後面的課程我們會給大家進行解答。
下節預告:什麼是雜湊