Difficulty
比特幣 GetBlockWork() 函式
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 <= 0) return 0; return (CBigNum(1)<<256) / (bnTarget+1); }
- 為什麼分母中的+1?
- 分子不應該是最大可能的 256 位整數,而不是 2^256?
我希望實現是:
CBigNum GetBlockWork() const { CBigNum bnTarget; bnTarget.SetCompact(nBits); if (bnTarget <= 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()。
我不知道這是否在任何地方使用。此功能似乎已在最新版本中刪除。