Bitcoin 中的挖矿算法(6) 难度调整
生活随笔
收集整理的這篇文章主要介紹了
Bitcoin 中的挖矿算法(6) 难度调整
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 基本概念
難度調整方法:
difficulty_new = difficulty * ( 2016 ActualTimespan / 2016 targetTimespan )新的難度目標值 = 舊的難度目標值 * 生成最近2016個區塊所花費的實際時間 / 系統期望生成2016個區塊的時間難度的調整是在每個完整節點中獨立自動發生的。每2016個區塊,所有節點都會按統一的公式自動調整難度,這個公式是由最新2016個區塊的花費時長與期望時長(期望時長為20160分鐘即兩周,是按每10分鐘一個區塊的產生速率計算出的總時長)比較得出的,根據實際時長與期望時長的比值,進行相應調整(或變難或變易)。也就是說,如果區塊產生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。
2. 難度調整周期
比特幣系統是以2016個區塊為一個周期自動進行難度調整的,2016是這樣算出來的:比特幣規定2個星期,即14天,進行一次難度調整,平均每10分鐘生成一個區塊,按此計算,即2016個區塊調整一次。看下params.DifficultyAdjustmentInterval()方法:
int64_t DifficultyAdjustmentInterval() const{ return nPowTargetTimespan / nPowTargetSpacing; } nPowTargetTimespan 即 系統期望生成2016個區塊的時間 。chainparams.cpp里面的參數:
// two weeks, 20160min consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; consensus.nPowTargetSpacing = 10 * 60;//每10分鐘一個區塊 consensus.fPowAllowMinDifficultyBlocks = false; consensus.fPowNoRetargeting = false; consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016 consensus.nMinerConfirmationWindow = 2016;// nPowTargetTimespan / nPowTargetSpacing3. 計算難度目標
nBits代表著工作量證明的難度目標值,這個值是由系統計算生成的
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
4. 計算新的難度目標
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params) {if (params.fPowNoRetargeting)return pindexLast->nBits;// Limit adjustment step// 計算生成最近的2016個區塊實際花費了多少時間int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;//這里需要限制調整的步長,即把實際花費的時間限制在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);//舊的難度目標值bnNew *= nActualTimespan;bnNew /= params.nPowTargetTimespan;if (bnNew > bnPowLimit)bnNew = bnPowLimit;return bnNew.GetCompact(); }總結
以上是生活随笔為你收集整理的Bitcoin 中的挖矿算法(6) 难度调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bitcoin 中的挖矿算法(5) 难度
- 下一篇: 区块链预言机(1)初识API网关