Was auch immer ich tue, ich kann den ersten Block nach dem Genesis-Block nicht abbauen. Die ganze Zeit bin ich davon ausgegangen, dass ich den Genesis-Block abgebaut habe, und ich bin nicht in der Lage, den 1. Block mit dem Befehl "setgenerate true" abzubauen. Aber ich kann mich irren. Möglicherweise habe ich den Genesis-Block NICHT tatsächlich abgebaut. Ja, ich bin verwirrt. Ich habe neue Schlüssel generiert. Also, hier ist, was ich von Anfang an getan habe.
1) Code vor Genesis-Block:
In "chainparams.php" habe ich folgendes aktualisiert.
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();
In der main.cpp Datei habe ich folgendes geändert
int64_t nSubsidy = 0;
if(nHeight == 0) {
nSubsidy = 0;
} else if( .......
Bitte beachten Sie, dass ich auch versucht habe, den nSubsidy-Wert für nHight = 0 auf "50 * COIN" und auch auf einen höheren Wert wie "5000 * COIN" zu ändern. Alles führt zum selben Problem.
2) Verwenden Sie den folgenden Code, um den Genesis-Block zu erstellen.
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) Ich habe die folgenden Ergebnisse erhalten.
block.nTime = 1538530667
block.nNonce = 3916247
block.hashMerkleRoot: 668d1e9c1c4f354589b9357d0ac0135b5e236f13ea8cf3bdf79e3670d347e07b
block.GetHash = 00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820
4) Aktualisierte die obigen Informationen in der Datei "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) Entfernte den Code, den ich verwendet habe, um den Genesis-Block zu erstellen, den ich in Schritt 2 (oben) verwendet habe.
6) Neu kompiliert, keine Fehler oder Probleme.
7) Ich habe diesen aktuellen VPS als Server erstellt und eine "coin.conf"-Datei erstellt und Folgendes hinzugefügt:
server=1
rpcuser=user
rpcpassword=password
listen=1
daemon=1
8) Ich habe diesen Server NICHT geklont, um einen neuen Client zu erstellen. Stattdessen erstellte ich einen neuen VPS, installierte alle Abhängigkeiten und kopierte den vollständigen Ordner – komplettes Projekt in diesen Client-VPS, um den Client einzurichten.
9) Ich habe Folgendes in der Datei „coin.conf“ im Client-VPS hinzugefügt.
addnode=<ipaddress of the server> (Ex: 207.87.10.2)
10) Wallet gestartet – „coin-qt“ auf dem Server. Keine Fehler.
11) Wallet gestartet - "coin-qt" auf dem Client. Keine Fehler.
12) Beide ohne Probleme verbunden.
13) Führen Sie den folgenden Befehl auf dem Client aus, um den 1. Block abzubauen.
setgenerate true
Habe folgenden Fehler.
"wallet keypool empty"
setgenerate using gestoppt
setgenerate false
14) Führen Sie den folgenden Befehl aus.
keypoolrefill
15) Setgenerate erneut versucht
setgenerate true
16) Überprüfen Sie die debug.log-Datei. Das bekomme ich.
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
Ich habe die Hashes in der Debug-Datei gedruckt. Das bekomme ich.
Hash = 35301222bb9164c21222107e1c43045c50c190d63eb8be2ad193ed38228b26a1
bnTarget = 00000fffff000000000000000000000000000000000000000000000000000000
Ich stecke hier fest. Was auch immer ich tue, wie oft ich bei Null anfange, ich lande hier.
Gibt es noch andere Einstellungen, die ich in Bezug auf ProofOfWork ändern muss? Was mache ich falsch? Kann mir jemand helfen?
Ich kann bestätigen, dass dein Code funktioniert. Ich habe Ihren Code in ein paar Projekte implementiert, die wiederum von PIVX abgespalten wurden. Ich war nicht in der Lage, Genesis-Blöcke in jedem Projekt zu generieren - was darauf hindeuten würde, dass es ein bisschen mehr gibt als nur chainparams.cpp . Es gelang mir jedoch, den Daemon Genesis-Blöcke produzieren zu lassen, die auch in einigen dieser Projekte verwendet werden konnten, die von PIVX abgezweigt wurden.
Ich habe alle alten Hashes/Checkpoints/geänderte Ports entfernt und dann Ihren Code wie folgt eingefügt:
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;
Hoffe, das kann Sie in die richtige Richtung weisen.
WG91
Pieter Wuille
Joe Uhren
Harish Kumar BP