?一.前言
????????????在了解pow共識機制前久信,我們先了解下比特幣區(qū)塊的結(jié)構(gòu),下圖是比特幣區(qū)塊的結(jié)構(gòu)圖:
????????從圖上可知漓摩,比特幣的結(jié)構(gòu)分為區(qū)塊頭和區(qū)塊體裙士,其中區(qū)塊頭細分為:
????????父區(qū)塊頭哈希值:前一區(qū)塊的哈希值,使用SHA256(SHA256(父區(qū)塊頭))計算管毙。占32字節(jié)
????????版本:區(qū)塊版本號腿椎,表示本區(qū)塊遵守的驗證規(guī)則 。占4字節(jié)
????????時間戳:該區(qū)塊產(chǎn)生的近似時間夭咬,精確到秒的UNIX時間戳啃炸,必須嚴格大于前11個區(qū)塊時間的中值,同時全節(jié)點也會拒絕那些超出自己2個小時時間戳的區(qū)塊卓舵。占4字節(jié)
????????難度:該區(qū)塊工作量證明算法的難度目標南用,已經(jīng)使用特定算法編碼。占4字節(jié)
????????隨機數(shù)(Nonce):為了找到滿足難度目標所設定的隨機數(shù)掏湾,為了解決32位隨機數(shù)在算力飛升的情況下不夠用的問題裹虫,規(guī)定時間戳和coinbase交易信息均可更改,以此擴展nonce的位數(shù)融击。占4字節(jié)
????????Merkle根:該區(qū)塊中交易的Merkle樹根的哈希值筑公,同樣采用SHA256(SHA256())計算。占32字節(jié)
????????如此尊浪,細心的同學會發(fā)現(xiàn)匣屡,區(qū)塊頭總共占了80字節(jié)。
????????區(qū)塊體除了籌幣交易記錄(由一棵Merkle二叉樹組成)外耸采,還有一個交易計數(shù)兴泥。
? ? ? ? 比特幣的任何一個節(jié)點,想生成一個新的區(qū)塊虾宇,必須使用自己節(jié)點擁有的算力解算出pow問題搓彻。因此,我們先了解下pow工作量證明的三要素嘱朽。
二.pow工作量證明三要素
????????在前言中介紹完比特幣區(qū)塊后旭贬,接下來我們了解下pow機制需要滿足哪些要素?
? ? ? ? 1.工作量證明函數(shù)
? ??????????????????在比特幣中使用的是SHA256算法函數(shù)搪泳,是密碼哈希函數(shù)家族中輸出值為256位的哈希算法稀轨。
? ? ? ? 2.區(qū)塊
? ????????????????區(qū)塊頭在前言中已經(jīng)做詳細介紹,這里我們就介紹下區(qū)塊體的?Merkle樹算法:
? ? ? ? 如上圖所示岸军,首先對4個交易記錄L1--L4,分別計算hash(L1)--hash(L4),然后計算hash0=hash0-0+hash0-1和hash1=hash1-0+hash1-1奋刽,最后計算出根節(jié)點的hash值top hash。
3.難度值
? ? ? ? 關于難度值艰赞,我們直接看公式:
????????新難度值=舊難度值*(過去2016個區(qū)塊花費時長/20160分鐘)
????????目標值=最大目標值/難度值
? ? ? ? 新難度值解析:撇開舊難度值佣谐,按比特幣理想情況每10分鐘出塊的速度,過去2016個塊的總花費接近20160分鐘方妖,這樣狭魂,這個值永遠趨近于1。
? ? 目標值解析:最大目標值為一個固定數(shù)(具體可查閱資料了解党觅,這里不做詳述)雌澄,若過去2016個區(qū)塊花費時長少于20160分,那么這個系數(shù)會小杯瞻,目標值將會被調(diào)大些镐牺,反之,目標值會被調(diào)小又兵,因此任柜,比特幣的難度和出塊速度將成反比例適當調(diào)整出塊速度。
????????介紹完pow工作量證明的三要素后沛厨,我們就可以講解下工作量證明的流程
三.pow工作量證明流程
從流程圖中看出宙地,pow工作量證明的流程主要經(jīng)歷三步:
1.生成Merkle根哈希
? ? ? ? ? ? 生成Merkle根哈希在第二章節(jié)中的第2要素中已經(jīng)有講解,即節(jié)點自己生成一筆籌幣交易逆皮,并且與其他所有即將打包的交易通過Merkle樹算法生成Merkle根哈希宅粥,所以為什么說區(qū)塊是工作量證明的三要素之一。
2.組裝區(qū)塊頭
? ? ? ? 區(qū)塊頭將被作為計算出工作量證明輸出的一個輸入?yún)?shù)电谣,因此第一步計算出來的Merkle根哈希和區(qū)塊頭的其他組成部分組裝成區(qū)塊頭秽梅,這也就是為什么我們在前言中大費周章的去提前講解比特幣的區(qū)塊頭抹蚀。
3.計算出工作量證明的輸出
? ? ? ? ? ?下面我們直接通過公式和一些偽代碼去理解工作量證明的輸出:
? ? ? ? ? ?i. 工作量證明的輸出=SHA256(SHA256(區(qū)塊頭))
? ? ? ? ? ?ii. if(工作量證明的輸出<目標值),證明工作量完成
? ? ? ? ? ?iii.if(工作量證明的輸出>=目標值),變更隨機數(shù)企垦,遞歸i的邏輯环壤,繼續(xù)與目標值比對。
? ? ? ? ? 注:目標值的計算見第二章節(jié)的要素3的難度值钞诡。
????????上面的流程圖及解析即pow工作量證明的整個過程郑现。
四.pow共識記賬
? ? ? ? 第三章中講解的是單節(jié)點工作量證明流程,有了這個計算流程荧降,我們就得將其使用起來接箫,在比特幣平臺中,中本聰就是運用的pow工作量證明來使全網(wǎng)節(jié)點達到51%及以上的共識記賬朵诫,以下將介紹pow工作量證明共識是如何記賬的辛友?
? ? ? ? 首先,客戶端產(chǎn)生新的交易剪返,向全網(wǎng)廣播
????????第二废累,每個節(jié)點收到請求,將交易納入?yún)^(qū)塊中
????????第三脱盲,每個節(jié)點通過第三章中描述的pow工作量證明
????????第四九默,當某個節(jié)點找到了證明,向全網(wǎng)廣播
????????第五宾毒,當且僅當該區(qū)塊的交易是有效的且在之前中未存在的,其他節(jié)點才認同該區(qū)塊的有效性
????????第六殿遂,接受該區(qū)塊且在該區(qū)塊的末尾制造新的區(qū)塊
大概時序圖如下: