區(qū)塊鏈共識技術(shù)一:pow共識機(jī)制

?一.前言

????????????在了解pow共識機(jī)制前,我們先了解下比特幣區(qū)塊的結(jié)構(gòu),下圖是比特幣區(qū)塊的結(jié)構(gòu)圖:

比特幣區(qū)塊結(jié)構(gòu)圖

????????從圖上可知,比特幣的結(jié)構(gòu)分為區(qū)塊頭和區(qū)塊體,其中區(qū)塊頭細(xì)分為:

????????父區(qū)塊頭哈希值:前一區(qū)塊的哈希值,使用SHA256(SHA256(父區(qū)塊頭))計算。占32字節(jié)

????????版本:區(qū)塊版本號,表示本區(qū)塊遵守的驗證規(guī)則 。占4字節(jié)

????????時間戳:該區(qū)塊產(chǎn)生的近似時間,精確到秒的UNIX時間戳,必須嚴(yán)格大于前11個區(qū)塊時間的中值,同時全節(jié)點也會拒絕那些超出自己2個小時時間戳的區(qū)塊。占4字節(jié)

????????難度:該區(qū)塊工作量證明算法的難度目標(biāo),已經(jīng)使用特定算法編碼。占4字節(jié)

????????隨機(jī)數(shù)(Nonce):為了找到滿足難度目標(biāo)所設(shè)定的隨機(jī)數(shù),為了解決32位隨機(jī)數(shù)在算力飛升的情況下不夠用的問題,規(guī)定時間戳和coinbase交易信息均可更改,以此擴(kuò)展nonce的位數(shù)。占4字節(jié)

????????Merkle根:該區(qū)塊中交易的Merkle樹根的哈希值,同樣采用SHA256(SHA256())計算。占32字節(jié)

????????如此,細(xì)心的同學(xué)會發(fā)現(xiàn),區(qū)塊頭總共占了80字節(jié)。

????????區(qū)塊體除了籌幣交易記錄(由一棵Merkle二叉樹組成)外,還有一個交易計數(shù)。

? ? ? ? 比特幣的任何一個節(jié)點,想生成一個新的區(qū)塊,必須使用自己節(jié)點擁有的算力解算出pow問題。因此,我們先了解下pow工作量證明的三要素。


二.pow工作量證明三要素

????????在前言中介紹完比特幣區(qū)塊后,接下來我們了解下pow機(jī)制需要滿足哪些要素?

? ? ? ? 1.工作量證明函數(shù)

? ??????????????????在比特幣中使用的是SHA256算法函數(shù),是密碼哈希函數(shù)家族中輸出值為256位的哈希算法。

? ? ? ? 2.區(qū)塊

? ????????????????區(qū)塊頭在前言中已經(jīng)做詳細(xì)介紹,這里我們就介紹下區(qū)塊體的?Merkle樹算法:

Merkle樹算法圖解

? ? ? ? 如上圖所示,首先對4個交易記錄L1--L4,分別計算hash(L1)--hash(L4),然后計算hash0=hash0-0+hash0-1和hash1=hash1-0+hash1-1,最后計算出根節(jié)點的hash值top hash。

3.難度值

? ? ? ? 關(guān)于難度值,我們直接看公式:

????????新難度值=舊難度值*(過去2016個區(qū)塊花費(fèi)時長/20160分鐘)

????????目標(biāo)值=最大目標(biāo)值/難度值

? ? ? ? 新難度值解析:撇開舊難度值,按比特幣理想情況每10分鐘出塊的速度,過去2016個塊的總花費(fèi)接近20160分鐘,這樣,這個值永遠(yuǎn)趨近于1。

? ? 目標(biāo)值解析:最大目標(biāo)值為一個固定數(shù)(具體可查閱資料了解,這里不做詳述),若過去2016個區(qū)塊花費(fèi)時長少于20160分,那么這個系數(shù)會小,目標(biāo)值將會被調(diào)大些,反之,目標(biāo)值會被調(diào)小,因此,比特幣的難度和出塊速度將成反比例適當(dāng)調(diào)整出塊速度。

????????介紹完pow工作量證明的三要素后,我們就可以講解下工作量證明的流程

三.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ū)塊頭,這也就是為什么我們在前言中大費(fèi)周章的去提前講解比特幣的區(qū)塊頭。

3.計算出工作量證明的輸出

? ? ? ? ? ?下面我們直接通過公式和一些偽代碼去理解工作量證明的輸出:

? ? ? ? ? ?i. 工作量證明的輸出=SHA256(SHA256(區(qū)塊頭))

? ? ? ? ? ?ii. if(工作量證明的輸出<目標(biāo)值),證明工作量完成

? ? ? ? ? ?iii.if(工作量證明的輸出>=目標(biāo)值),變更隨機(jī)數(shù),遞歸i的邏輯,繼續(xù)與目標(biāo)值比對。

? ? ? ? ? 注:目標(biāo)值的計算見第二章節(jié)的要素3的難度值。

????????上面的流程圖及解析即pow工作量證明的整個過程。


四.pow共識記賬

? ? ? ? 第三章中講解的是單節(jié)點工作量證明流程,有了這個計算流程,我們就得將其使用起來,在比特幣平臺中,中本聰就是運(yùn)用的pow工作量證明來使全網(wǎng)節(jié)點達(dá)到51%及以上的共識記賬,以下將介紹pow工作量證明共識是如何記賬的?

? ? ? ? 首先,客戶端產(chǎn)生新的交易,向全網(wǎng)廣播

????????第二,每個節(jié)點收到請求,將交易納入?yún)^(qū)塊中

????????第三,每個節(jié)點通過第三章中描述的pow工作量證明

????????第四,當(dāng)某個節(jié)點找到了證明,向全網(wǎng)廣播

????????第五,當(dāng)且僅當(dāng)該區(qū)塊的交易是有效的且在之前中未存在的,其他節(jié)點才認(rèn)同該區(qū)塊的有效性

????????第六,接受該區(qū)塊且在該區(qū)塊的末尾制造新的區(qū)塊

大概時序圖如下:

pow工作量證明共識機(jī)制時序圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容