Difficulty
一個關於難度方程的問題
當我讀到這本書比特幣大師時,我在理解第 8 章的“難點”時遇到了問題。
有一個難度方程:
New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)
我感到困惑。
根據公式,如果實際時間長於20160分鐘,那麼新難度會大於舊難度,那麼實際時間會越來越長。
看起來很奇怪。對我來說,等式應該是:
New Difficulty = Old Difficulty * (20160 minutes / Actual Time of Last 2016 Blocks)
但是,我發現這個公式與比特幣程式碼中的公式是一致的。
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params) { if (params.fPowNoRetargeting) return pindexLast->nBits; // Limit adjustment step int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime; if (nActualTimespan < params.nPowTargetTimespan/4) nActualTimespan = params.nPowTargetTimespan/4; if (nActualTimespan > params.nPowTargetTimespan*4) nActualTimespan = params.nPowTargetTimespan*4; // Retarget const 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(); }
然後我找到了這個答案。
這是我所理解的,但為什麼它與書本和程式碼的方程式不同。
更新
我認為這只是一個模棱兩可的表達。
更好的表達方式應該是:
New Difficulty Target = Old Difficulty Target * (Actual Time of Last 2016 Blocks / 20160 minutes)
您引用的程式碼實際上並沒有處理困難。它處理目標。目標是允許塊雜湊具有的最大 256 位值。
難度定義為2^208 * 65535 / target。
至於這本書,那看起來確實不對。