Difficulty

一個關於難度方程的問題

  • June 7, 2017

當我讀到這本書比特幣大師時,我在理解第 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

至於這本書,那看起來確實不對。

引用自:https://bitcoin.stackexchange.com/questions/54171