Где и как устанавливается сложность пула (pdiff) в исходном коде биткойнов? - PullRequest
0 голосов
/ 24 октября 2018

Я работаю с исходным кодом биткойнов, хочу установить начальную сложность на 1 (я изменил поле bdiff, nBits).Так что мне нужно также изменить pdiff.в соответствии с:

затруднение = сложность_1_ цели / текущая цель (цель - это 256-битное число)

сложность_1_ цели может быть различным для разных способов измерения сложности.Традиционно он представляет собой хэш, в котором 32 старших бита равны нулю, а остальные равны единице (это называется «сложностью пула» или «pdiff»).Протокол Биткойн представляет цели как пользовательский тип с плавающей запятой с ограниченной точностью;в результате клиенты Биткойн часто приближаются к трудностям, основанным на этом (это называется «bdiff»).

Кто-нибудь знает, где хранится pdiff?Это жестко закодировано?

1 Ответ

0 голосов
/ 25 октября 2018

Я нашел решение!Это не совсем поле 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(nShift < 31) и while (nShift > 31).выполнив команду bitcoin-cli getdifficulty я получил 1 в качестве начальной сложности.

...