Blockchain

在位和難度之間轉換的方程式是什麼?

  • November 13, 2018

如果我們以塊雜湊 0000000000000006770c3806960539ca83a24facbd99ea212f37f2a0e6a5629a 為例。

32 位浮點數的難度是50810339.04827648。作為無符號 32 位整數的位難度是424970034

從難度 -> 位和位 -> 難度的方程式是什麼?

從stackexchange無恥地竊取答案:

此處詳細描述了難度編碼 。

十六進製表示0x182815ee由兩部分組成:

  • 0x18– 目標中的字節數
  • 0x2815ee– 目標前綴

這意味著有效的散列應該小於 0x2815ee000000000000000000000000000000000000000000(它正好 0x18= 24 字節長)。

難度的浮點表示顯示目前目標比創世塊中使用的目標難多少。

中本聰決定0x1d00ffff將創世區塊用作難度,因此目標是 0x00ffff0000000000000000000000000000000000000000000000000000.

而 50810339.04827648 是目前目標比初始目標大多少。

比特幣客戶端如何從比特轉換 -> 難度:

uint256& uint256::SetCompact(uint32_t nCompact, bool *pfNegative, bool *pfOverflow)
{
   int nSize = nCompact >> 24;
   uint32_t nWord = nCompact & 0x007fffff;
   if (nSize <= 3) {
       nWord >>= 8*(3-nSize);
       *this = nWord;
   } else {
       *this = nWord;
       *this <<= 8*(nSize-3);
   }
   if (pfNegative)
       *pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0;
   if (pfOverflow)
       *pfOverflow = nWord != 0 && ((nSize > 34) ||
                                    (nWord > 0xff && nSize > 33) ||
                                    (nWord > 0xffff && nSize > 32));
   return *this;
}

比特幣客戶端如何從難度轉換 -> 位:

uint32_t uint256::GetCompact(bool fNegative) const
{
   int nSize = (bits() + 7) / 8;
   uint32_t nCompact = 0;
   if (nSize <= 3) {
       nCompact = GetLow64() << 8*(3-nSize);
   } else {
       uint256 bn = *this >> 8*(nSize-3);
       nCompact = bn.GetLow64();
   }
   // The 0x00800000 bit denotes the sign.
   // Thus, if it is already set, divide the mantissa by 256 and increase the exponent.
   if (nCompact & 0x00800000) {
       nCompact >>= 8;
       nSize++;
   }
   assert((nCompact & ~0x007fffff) == 0);
   assert(nSize < 256);
   nCompact |= nSize << 24;
   nCompact |= (fNegative && (nCompact & 0x007fffff) ? 0x00800000 : 0);
   return nCompact;
}

在 shell 中從目標轉換為難度。創建文件target-to-difficulty.sh

#!/bin/bash
echo "ibase=16;FFFF0000000000000000000000000000000000000000000000000000 / $1" | bc -l

用法:

$ ./target-to-difficulty.sh 000000000000000024DBE9000000000000000000000000000000000000000000
29829733124.04041574884510759883

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