在講解區(qū)塊鏈1.0技術(shù)是如何實(shí)現(xiàn)的一篇,我們了解到記賬是把交易記錄、交易時(shí)間、賬本序號(hào)、上一個(gè)Hash值等信息計(jì)算Hash打包的過(guò)程。
我們知道所有的計(jì)算和存貯是需要消耗計(jì)算機(jī)資源的,既然要付出成本,那節(jié)點(diǎn)為什么還要參與記賬呢?在中本聰(比特幣之父)的設(shè)計(jì)里,完成記賬的節(jié)點(diǎn)可以獲得系統(tǒng)給與的一定數(shù)量的比特幣獎(jiǎng)勵(lì),這個(gè)獎(jiǎng)勵(lì)的過(guò)程也就是比特幣的發(fā)行過(guò)程,因此大家形象的把記賬稱為“挖礦”,本文將詳細(xì)討論這個(gè)過(guò)程。
記賬工作
由于記賬是有獎(jiǎng)勵(lì)的,每次記賬都可以給自己憑空增加一定數(shù)量的個(gè)比特幣(當(dāng)前是12.5比特幣,博文寫(xiě)作時(shí)每個(gè)比特幣是4萬(wàn)人民幣以上,大家可以算算多少錢(qián)),因此就出現(xiàn)大家爭(zhēng)相記賬,大家一起記賬就會(huì)引起問(wèn)題:出現(xiàn)記賬不一致的問(wèn)題,比特幣系統(tǒng)引入工作量證明來(lái)解決這個(gè)問(wèn)題,規(guī)則如下:
·一段時(shí)間內(nèi)(10分鐘左右,具體時(shí)間會(huì)與密碼學(xué)難題難度相互影響)只有一人可以記賬成功
·通過(guò)解決密碼學(xué)難題(即工作量證明)競(jìng)爭(zhēng)獲得唯一記賬權(quán)
·其他節(jié)點(diǎn)復(fù)制記賬結(jié)果
不過(guò)在進(jìn)行工作量證明之前,記賬節(jié)點(diǎn)會(huì)做進(jìn)行如下準(zhǔn)備工作:
·收集廣播中還沒(méi)有被記錄賬本的原始交易信息
·檢查每個(gè)交易信息中付款地址有沒(méi)有足夠的余額
·驗(yàn)證交易是否有正確的簽名
·把驗(yàn)證通過(guò)的交易信息進(jìn)行打包記錄
·添加一個(gè)獎(jiǎng)勵(lì)交易:給自己的地址增加12.5比特幣
如果節(jié)點(diǎn)爭(zhēng)奪記賬權(quán)成功的話,就可以得到12.5比特幣的獎(jiǎng)勵(lì)。
工作量證明
區(qū)塊鏈記賬原理我們了解到,每次記賬的時(shí)候回把上一個(gè)塊的Hash值和當(dāng)前的賬頁(yè)信息一起作為原始信息進(jìn)行Hash。
如果僅僅是這樣,顯然每個(gè)人都可以很輕松的完成記賬。
為了保證10分鐘左右只有一個(gè)人可以記賬,就必須要提高記賬的難度,使得Hash的結(jié)果必須以若干個(gè)0開(kāi)頭。同是為了滿足這個(gè)條件,在進(jìn)行Hash時(shí)引入一個(gè)隨機(jī)數(shù)變量。
用偽代碼表示一下:
12 | # 沒(méi)有難度時(shí)為:Hash(上一個(gè)Hash值,交易記錄集) = 456635BCDHash(上一個(gè)Hash值,交易記錄集,隨機(jī)數(shù)) = 0000aFD635BCD |
我們知道改變Hash的原始信息的任何一部分,Hash值也會(huì)隨之不斷的變化,因此在運(yùn)算Hash時(shí),不斷的改變隨機(jī)數(shù)的值,總可以找的一個(gè)隨機(jī)數(shù)使的Hash的結(jié)果以若干個(gè)0開(kāi)頭(下文把這個(gè)過(guò)程稱為猜謎),率先找到隨機(jī)數(shù)的節(jié)點(diǎn)就獲得此次記賬的唯一記賬權(quán)。
計(jì)算量分析
(這部分可選閱讀)我們簡(jiǎn)單分析下記賬難度有多大,
Hash值是由數(shù)字和大小寫(xiě)字母構(gòu)成的字符串,每一位有62種可能性(可能為26個(gè)大寫(xiě)字母、26個(gè)小寫(xiě)字母,10個(gè)數(shù)字中任一個(gè)),假設(shè)任何一個(gè)字符出現(xiàn)的概率是均等的,那么第一位為0的概率是1/62(其他位出現(xiàn)什么字符先不管),理論上需要嘗試62次Hash運(yùn)算才會(huì)出現(xiàn)一次第一位為0的情況,如果前兩2位為0,就得嘗試62的平方次Hash運(yùn)算,以n個(gè)0開(kāi)頭就需要嘗試62的n次方次運(yùn)算。我們結(jié)合當(dāng)前實(shí)際區(qū)塊#493050信息來(lái)看看:
我們可以看到Hash值以18個(gè)0開(kāi)頭,理論上需要嘗試62的18次方次,這個(gè)數(shù)是非常非常巨大的,我已經(jīng)算不清楚了,應(yīng)該是億億級(jí)別以上了。如此大的計(jì)算量需要投入大量的計(jì)算設(shè)備、電力等,
目前應(yīng)該沒(méi)有單礦工獨(dú)立參與挖礦了,基本都是由礦工聯(lián)合起來(lái)組成礦池進(jìn)行挖礦(礦池里的礦工按算力百分比來(lái)分收益)。
從經(jīng)濟(jì)的角度講,只有挖礦還有收益(比特幣價(jià)格不斷上漲也讓收益變大),就會(huì)有新的礦工加入,從而加劇競(jìng)爭(zhēng),提高算力難度,挖礦就需要耗費(fèi)更多的運(yùn)算和電力,相互作用引起最終成本會(huì)接近收益。
題外話:國(guó)內(nèi)由于電力成本較低,相對(duì)收益更高,中國(guó)的算力占整個(gè)網(wǎng)絡(luò)的一半以上
驗(yàn)證
在節(jié)點(diǎn)成功找到滿足的Hash值之后,會(huì)馬上對(duì)全網(wǎng)進(jìn)行廣播打包區(qū)塊,網(wǎng)絡(luò)的節(jié)點(diǎn)收到廣播打包區(qū)塊,會(huì)立刻對(duì)其進(jìn)行驗(yàn)證。
如果驗(yàn)證通過(guò),則表明已經(jīng)有節(jié)點(diǎn)成功解迷,自己就不再競(jìng)爭(zhēng)當(dāng)前區(qū)塊打包,而是選擇接受這個(gè)區(qū)塊,記錄到自己的賬本中,然后進(jìn)行下一個(gè)區(qū)塊的競(jìng)爭(zhēng)猜謎。
網(wǎng)絡(luò)中只有最快解謎的區(qū)塊,才會(huì)添加的賬本中,其他的節(jié)點(diǎn)進(jìn)行復(fù)制,這樣就保證了整個(gè)賬本的唯一性。
假如節(jié)點(diǎn)有任何的作弊行為,都會(huì)導(dǎo)致網(wǎng)絡(luò)的節(jié)點(diǎn)驗(yàn)證不通過(guò),直接丟棄其打包的區(qū)塊,這個(gè)區(qū)塊就無(wú)法記錄到總賬本中,作弊的節(jié)點(diǎn)耗費(fèi)的成本就白費(fèi)了,因此在巨大的挖礦成本下,也使得礦工自覺(jué)自愿的遵守比特幣系統(tǒng)的共識(shí)協(xié)議,也就確保了整個(gè)系統(tǒng)的安全。
進(jìn)階閱讀比特幣區(qū)塊結(jié)構(gòu)Merkle樹(shù)及簡(jiǎn)單支付驗(yàn)證分析,可以詳細(xì)了解區(qū)塊結(jié)構(gòu)如何驗(yàn)證交易。
說(shuō)明
礦工的收益其實(shí)不僅僅包含新發(fā)行的12.5比特幣獎(jiǎng)勵(lì),同時(shí)還有交易費(fèi)收益(本文忽略一些細(xì)節(jié)是為了讓主干更清晰)。
有興趣的同學(xué)可以看看圖中區(qū)塊都包含了那些信息,紅箭頭標(biāo)示出的是本文涉及的信息。
新聞熱點(diǎn)
疑難解答
圖片精選