【问题标题】:Where and how pool difficulty(pdiff) is set in bitcoin source code?比特币源代码中的矿池难度(pdi​​ff)在哪里以及如何设置?
【发布时间】:2026-01-17 04:20:02
【问题描述】:

我正在使用比特币源代码,希望将初始难度设置为 1(我更改了 bdiff,nBits 字段)。所以我也需要改变 pdiff 。根据:

难度=难度_1_target/current_target(目标是256 位数)

difficulty_1_target 可以根据不同的测量方式而有所不同 困难。传统上,它表示一个散列,其中前导 32 位为零,其余为一(这称为“池难度” 或“pdiff”)。比特币协议将目标表示为自定义 精度有限的浮点类型;结果,比特币 客户通常以此为基础估算难度(这被称为 “bdiff”)。

有人知道 pdiff 存储在哪里吗?是硬编码的吗?

【问题讨论】:

  • 比特币核心与矿池无关。
  • 假设我手动更改了 bdiff。如何启动 bitcoind 服务器以获得 1 的初始难度?

标签: target bitcoin


【解决方案1】:

我找到了解决方案!它不完全是代码中的 pdiff 字段,但 blockchain.cpp 中有一个函数:

double GetDifficulty(const CBlockIndex* blockindex)
{
    if (blockindex == nullptr)
    {
        return 1.0;
    }

    int nShift = (blockindex->nBits >> 24) & 0xff;
    double dDiff =
        (double)0x0000ffff / (double)(blockindex->nBits & 0x00ffffff);

    while (nShift < 29)
    {
        dDiff *= 256.0;
        nShift++;
    }
    while (nShift > 29)
    {
        dDiff /= 256.0;
        nShift--;
    }
    return dDiff;
 }

对于比特币,初始 nBits 等于 0x1d00ffff,因此上面的 dDiff 字段变为 1,nshift 等于 1D。对于我的私人版本,我将 nBits 设置为 0x1f0fffff 并且应该像

一样计算 dDiff
double dDiff =(double)0x000ffff / (double)(blockindex->nBits & 0x00ffffff);

我的 nShift 字段是 0x1f,所以我将 while 条件更改为 while(nShift &lt; 31)while (nShift &gt; 31)。通过运行命令bitcoin-cli getdifficulty,我得到了 1 作为初始难度。

【讨论】:

    最近更新 更多