Wie kann ich einen neuen Genesis-Block erstellen? [abgeschlossen]

Ich versuche, einen Testcoin mit Litecoin zu erstellen. Um einen Genesis-Block zu erstellen, habe ich einige Zeilen geändert in:

block.nTime = 1390948469; // current time

uint256 hashGenesisBlock("0x"); //I dont now it's true or false

uint256 hash = block.GetHash();
        printf("%s\n", hash.ToString().c_str());
        printf("%s\n", hashGenesisBlock.ToString().c_str());
        printf("%s\n", block.hashMerkleRoot.ToString().c_str());
        assert(block.hashMerkleRoot == uint256("0x")); //I dont now it's true or false.
        block.print();
        assert(hash == hashGenesisBlock);

Wenn ich einen Daemon erstelle und starte, erhalte ich diesen Fehler:

litecoind: main.cpp:2788: bool InitBlockIndex(): Assertion `hash == hashGenesisBlock' failed.
Aborted

Wenn ich die ./litecoin debug.logDatei überprüfe, sehe ich den vorherigen HashMerkleRoot und HashGenesisBlock, den Litecoin jetzt verwendet. Ich kann keinen neuen Hash und Merkle-Root erstellen.

Antworten (4)

Genesis-Block erstellen. Manche Leute bleiben dort hängen, es ist wirklich einfach:

  • Funktion LoadBlockIndex() finden, innen ändern:
    • Paraphrase (pszTimestamp) zu jeder aktuellen Nachrichtenphase.
    • Holen Sie sich die neueste Unix-Zeit (googlen Sie) und geben Sie block.nTime ein.
    • Setzen Sie ein beliebiges nNonce (egal), Sie können auch die Zeit/Nonce für Testnet ändern, wenn Sie es verwenden möchten.

Wenn Sie fertig sind, speichern Sie es. Jetzt stimmt der Genesis-Block nicht mit dem Hash-Check und dem Merkle-Root-Check überein, es spielt keine Rolle.

Wenn Sie den kompilierten Code (Daemon oder qt) zum ersten Mal ausführen, wird "assertion failed" angezeigt. Beenden Sie einfach das Programm, gehen Sie zum Konfigurationsverzeichnis (unter AppData/Roaming), öffnen Sie das debug.log, holen Sie sich den Hash nach "block.GetHash() = ", kopieren Sie ihn und fügen Sie ihn am Anfang von main.cpp ein, hashGenesisBlock. Holen Sie sich auch den Merkle-Stamm in derselben Protokolldatei und fügen Sie ihn an der Position ... im folgenden Code in LoadBlockIndex() ein.

 assert(block.hashMerkleRoot == uint256("0x..."));

Code neu kompilieren und Genesis-Block erstellt!

Übrigens, vergessen Sie nicht, "txNew.vout[0].nValue = " auf die von Ihnen definierte Münze pro Block zu ändern, es spielt keine Rolle, 50 zu belassen, bleiben Sie einfach konsistent mit Ihrer Münze pro Block (tun Sie dies vor der Anpassung den Hash und m-root, sonst werden sie wieder geändert).

Vollständige Informationen finden Sie unter https://bitcointalk.org/index.php?topic=225690.0

Ich habe die geändert pszTimestamp, die letzte Unix-Zeit gesetzt. Nachdem ich den Daemon kompiliert und gestartet habe, litecoind: main.cpp:2788: bool InitBlockIndex(): Assertion hash == hashGenesisBlock' failed. Abortederhalte ich . Wenn ich das debug.log überprüfe, sehe ich Litecoins ursprüngliche Genesis und Merkleroot-Hashes. Was mache ich falsch?
Ich habe das versucht, aber ich bekomme ERROR: CheckProofOfWork() : hash doesn't match nBits- irgendwelche Ideen?
Hallo. Jetzt hat sich die Quelle stark verändert. Und einige Variablen existierten nicht, oder geänderte Namen oder neue Variablen kommen. Also, wie macht man das (neuen Genesis-Block erstellen, um neue Alt-Münzen zu machen), basierend auf der aktuellen Quelle?

Wenn Sie unseren eigenen einzigartigen Genesis-Block generieren möchten, sollten Sie mindestens die folgenden Parameter generieren und ersetzen:

  • nTime (die Unix-Zeit. Ihre Brieftasche zeigt die „No block source available 5 week(s) behind“ an, die erwähnt wird, wenn diese 5 Wochen alt ist)
  • pszTimeStamp (der "Zeitstempel", um zu "begründen", dass kein Premining stattgefunden hat)
  • hashMerkleRoot (die Merkle-Root basierend auf der Coinbase-Transaktion des Blocks)
  • hashGenesisBlock (der Genesis-Hash selbst!)
  • nNonce (die richtige Ansage, die bei der Suche nach dem Hash, der das Ziel (=Schwierigkeit) erfüllt, inkrementiert wird)

Der Pubkey im ausgegebenen Transaktionsskript kann auch in einen eindeutigen Wert geändert werden. Da der Genesis-Block aber sowieso nicht ausgegeben werden kann, kann der gleiche Pubkey wie zB bei Litecoin verwendet werden. Auch die nBits sollten nicht geändert werden, wenn Sie vorhaben, einen Litecoin-Klon zu erstellen.

Sie können dieses Skript verwenden, um die Werte für einen Scrypt-Genesisblock zu erstellen: https://github.com/lhartikk/GenesisH0

Wie lange dauert es im Durchschnitt, bis es generiert wird? Std? Tage? Wochen? Monate > oder sogar mehr ?
Hallo. Jetzt hat sich die Quelle stark verändert. Und einige Variablen existierten nicht, oder geänderte Namen oder neue Variablen kommen. Also, wie macht man das (neuen Genesis-Block erstellen, um neue Alt-Münzen zu machen), basierend auf der aktuellen Quelle?

Ich sehe den Code nicht, in dem Sie blockden Hash des Objekts tatsächlich ändern. Die Methode hashGenesisBlock()gibt einen Hash zurück, der jedoch nie an das blockObjekt übergeben wird.

Außerdem hat die erste Zeile Ihres Codes auch einen Fehler: Die aktuelle Zeit ist 1390959227, nicht 1390948469. Auch dies kann zu Problemen führen.

Hallo. Jetzt hat sich die Quelle stark verändert. Und einige Variablen existierten nicht, oder geänderte Namen oder neue Variablen kommen. Also, wie macht man das (neuen Genesis-Block erstellen, um neue Alt-Münzen zu machen), basierend auf der aktuellen Quelle?

Ich habe meine Genesis mit diesem Code erstellt, aber Sie müssen alle Behauptungen in chainparams.cpp kommentieren:

arith_uint256 best = arith_uint256();
int n=0;
arith_uint256 hashTarget = arith_uint256().SetCompact(genesis.nBits);
while (UintToArith256(genesis.GetHash()) > hashTarget) {
  arith_uint256 c=UintToArith256(genesis.GetHash());
                 
  if(c < best || n==0)
    {
      best = c;
      n=1;
      printf("%s %s %s\n",genesis.GetHash().GetHex().c_str(),hashTarget.GetHex().c_str(),
         best.GetHex().c_str());
    }
  
  ++genesis.nNonce;
  if (genesis.nNonce == 0) { ++genesis.nTime; }
}
printf("%s\n",genesis.ToString().c_str());