Kann Genesis / First Block (PIVX Fork / Clone) nicht abbauen [geschlossen]

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 habe auch an einer PIVX-Fork herumgehackt. Ich werde morgen versuchen, einen Genesis-Block mit Ihrem Code in meinem Fork zu generieren, und sehen, ob ich ein anderes Ergebnis erhalte. Wir könnten den Quellcode, den wir verwenden, über GitHub vergleichen. Hast du etwas dagegen, einen Link zu teilen?
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.
Konntest du dieses Problem lösen? Es wurde keine richtige Antwort gegeben, aber es scheint, dass Sie gemäß Ihrer neueren Frage erfolgreich am Genesis-Block vorbei geschürft haben: bitcoin.stackexchange.com/questions/79977/…
Hallo Joe, nun, ich konnte das mit PIVX Fork nicht zum Laufen bringen. Ich habe einen anderen Fork verwendet, der ein Fork von PIVX war, und dann für fSkipProofOfWorkCheck = true (dies ist nicht der richtige Weg) false in true geändert und es zum Laufen gebracht. Aber ich habe das nie zum Laufen gebracht, indem ich fSkipProofOfWorkCheck = false beibehalten habe;

Antworten (1)

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.

Großartig! Können Sie mir die Schritte nennen, mit denen Sie Genesis-Blöcke per Daemon erstellt haben?
Bitte beachten Sie, dass es NICHT mein Code ist. Ich habe in einer anderen Quelle gefunden. Ich kann den Link nicht finden, um es hier zu teilen. Ich habe nur ein paar Zeilen geändert, damit es funktioniert. Das ist alles.
Ah, das habe ich nur vermutet, weil ich selbst schon seit geraumer Zeit nach dem richtigen Code suche. Großartige Arbeit, dies zusammenzustellen! Nach dem Einfügen des Codes in chainparams.cpp habe ich den Code neu konfiguriert und kompiliert ( ./configure && make ) und danach den Daemon ausgeführt ( cd coin/src && ./coind ). Es begann mit der Suche und beendete sich nach ein oder zwei Minuten und gab mir den Block-Hash/Merkle-Root/Nonce.
OK. Danke schön. Sind Sie beim Versuch, den ersten Block mit dem Befehl „setgenerate true“ zu minen, auf den Fehler „txout.nvalue negativ“ gestoßen? Ich stecke da drüben fest. Dies ist auf einer PIVX-Gabel.
Hallo, tut mir leid, dass ich einen Monat offline war. Ich stoße auf das gleiche Problem: " 2018-11-08 14:45:15 CreateNewBlock() : TestBlockValidity failed 2018-11-08 14:45:15 CreateNewBlock: Failed to detect masternode to pay 2018-11-08 14:45 :15 CreateNewBlock(): Gesamtgröße 1000 2018-11-08 14:45:15 CheckBlock() : Transaktionssperrprüfungen überspringen 2018-11-08 14:45:15 FEHLER: CheckTransaction() : txout.nValue negativ 2018-11 -08 14:45:15 ERROR: CheckBlock() : CheckTransaction failed " Glück gehabt?
Ich habe das Teil gefunden, das dies umgeht. Suchen Sie in main.cpp nach dem Teil, der besagt: " // Auf negative oder überlaufende Ausgabewerte prüfen CAmount nValueOut = 0;" Ich habe diesen Wert in eine positive Blockbelohnung (z. B. 100) geändert und die 14 Zeilen danach kommentiert, um die Prüfung zu umgehen. Mein Problem ist jetzt, dass beim Mining nach einem Masternode gesucht wird, an den ausgezahlt werden kann - aber da es keine Münzen gibt, gibt es auch keine Masternodes. Problem. Irgendeine Idee, wie man das umgehen kann?