Bestimmen des Extranonce-Werts eines Blocks

Wie bestimme ich den Extranonce - Wert eines Blocks? Ich weiß, dass sie in der Coinbase-Transaktion sind, aber wo? Wie entschlüssele ich den Teil, der die Extranonce ist?

Antworten (2)

In Bitcoin v0.1.5 bis v0.3.24 enthielt das Coinbase scriptSig:

txNew.vin[0].scriptSig << nBits << ++bnExtraNonce;

In Bitcoin v0.4.0 bis v0.5.3 änderte es sich zu:

pblock->vtx[0].vin[0].scriptSig = CScript() << pblock->nTime << CBigNum(nExtraNonce);

Bitcoin v0.6.0 bis v0.6.3:

pblock->vtx[0].vin[0].scriptSig = (CScript() << pblock->nTime << CBigNum(nExtraNonce)) + COINBASE_FLAGS;

Bitcoin v0.7.0 bis aktuell:

txCoinbase.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;

Das Feld coinbase scriptSig hat sich also im Laufe der Zeit geändert, aber es hat immer die Extranonce als zweites Element platziert.

In Bitcoin v0.1.5 war die Größe unbegrenzt und in neueren Versionen sind es 4 Bytes oder weniger. (Dies wird durch den Wechsel von bnExtraNoncezu verursacht nExtraNonce.)

Es gibt einige andere seltsame Details - in v0.1.5 wird es nur zurückgesetzt, wenn der Client zurückgesetzt wird, aber in späteren Versionen wird es bei jedem neuen Block zurückgesetzt.

Dies ist natürlich genau das, was der Kernclient tut. Andere Miner oder Pools könnten etwas anderes tun.

Von hier :

Die Extranonce kann in den Coinbase-Daten einer Coinbase-Transaktion gefunden werden. Diese Daten können als Skript interpretiert werden, das Daten auf den Stack schiebt, und die Extranonce ist der zweite Wert.

{
   ...
    "vin" : [
        {
            "coinbase" : "03443b0403858402062f503253482f",
            "sequence" : 4294967295
        }
    ],
   ...
}

kann interpretiert werden als:

03 = push 3 bytes onto the stack
443b04 = 3 bytes pushed onto the stack <-- Block index
03 = push 3 bytes onto the stack
858402 = 3 bytes pushed onto the stack <-- The extranonce
06 = push 6 bytes onto the stack
2f503253482f = 6 bytes pushed onto the stack <-- arbitrary data

BEARBEITEN: Dieses Format wurde von BIP34 definiert und gilt für Blöcke mit Version >= 2. Ich bin mir nicht sicher, wie die Extranonce davor verwaltet wurde.

Diese Antwort besagt, dass Extranonce 3 Bytes beträgt, aber es sind 8 Bytes ...
Tatsächlich hatte das letzte Bit früher eine Bedeutung - es ist eine Stimme für P2SH .