日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Bitcoin 中的挖矿算法(6) 难度调整

發(fā)布時(shí)間:2025/3/21 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bitcoin 中的挖矿算法(6) 难度调整 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 基本概念

難度調(diào)整方法:

difficulty_new = difficulty * ( 2016 ActualTimespan / 2016 targetTimespan )新的難度目標(biāo)值 = 舊的難度目標(biāo)值 * 生成最近2016個(gè)區(qū)塊所花費(fèi)的實(shí)際時(shí)間 / 系統(tǒng)期望生成2016個(gè)區(qū)塊的時(shí)間

難度的調(diào)整是在每個(gè)完整節(jié)點(diǎn)中獨(dú)立自動(dòng)發(fā)生的。每2016個(gè)區(qū)塊,所有節(jié)點(diǎn)都會(huì)按統(tǒng)一的公式自動(dòng)調(diào)整難度,這個(gè)公式是由最新2016個(gè)區(qū)塊的花費(fèi)時(shí)長(zhǎng)與期望時(shí)長(zhǎng)(期望時(shí)長(zhǎng)為20160分鐘即兩周,是按每10分鐘一個(gè)區(qū)塊的產(chǎn)生速率計(jì)算出的總時(shí)長(zhǎng))比較得出的,根據(jù)實(shí)際時(shí)長(zhǎng)與期望時(shí)長(zhǎng)的比值,進(jìn)行相應(yīng)調(diào)整(或變難或變易)。也就是說(shuō),如果區(qū)塊產(chǎn)生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。

2. 難度調(diào)整周期

比特幣系統(tǒng)是以2016個(gè)區(qū)塊為一個(gè)周期自動(dòng)進(jìn)行難度調(diào)整的,2016是這樣算出來(lái)的:比特幣規(guī)定2個(gè)星期,即14天,進(jìn)行一次難度調(diào)整,平均每10分鐘生成一個(gè)區(qū)塊,按此計(jì)算,即2016個(gè)區(qū)塊調(diào)整一次。看下params.DifficultyAdjustmentInterval()方法:

int64_t DifficultyAdjustmentInterval() const{ return nPowTargetTimespan / nPowTargetSpacing; } nPowTargetTimespan 即 系統(tǒng)期望生成2016個(gè)區(qū)塊的時(shí)間 。

chainparams.cpp里面的參數(shù):

// two weeks, 20160min consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; consensus.nPowTargetSpacing = 10 * 60;//每10分鐘一個(gè)區(qū)塊 consensus.fPowAllowMinDifficultyBlocks = false; consensus.fPowNoRetargeting = false; consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016 consensus.nMinerConfirmationWindow = 2016;// nPowTargetTimespan / nPowTargetSpacing

3. 計(jì)算難度目標(biāo)

nBits代表著工作量證明的難度目標(biāo)值,這個(gè)值是由系統(tǒng)計(jì)算生成的
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());

unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params) {assert(pindexLast != nullptr);unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();// Only change once per difficulty adjustment interval//如果新區(qū)塊不需要進(jìn)行難度調(diào)整,即新區(qū)塊的高度不能被2016整除,則用父區(qū)塊的難度目標(biāo)即可if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0){if (params.fPowAllowMinDifficultyBlocks){// Special difficulty rule for testnet:// If the new block's timestamp is more than 2* 10 minutes// then allow mining of a min-difficulty block.if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2)return nProofOfWorkLimit;else{// Return the last non-special-min-difficulty-rules-blockconst CBlockIndex* pindex = pindexLast;while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 &&pindex->nBits == nProofOfWorkLimit)pindex = pindex->pprev;return pindex->nBits;}}return pindexLast->nBits;}// Go back by what we want to be 14 days worth of blocks//到了這里說(shuō)明新區(qū)塊恰好需要進(jìn)行難度調(diào)整,//即新區(qū)塊的高度能被2016整除,則進(jìn)行一次難度調(diào)整,計(jì)算新的難度目標(biāo)int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);assert(nHeightFirst >= 0);const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);assert(pindexFirst);return CalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params); }

4. 計(jì)算新的難度目標(biāo)

unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params) {if (params.fPowNoRetargeting)return pindexLast->nBits;// Limit adjustment step// 計(jì)算生成最近的2016個(gè)區(qū)塊實(shí)際花費(fèi)了多少時(shí)間int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;//這里需要限制調(diào)整的步長(zhǎng),即把實(shí)際花費(fèi)的時(shí)間限制在0.5周和8周之間if (nActualTimespan < params.nPowTargetTimespan/4)//params.nPowTargetTimespan是2周,即20160分鐘nActualTimespan = params.nPowTargetTimespan/4;if (nActualTimespan > params.nPowTargetTimespan*4)nActualTimespan = params.nPowTargetTimespan*4;// Retargetconst arith_uint256 bnPowLimit = UintToArith256(params.powLimit);arith_uint256 bnNew;bnNew.SetCompact(pindexLast->nBits);//舊的難度目標(biāo)值bnNew *= nActualTimespan;bnNew /= params.nPowTargetTimespan;if (bnNew > bnPowLimit)bnNew = bnPowLimit;return bnNew.GetCompact(); }

總結(jié)

以上是生活随笔為你收集整理的Bitcoin 中的挖矿算法(6) 难度调整的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。