FEHLER: AcceptBlock: High-Hash, Arbeitsnachweis fehlgeschlagen (Code 16)

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_AGEauf int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE * 4000;, aber es funktioniert nicht, ich konnte keinen Block abbauen, aber als ich -maxtipage=432000000meinem 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 , pszTimestampund nTimeund nNoncevorgenommen .hashGenesisBlockhashMerkleRoot

Ich konnte den Daemon ohne assertProbleme 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)
Abgestimmt. Wir haben viele Fragen zu Programmierproblemen bei der Erstellung eines neuen Altcoins. Ich glaube nicht, dass solche Fragen einem allgemeinen Publikum nützen, und dies ist eine Q&A-Site, kein Ort für Unterstützung. Darüber hinaus ist es als Lernerfahrung viel wertvoller, zu einem bestehenden Projekt beizutragen.
Offensichtlich gibt es ein Publikum, da es viele Fragen gibt, aber ist Stackoverflow der richtige Ort dafür? Ich habe keine Präferenz, ich frage mich nur, was ich als Hilfe vorschlagen soll.
@PieterWille . Um zu einem bestehenden Projekt beizutragen. Ich muss lernen, wie die Dinge auf Code-Ebene funktionieren, also habe ich kleine Änderungen am bestehenden Bitcoin-Code vorgenommen und versucht, das Konzept zu verstehen.

Antworten (1)

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 ( powLimitdas 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, powLimitmü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.

Danke für deine Antwort. Ich werde versuchen, Ihnen Bescheid zu geben
Das Genesisgen-Beispiel hat zwei Nonce: startNonceund Noncewelche soll ich in meinem Programm verwenden
Sie können einfach 0 als Start-Nonce verwenden, es sei denn, Sie kennen die Nonce bereits :)
Es funktioniert nicht . Ich habe einen Vermögensfehler. Ich habe meine Frage aktualisiert. überprüfen Sie bitte
Ich glaube, die Merkleroot ist eine falsche Endianess, versuchen Sie es mit derByteswapped: 5d899d6099e42acc9a8d97197e834ed7d98adebbced63aadcc399b76c7efb494
Danke es funktioniert. Ich konnte Genesis-Block ohne Probleme generieren :)
Bitte aktualisieren Sie auch Ihre Antwort