Ich bin diesem Medium-Link gefolgt, um eine Münze wie Bitcoin zu erstellen. https://medium.com/@jordan.baczuk/how-to-fork-bitcoin-c39139506443
Basierend auf diesem Tutorial aktualisiere ich DEFAULT_MAX_TIP_AGE
auf int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE * 4000;
, aber es funktioniert nicht, ich konnte keinen Block abbauen, aber als ich -maxtipage=432000000
meinem Befehlszeilen-Daemon dann Mining-Arbeiten hinzufügte, konnte ich genesis block abbauen. aber dann dachte ich, es wäre besser, wenn ich meinen eigenen Geneisis-Block erstellen könnte.
Also folgte ich diesem Link: Wie kann ich einen neuen Genesis-Block erstellen?
Ich habe Änderungen an , pszTimestamp
und nTime
und nNonce
vorgenommen .hashGenesisBlock
hashMerkleRoot
Ich konnte den Daemon ohne assert
Probleme ausführen. Zuerst bekam ich diesen Fehler
FEHLER: ReadBlockFromDisk: Fehler im Blockheader bei CBlockDiskPos(nFile=0, nPos=8) 2018-11-08T10:12:47Z *** Block konnte nicht gelesen werden
Dann nach dem Ausführen des Befehlszeilen-Daemons mit -reindex
. Der vorherige Fehler verschwindet, aber es wurde ein neuer Fehler angezeigt
FEHLER: AcceptBlock: High-Hash, Arbeitsnachweis fehlgeschlagen (Code 16)
Wie kann ich dieses Problem lösen
BEARBEITEN: Basierend auf dem Vorschlag von @JBaczuk . Ich habe genesisgen verwendet, um Blockinformationen zu generieren
https://github.com/liveblockchain/genesisgen
CMD-Syntax:
./genesis [options] <pubkey> "<timestamp>" <nBits> <startNonce> <unixtime>
Mein CMD:
./genesis 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f "NDTV 08/Nov/2018 India Wants To Locally Manufacture, Export Bullet Train Coaches" 486604799 2083236893 1541690605
AUSGANG:
nBits: 0x1d00ffff
startNonce: 2083236893
unixtime: 1541690605
Coinbase: 04ffff001d01044c504e4454562030382f4e6f762f3230313820496e6469612057616e747320546f204c6f63616c6c79204d616e75666163747572652c204578706f72742042756c6c657420547261696e20436f6163686573
PubkeyScript: 4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
Merkle Hash: 94b4efc7769b39ccad3ad6cebbde8ad9d74e837e19978d9acc2ae499609d895d
Byteswapped: 5d899d6099e42acc9a8d97197e834ed7d98adebbced63aadcc399b76c7efb494
Generating block...
124397 Hashes/s, Nonce 20632283897
Block found!
Hash: 000000004c7d908bd3c911a21b849d3cdca124131d2fb8a1af009698742ad672
Nonce: 2063257030
Unix time: 1541690608
Änderungen im Code:
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
const char* pszTimestamp = "NDTV 08/Nov/2018 India Wants To Locally Manufacture, Export Bullet Train Coaches";
const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
...... ...... ......
genesis = CreateGenesisBlock(1541690608, 2063257030, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
assert(consensus.hashGenesisBlock == uint256S("0x000000004c7d908bd3c911a21b849d3cdca124131d2fb8a1af009698742ad672"));
assert(genesis.hashMerkleRoot == uint256S("0x94b4efc7769b39ccad3ad6cebbde8ad9d74e837e19978d9acc2ae499609d895d"));
Ich habe diesen Behauptungsfehler:
chainparams.cpp:125: CMainParams::CMainParams(): Assertion `genesis.hashMerkleRoot == uint256S("0x94b4efc7769b39ccad3ad6cebbde8ad9d74e837e19978d9acc2ae499609d895d")' failed.
Aborted (core dumped)
Dies liegt daran, dass Sie den Block nicht abgebaut haben, dh Sie haben nicht nach einer Nonce gesucht, die zu einem Block-Hash führt, der kleiner ist als ( powLimit
das anfängliche Schwierigkeitsziel) definiert in src/chainparams.cpp
consensus.powLimit("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
, für mainnet. Um dies zu tun:
Serialisieren Sie den Blockheader. Verketten Sie (in dieser Reihenfolge, Little Endian, Hex-Format) die Version, den vorherigen Block-Hash, Merkle-Stamm, Unix-Epochenzeit, Schwierigkeitsziel (Bits) und Nonce. Berechnen Sie dann den HASH256 oder den SHA256 (SHA256()). Wenn es nicht weniger ist, powLimit
müssen Sie die Nonce ändern und es erneut versuchen, tun Sie dies so lange, bis Sie erfolgreich sind, dies ist Mining.
Dafür gibt es Skripte, zum Beispiel: https://github.com/liveblockchain/genesisgen
Update (Beispiel aus obiger Frage):
Beispielverwendung vongenesisgen
./genesis [options] <pubkey> "<timestamp>" <nBits> <startNonce> <unixtime>
./genesis 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f "NDTV 08/Nov/2018 India Wants To Locally Manufacture, Export Bullet Train Coaches" 486604799 2083236893 1541690605
nBits: 0x1d00ffff
startNonce: 2083236893
unixtime: 1541690605
Coinbase: 04ffff001d01044c504e4454562030382f4e6f762f3230313820496e6469612057616e747320546f204c6f63616c6c79204d616e75666163747572652c204578706f72742042756c6c657420547261696e20436f6163686573
PubkeyScript: 4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
Merkle Hash: 94b4efc7769b39ccad3ad6cebbde8ad9d74e837e19978d9acc2ae499609d895d
Byteswapped: 5d899d6099e42acc9a8d97197e834ed7d98adebbced63aadcc399b76c7efb494
Generating block...
124397 Hashes/s, Nonce 20632283897
Block found!
Hash: 000000004c7d908bd3c911a21b849d3cdca124131d2fb8a1af009698742ad672
Nonce: 2063257030
Unix time: 1541690608
Sie müssen die Byteswapped-Merkle-Root und den Block-Hash in den Assertions und die neu gefundene Nonce in den Genesis-Blockerstellungsfunktionen verwenden.
startNonce
und Nonce
welche soll ich in meinem Programm verwendenByteswapped: 5d899d6099e42acc9a8d97197e834ed7d98adebbced63aadcc399b76c7efb494
Pieter Wuille
JBaczuk
Anfänger Programmierer