Bitcoin 中的挖矿算法(6) 难度调整
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 / nPowTargetSpacing3. 計(jì)算難度目標(biāo)
nBits代表著工作量證明的難度目標(biāo)值,這個(gè)值是由系統(tǒng)計(jì)算生成的
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
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)題。
- 上一篇: Bitcoin 中的挖矿算法(5) 难度
- 下一篇: 区块链预言机(1)初识API网关