最近幾年比特幣的火爆帶動了人們對區塊鏈技術的研究。當然我們在這里並不討論區塊鏈技術本身,而是討論一下區塊鏈中的SHA算法的應用。對於SHA系列算法我們已經在前面作了說明,在這里也不再重復。
1、區塊鏈中的SHA
區塊鏈中用到了SHA,可是究竟什么地方使用到了SHA算法呢?為了解決這個問題,我們必須先來了解下區塊鏈的組成結構。每個區塊都包括了一個被稱為魔法數的常數、區塊的大小、區塊頭、區塊所包含的交易數量及部分或所有的近期新交易。區塊的具體結構如下所示:
數據項 |
描述 |
長度 |
Magic no(魔法數) |
總是0xD9B4BEF9 |
4字節 |
Blocksize(區塊大小) |
到區塊結束的字節長度 |
4字節 |
Blockheader(區塊頭) |
包含6個數據項 |
80字節 |
Transaction counter(交易數量) |
正整數VI=VarInt |
1-9字節 |
Transactions(交易) |
交易列表(非空) |
<Transaction counter>-許多交易 |
從上表中我們似乎並沒有發現SHA的蹤影。上表中除了區塊頭,其他部分的含義都是非常明確的。所以接下來我們就需要中點看一下區塊頭,看看它究竟是什么含義。事實上,在每個區塊中,對整個區塊鏈起決定作用的是區塊頭。既然如此,拿去塊頭又有哪些內容呢?其具體的結構如下:
數據項 |
目的 |
更新時間 |
大小(字節) |
Version(版本) |
區塊版本號 |
更新軟件后,它指定了一個新的版本號 |
4 |
hashPrevBlock(前一區塊的Hash) |
前一區塊的256位Hash值 |
新的區塊進來時 |
32 |
hashMerkleRoot Merkle(根節點Hash值) |
基於一個區塊中所有交易的256位Hash值 |
接受一個交易時 |
32 |
Time(時間戳) |
從1970-01-01 00:00 UTC開始到現在,以秒為單位的當前時間戳 |
每幾秒就更新 |
4 |
Bits(當前目標的Hash值) |
壓縮格式的當前目標Hash值 |
當挖礦難度調整時 |
4 |
Nonce(隨機數) |
從0開始的32位隨機數 |
產生Hash時(每次產生Hash隨機數時都要增長) |
4 |
如上表所示,在這個區塊頭的結構中,我們終於看到了SHA的蹤影,就是hash值,它就是通過SHA算法計算得到的。
2、區塊鏈如何使用SHA
在上一節,我們明白了SHA在區塊中的位置,那么在區塊鏈中究竟是如何使用SHA的呢?我們再看一看前面區塊頭的格式,有兩個256位的Hash值:hashPrevBlock(前一區塊的Hash)和hashMerkleRoot Merkle(區塊體的Hash值),這兩個Hash值是如何我得到的呢?
前一區塊的Hash值采用的計算公式為:前一區塊的Hash值=SHA256(前一區塊的區塊頭);而區塊體的Hash值采用的計算公式為:區塊體的Hash值=SHA256(本區塊的區塊體)。
由上面兩個計算公式我們不難推斷,一個區塊不但與自身的內容有關,同時也與前一個區塊的內容有關。也就是說一個區塊的內容不但影響自身,而且對后續的區塊都有影響。因為任何內容的變化,都會導致本區塊Hash值的變化,從而導致區塊頭的變化。而區塊頭的變化就會導致后續區塊的區塊頭的變化出現連鎖反應。
3、區塊鏈為何使用SHA
前面我們已經說明了區塊鏈中如何使用Hash值,接下來我們來說一說為何要使用SHA。這與區塊鏈的技術要求以及SHA算法的特性有直接的關系。
首先,區塊鏈本身要保證每一條都是獨一無二。因為絕不能出現兩條一樣的數據,而SHA256極低的碰撞概率正好能夠保證這一點。每個區塊的Hash之都是唯一的正好可以用來標識該區塊。
其次,區塊鏈要保證每條記錄的安全性,而SHA算法可以保證哪怕只有微不足道的差別,也能產生大相徑庭的結果。結合區塊鏈的結構,當任意區塊發生變化時,都會影響后續的所有區塊,所以如果想要修改某個區塊的內容,就必須修改后許所有區塊的內容,而這幾乎是不可能的,從而保證了區塊數據的安全。
再者,SHA的結果長度是固定的,而與具體的原文內容無關,這樣可以保證區塊鏈中每個區塊的格式以及用來標識區塊的區塊頭的大小是完全一致的,但卻絕對不會重復。
綜上所述,區塊鏈使用SHA算法是一種技術上的必然選擇,即使不采用SHA也必是與SHA具有相似特性的其它算法。
歡迎關注: