Difficulty

比特幣 GetBlockWork() 函式

  • December 19, 2014

GetBlockWork()比特幣 v0.9.3 原始碼(<https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/main.h#L815-L822> )中的實現對我來說似乎很奇怪。為方便起見,下面給出程式碼。

CBigNum GetBlockWork() const
{
   CBigNum bnTarget;
   bnTarget.SetCompact(nBits);
   if (bnTarget &lt;= 0)
       return 0;
   return (CBigNum(1)&lt;&lt;256) / (bnTarget+1);
}
  1. 為什麼分母中的+1?
  2. 分子不應該是最大可能的 256 位整數,而不是 2^256?

我希望實現是:

CBigNum GetBlockWork() const
{
   CBigNum bnTarget;
   bnTarget.SetCompact(nBits);
   if (bnTarget &lt;= 0)
       return 0;
   CBigNum bnMax;
   bnMax.SetHex("0xFFFFFFFFFFFFFFFF"); // Max 256 bit int
   return (bnMax / bnTarget);
}

這似乎是一個計算生成特定塊所需的平均雜湊數的函式。(這與難度不同。)

我認為這個功能是正確的。為了解釋原因,假設比特幣使用 4 位散列而不是 256 位散列。這將使可能值的範圍為 0 到 15。

如果目標是 15,則意味著任何散列都是有效的。因此,平均需要 1 個雜湊才能找到有效的工作證明:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (15 + 1)
= 1

如果目標是 7,那意味著一半的雜湊值是有效的。因此,平均需要 2 個雜湊才能找到有效的工作證明:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (7 + 1)
= 2

請記住,如果工作量證明小於或等於目標,則它是有效的。另請參見 CheckProofOfWork()。

我不知道這是否在任何地方使用。此功能似乎已在最新版本中刪除。

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