資源描述:
《比特幣挖礦難度精講.doc》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、比特幣主鏈上,平均每十分鐘會出一個塊。隨著數(shù)字貨幣的發(fā)展,參與的miner數(shù)量與日俱增,挖礦技術(shù)日新月異,全網(wǎng)的算力也是以驚人的速度增長。BTC中為了保證主鏈平均的高度增加速度依然維持最初設(shè)定,進(jìn)而設(shè)置了挖礦難度調(diào)整的功能。深入理解挖礦難度的概念,以及挖礦難度調(diào)整的方案,對開發(fā)人員以及miner都很重要,因?yàn)橥诘V難度設(shè)置不合理可能會導(dǎo)致全網(wǎng)出塊速度極不穩(wěn)定。本文將詳細(xì)介紹BTC&BCH挖礦難度及調(diào)整方案,我們先從PoW算法講起。?1、PoW算法PoW(Proof-of-Work)工作量證明算法是一種對應(yīng)服務(wù)與資源濫用、或是
2、阻斷服務(wù)攻擊的經(jīng)濟(jì)對策。一般是要求用戶進(jìn)行一些耗時適當(dāng)?shù)膹?fù)雜運(yùn)算,并且答案能被服務(wù)方快速驗(yàn)算,以此耗用的時間、設(shè)備與能源做為擔(dān)保成本,以確保服務(wù)與資源是被真正的需求所使用。PoW算法具有:去中心化,單向,隨機(jī)性,目標(biāo)難度易調(diào)整等特點(diǎn),所以現(xiàn)在包括BTC,BCH在內(nèi)的很多幣種都采用了PoW共識機(jī)制。從實(shí)現(xiàn)上來說,PoW算法的輸入為任意長度,輸出為固定長度,比如通常使用SHA256算法對應(yīng)輸出256-bit。在挖礦過程中miner用PoW算法計算整個塊頭的hash值,由于SHA256的特性:塊頭任意一位發(fā)生變化,得到的hash
3、值會變得完全不一樣,而且大小變化方向不確定。于是,我們比較hash值是否小于某個值(實(shí)際上這個值是保存在塊頭中的nBit「解壓后」的current_target值)來判斷是否滿足要求;如果小于,則廣播這個區(qū)塊;如果不小于,則按照當(dāng)前挖礦節(jié)點(diǎn)的規(guī)則改變塊頭中可以改變的值,然后再次計算塊頭hash值,以此往復(fù),直到結(jié)果小于目標(biāo)值。由此可知,current_target值越小,滿足挖礦要求的概率就越小,挖礦難度就越大。?2、塊頭&Coinbase交易塊頭的生成:當(dāng)miner開始新一輪打包之后,首先會創(chuàng)建一個空的塊,塊結(jié)構(gòu)分為塊頭
4、以及塊信息兩部分。先打包塊信息,再根據(jù)塊信息填充塊頭。首先看一下已經(jīng)成功打包的塊。下圖是寫本文稿時截取最新的BTCblock詳情。塊信息存放的是從mempool里取出來的一系列交易信息,miner并以此創(chuàng)建了一個MerkleTree,交易信息的hash值作為leaf,最終生成的MerkleRoot將填到塊頭里。值得注意的是,交易列表中的第一個是一個非常獨(dú)特的交易:CoinbaseTransaction。CoinbaseTransaction與普通交易主要的區(qū)別有:1)CoinbaseTransaction不消耗UTXO2)
5、input只有一個,叫做Coinbase3)output的addresss為miner的btc/bch地址4)value由挖礦獎勵和交易費(fèi)組成5)更值得注意的是input中沒有Unlocking-script,取而代之的是CoinbaseData(這部分?jǐn)?shù)據(jù)包含ExtraNonce,在挖礦難度非常高時,將起非常重要的作用)Coinbase交易input的結(jié)構(gòu)如下:Coinbasedata,該字段數(shù)據(jù)長度范圍為2-byte~100-byte:blockheight起初Coinbase是不包含塊高度信息,由于重復(fù)交易的問題出現(xiàn)
6、,誕?了BIP30,隨后第二套解決方案BIP34)。BIP34規(guī)定Coinbasedata最高字節(jié)表示用于表示塊高度的數(shù)據(jù)段的字節(jié)數(shù),接下來的字節(jié)以?端法表示具體的塊高度,創(chuàng)世塊的高度為0。例如:2013-12-28BTC的一個塊的Coinbase解析中coinbasedata為0x03443b04...,則塊高度用16進(jìn)制表示為0x043b44,十進(jìn)制為;extranonce作為中間字段,將會在后續(xù)提及的ExtraNonceSolution詳細(xì)說明作用;上圖Coinbasedata中用以結(jié)尾的「/P2SH/」是12年mi
7、ner進(jìn)行投票支持BTC是采用BIP16還是BIP17的產(chǎn)物,現(xiàn)已棄用。(眾所周知,BIP16P2SH獲得了更多票數(shù),被BTC采用)在交易信息聚合完畢得到了MerkleRoot之后,接下來填充區(qū)塊頭。塊頭結(jié)構(gòu)如下(其中nBit就是PoW小節(jié)提到的current-target的壓縮版):區(qū)塊頭80-byte,一共6個字段:1.版本號,允許改變但不推薦2.前一個塊的hash值,不允許改變3.MerkleRoot的hash值,用于存塊信息里的交易的MerkleTree的root節(jié)點(diǎn)的值,允許改變(改變coinbase中input
8、中的值)1.時間戳,允許基于MTP11進(jìn)行調(diào)整改變2.nonce,用于PoW算法的隨機(jī)值,允許改變3.nBit,PoW算法結(jié)果必須小于這個數(shù)對應(yīng)的current_target才能算塊打包成功。這個值是在每一個塊開始打包之前就確定了,不允許改變塊頭中80bytes任意一個值發(fā)生改變,PoW的Hash結(jié)果就