Что бы я ни делал, я не могу майнить 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. Я не мог генерировать блоки генезиса в каждом проекте, что предполагает, что это нечто большее, чем просто 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;
Надеюсь, это может указать вам в правильном направлении.
РГ91
Питер Уилле
Джо Урен
Хариш Кумар BP