Не могу майнить Genesis/First Block (форк/клон PIVX) [закрыто]

Что бы я ни делал, я не могу майнить 1-й блок после блока генезиса. Все это время я предполагал, что добыл блок Genesis, и я не могу добыть 1-й блок с помощью команды «setgenerate true». Но, я могу ошибаться. Возможно, я на самом деле НЕ добыл блок генезиса. Да, я запутался. Я сгенерировал новые ключи. Итак, вот что я сделал с самого начала.

1) Код перед блоком генезиса:

В «chainparams.php» я обновил следующее.

boost::assign::map_list_of(0, uint256("0x01"));
static const Checkpoints::CCheckpointData data = {
    &mapCheckpoints,
    1538530667, // * UNIX timestamp of last checkpoint block
    0,    // * total number of transactions between genesis and last checkpoint
                //   (the tx=... number in the SetBestChain debug.log lines)
    500        // * estimated number of transactions per day after checkpoint
};

pchMessageStart[0] = 0x91;
pchMessageStart[1] = 0xc5;
pchMessageStart[2] = 0xfa;
pchMessageStart[3] = 0xe3;
vAlertPubKey = ParseHex("04ae6724abca5c2e2e9524d3cd10a303e0ef3f02d324bac4d06aceb873fb8591f1a968d9a2e5ac7024d5a45643d189b99015314d7ef1ff5f8799b9680d6e668471");

const char* pszTimestamp = "my new message here. trying to learn how to create an altcoin.";
txNew.vout[0].nValue = 50 * COIN;
txNew.vout[0].scriptPubKey = CScript() << ParseHex("047394ed7e750f6202487e7c8ec1e61bbd2fb5cdc6f0f5488af4d2ea082bec606fea95eea381cd0466cf6ea53d8f42c299f9d0e2a3bc313515fc52f02a16fef0a0") << OP_CHECKSIG;
genesis.nTime = 1538530667;
genesis.nBits = 0x1e0ffff0;

assert(hashGenesisBlock == uint256("0x01"));
assert(genesis.hashMerkleRoot == uint256("0x01"));

fRequireRPCPassword = false;
fMiningRequiresPeers = false;
fAllowMinDifficultyBlocks = false;
fDefaultConsistencyChecks = false;
fRequireStandard = true;
fMineBlocksOnDemand = true;
fSkipProofOfWorkCheck = false;
fTestnetToBeDeprecatedFieldRPC = false;
fHeadersFirstSyncingActive = false;

vFixedSeeds.clear();
vSeeds.clear();

В файле main.cpp я изменил следующее

int64_t nSubsidy = 0;

if(nHeight == 0) {
    nSubsidy = 0;
} else if( .......

Обратите внимание, я также пытался изменить значение nSubsidy для nHight = 0 на «50 * COIN», а также на более высокое значение, например «5000 * COIN». Все приводит к той же проблеме.

2) Использовал следующий код для создания блока генезиса.

if(genesis.GetHash() != uint256("0x"))
{
      printf("MSearching for genesis block...\n");
      uint256 hashTarget;
      hashTarget.SetCompact(genesis.nBits);
      while(uint256(genesis.GetHash()) > uint256(hashTarget))
      {
          ++genesis.nNonce;
          if (genesis.nNonce == 0)
          {
              printf("Mainnet NONCE WRAPPED, incrementing time");
              std::cout << std::string("Mainnet NONCE WRAPPED, incrementing time:\n");
              ++genesis.nTime;
          }
          if (genesis.nNonce % 10000 == 0)
          {
              printf("Mainnet: nonce %08u: hash = %s \n", genesis.nNonce, genesis.GetHash().ToString().c_str());
          }
      }
      printf("Mainnet block.nTime = %u \n", genesis.nTime);
      printf("Mainnet block.nNonce = %u \n", genesis.nNonce);
      printf("Mainnet block.hashMerkleRoot: %s\n", genesis.hashMerkleRoot.ToString().c_str());
      printf("Mainnet block.GetHash = %s\n", genesis.GetHash().ToString().c_str());
}

3) Я получил следующие результаты.

block.nTime = 1538530667
block.nNonce = 3916247
block.hashMerkleRoot: 668d1e9c1c4f354589b9357d0ac0135b5e236f13ea8cf3bdf79e3670d347e07b
block.GetHash = 00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820

4) Обновлена ​​указанная выше информация в файле «chainparams.cpp».

boost::assign::map_list_of(0, uint256("00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820"));

genesis.nTime = 1538530667;
genesis.nBits = 0x1e0ffff0;
genesis.nNonce = 3916247;

assert(hashGenesisBlock == uint256("00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820"));
assert(genesis.hashMerkleRoot == uint256("668d1e9c1c4f354589b9357d0ac0135b5e236f13ea8cf3bdf79e3670d347e07b"));

5) Удален код, который я использовал для создания блока генезиса, который я использовал на шаге 2 (выше).

6) Скомпилировано снова, никаких ошибок или проблем.

7) Я сделал этот текущий VPS сервером, создал файл «coin.conf» и добавил следующее:

server=1
rpcuser=user
rpcpassword=password
listen=1
daemon=1

8) Я НЕ клонировал этот сервер для создания нового клиента. Вместо этого я создал новый VPS, установил все зависимости и скопировал полную папку - полный проект в этот клиентский VPS для настройки клиента.

9) Я добавил следующее в файл «coin.conf» на клиентском VPS.

addnode=<ipaddress of the server> (Ex: 207.87.10.2)

10) Запустил кошелек - "coin-qt" на сервере. Нет ошибок.

11) Запустил кошелек - "coin-qt" на клиенте. Нет ошибок.

12) Оба подключились без проблем.

13) Выполните следующую команду на клиенте, чтобы добыть 1-й блок.

setgenerate true

Получил следующую ошибку.

"wallet keypool empty"

остановил setgenerate с помощью

setgenerate false

14) Выполнил следующую команду.

keypoolrefill

15) Снова попробовал setgenerate

setgenerate true

16) Проверил файл debug.log. Это то, что я получаю.

CreateNewBlock(): total size 1000
ERROR: CheckProofOfWork() : hash doesn't match nBits
ERROR: CheckBlockHeader() : proof of work failed
ERROR: CheckBlock() : CheckBlockHeader failed
CreateNewBlock() : TestBlockValidity failed
keypool return 2
keypool reserve 2

Я напечатал хэши в файле отладки. Это то, что я получаю.

Hash = 35301222bb9164c21222107e1c43045c50c190d63eb8be2ad193ed38228b26a1
bnTarget = 00000fffff000000000000000000000000000000000000000000000000000000

Я застрял здесь. Что бы я ни делал, сколько бы раз я ни начинал с нуля, я оказываюсь здесь.

Есть ли какие-либо другие настройки, связанные с ProofOfWork, которые мне нужно изменить? Что я делаю не так? Кто-нибудь может мне помочь?

Я также взломал вилку PIVX. Завтра я попытаюсь сгенерировать генезис-блок с вашим кодом в своем форке и посмотрю, получу ли я другой результат. Мы могли бы сравнить исходный код, который мы используем, через GitHub. Не поделитесь ссылкой?
Проголосовали против. У нас есть много вопросов, касающихся проблем с программированием при создании нового альткоина. Я не верю, что такие вопросы приносят пользу широкой аудитории, и это сайт вопросов и ответов, а не место для поддержки. Кроме того, в качестве учебного опыта участие в существующем проекте гораздо более ценно.
Вы смогли решить эту проблему? Правильного ответа не было дано, но, судя по вашему новому вопросу, вы успешно миновали генезисный блок: bitcoin.stackexchange.com/questions/79977/…
Привет, Джо, ну, я не смог заставить это работать с вилкой PIVX. Я использовал другой форк, который был форком PIVX, а затем изменил false на true для fSkipProofOfWorkCheck = true (это неправильный способ) и заставил его работать. Но у меня никогда не получалось, чтобы это работало с сохранением fSkipProofOfWorkCheck = false;

Ответы (1)

Я могу подтвердить, что ваш код работает. Я внедрил ваш код в несколько проектов, которые, в свою очередь, произошли от PIVX. Я не мог генерировать блоки генезиса в каждом проекте, что предполагает, что это нечто большее, чем просто chainparams.cpp . Однако мне удалось заставить демона создавать блоки генезиса, которые также можно было использовать в некоторых из этих проектов, разветвленных из PIVX.

Я удалил все старые хэши/контрольные точки/измененные порты, а затем включил ваш код следующим образом:

        hashGenesisBlock = genesis.GetHash();
        if(genesis.GetHash() != uint256("0x"))
        {
        printf("MSearching for genesis block...\n");
        uint256 hashTarget;
        hashTarget.SetCompact(genesis.nBits);
        while(uint256(genesis.GetHash()) > uint256(hashTarget))
        {
            ++genesis.nNonce;
            if (genesis.nNonce == 0)
            {
                printf("Mainnet NONCE WRAPPED, incrementing time");
                std::cout << std::string("Mainnet NONCE WRAPPED, incrementing time:\n");
                ++genesis.nTime;
            }
            if (genesis.nNonce % 10000 == 0)
            {
               printf("Mainnet: nonce %08u: hash = %s \n", genesis.nNonce, genesis.GetHash().ToString().c_str());
            }
        }
        printf("Mainnet block.nTime = %u \n", genesis.nTime);
        printf("Mainnet block.nNonce = %u \n", genesis.nNonce);
        printf("Mainnet block.hashMerkleRoot: %s\n", genesis.hashMerkleRoot.ToString().c_str());
        printf("Mainnet block.GetHash = %s\n", genesis.GetHash().ToString().c_str());
        }

        vFixedSeeds.clear();
        vSeeds.clear();

        [...]

        fRequireRPCPassword = false;        // default true
        fMiningRequiresPeers = false;       // default true
        fAllowMinDifficultyBlocks = false;
        fDefaultConsistencyChecks = false;
        fRequireStandard = true;
        fMineBlocksOnDemand = true;     // default false
        fSkipProofOfWorkCheck = false;      // default false
        fTestnetToBeDeprecatedFieldRPC = false;
        fHeadersFirstSyncingActive = false;

Надеюсь, это может указать вам в правильном направлении.

Большой! Можете ли вы дать мне шаги, которые вы использовали для создания блоков генезиса с помощью демона?
Обратите внимание, что это НЕ мой код. Я нашел в из другого источника. Я не могу найти ссылку, чтобы поделиться ею здесь. Я просто изменил пару строк, чтобы заставить его работать. Вот и все.
А, я просто так предположил, потому что сам довольно долго искал правильный код. Отличная работа, чтобы собрать это вместе! Вставив код в chainparams.cpp, я перенастроил и скомпилировал код ( ./configure && make ), после чего запустил демон ( cd coin/src && ./coind ). Он начал поиск и прекратил через минуту или две, предоставив мне хэш блока/корень merkle/nonce.
Хорошо. Спасибо. Сталкивались ли вы с ошибкой — «txout.nvalue отрицательный» при попытке майнить первый блок с помощью команды «setgenerate true». Я застрял там. Это на вилке PIVX.
Добрый день, извините, что месяц не был в сети. Я столкнулся с той же проблемой: «2018-11-08 14:45:15 CreateNewBlock(): TestBlockValidity не удалось 2018-11-08 14:45:15 CreateNewBlock: не удалось обнаружить мастерноду для оплаты 2018-11-08 14:45 :15 CreateNewBlock(): общий размер 1000 2018-11-08 14:45:15 CheckBlock() : пропуск проверок блокировки транзакции 2018-11-08 14:45:15 ОШИБКА: CheckTransaction() : txout.nValue отрицательный 2018-11 -08 14:45:15 ОШИБКА: CheckBlock() : CheckTransaction failed «Вам повезло?
Я нашел часть, чтобы обойти это. В main.cpp найдите часть, в которой говорится: "//Проверка на наличие отрицательных или переполненных выходных значений CAmount nValueOut = 0;" Я изменил это значение на положительное вознаграждение за блок (скажем, 100) и прокомментировал 14 строк после него, чтобы обойти проверку. Теперь моя проблема заключается в том, что при майнинге он ищет мастерноду для выплаты, но поскольку нет монет, нет и мастернод. Проблема. Любая идея о том, как обойти это?