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?
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 bnExtraNonce
zu 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.
Geremia
Nick Odell