Blockchain
在位和難度之間轉換的方程式是什麼?
如果我們以塊雜湊 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