Erklären Sie diesen Kommentar zu nNonce aus der Quelle bitcoin miner.cpp?

Dieser Kommentar befindet sich in der Bitcoin-Quelle 0.9.3 miner.cpp, direkt über der ScanHash_CryptoPPDefinition.

//
// ScanHash scannt Nonces und sucht nach einem Hash mit mindestens einigen Null-Bits.
// Es arbeitet mit Big-Endian-Daten. Der Anrufer führt die Byte-Umkehrung durch.
// Alle Eingabepuffer sind 16-Byte-ausgerichtet. nNonce wird normalerweise beibehalten
// zwischen Aufrufen, aber regelmäßig oder wenn nNonce 0xffff0000 oder höher ist,
// Der Block wird neu aufgebaut und nNonce beginnt wieder bei Null.
//
unsigned int static ScanHash_CryptoPP...
  1. Was bedeutet es, dass die Eingabepuffer 16-Byte-ausgerichtet sind? Ist das wichtig für die Hash-Berechnung?

Ich stelle fest, dass einige der Parameter dieser Methode wie folgt definiert sind:

char pmidstatebuf[32+16]; char* pmidstate = alignup<16>(pmidstatebuf);
char pdatabuf[128+16];    char* pdata     = alignup<16>(pdatabuf);
char phash1buf[64+16];    char* phash1    = alignup<16>(phash1buf);

Alle Arrays haben bereits eine Länge, die durch 16 teilbar ist. Wozu werden die zusätzlichen 16 Zeichen benötigt?

  1. Und warum nur 0xffff-Nonces ausprobieren? Ist das nur eine künstliche Begrenzung, damit das Hashing nicht ewig dauert?

Antworten (1)

  1. Was bedeutet es, dass die Eingabepuffer 16-Byte-ausgerichtet sind? Ist das wichtig für die Hash-Berechnung?

    Das bedeutet, dass die unteren vier Bits der Startadresse immer Null sind. Ich nehme an, dass dies aus Geschwindigkeitsgründen geschah. Es gibt Anweisungen, die bei nicht 16-Byte-ausgerichteten Adressen nicht funktionieren. Außerdem könnten einige CPU-Caches dies bevorzugen. Ich weiß nicht.

    Es hat jedoch keinen Einfluss darauf, wie das Mining durchgeführt wird.

  2. Alle Arrays haben bereits eine Länge, die durch 16 teilbar ist. Wozu werden die zusätzlichen 16 Zeichen benötigt?

    Nicht ganz. Beachten Sie, wie diese Adressen abgerufen werden. Es deklariert ein Array und manipuliert dann den Zeiger auf dieses Array. Es gibt keine plattformunabhängige Möglichkeit, das Betriebssystem nach einem ausgerichteten Speicherbereich zu fragen. Stattdessen müssen Sie nach etwas fragen, das etwas größer ist als das, was Sie wollen, und den Zeiger erhöhen, bis er auf der gewünschten Grenze landet.

    Nebenbemerkung: Dies ist ein Off-by-One-Fehler. Das Array muss wirklich nur 15 Byte größer als normal sein. Reparieren lohnt sich wahrscheinlich nicht.

  3. Und warum nur 0xffff-Nonces ausprobieren? Ist das nur eine künstliche Begrenzung, damit das Hashing nicht ewig dauert?

    Es versucht alle Nonce-Werte. Es kehrt jedoch alle 65536 Iterationen von der Funktion zurück, sodass die übergeordnete Funktion dies überprüfen kann

    • dass es immer noch an der Spitze der Kette abbaut,
    • dass es tatsächlich noch mit dem Netzwerk verbunden ist,
    • dass die Transaktionen nicht veraltet sind, und
    • dass sich die Nonce nicht umwickeln wird.

    Grundsätzlich ist die gesamte komplizierte Logik in ihrem Aufrufer implementiert, BitcoinMiner.

    PS: Dieser Kommentar ist falsch. Es scheint ScanHash zu beschreiben, aber eigentlich geht es um diesen Codeabschnitt in BitcoinMiner:

        // Check for stop or if block needs to be rebuilt
        boost::this_thread::interruption_point();
        if (vNodes.empty() && Params().NetworkID() != CChainParams::REGTEST)
            break;
        if (nBlockNonce >= 0xffff0000)
            break;
        if (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60)
            break;
        if (pindexPrev != chainActive.Tip())
            break;
    

    Jemand sollte den Kommentar wahrscheinlich verschieben.