Sie können hier die Coinbase des Genesis-Blocks sehen
txNew.vin[0].scriptSig = CScript() << 486604799 << CBigNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
In Hex zerlegt sieht es so aus
Größe von nBits als Variante
0x04
nBits selbst
0xffff001d
Satoshis Nachricht in HEX
0x5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
Und zwischen den nBits und der Nachricht von Satoshi haben wir diese drei Bytes, die die extraNonce sein sollten
0x010445
Was dem Code entspricht CBigNum(4)
, da 4 eine ganze Zahl ist, sind es 4 Bytes, wenn dies als Varint codiert wurde, ist sein Wert < 253, als solcher hätte es nur 1 Byte genommen, aber wie Sie sehen, gibt es drei Bytes. Als ich die Bitcoin-Entwickler im IRC fragte, sagten sie mir, dass dies daran liegt, dass die BigNum-Bibliothek Bits anders codiert.
Ich fing an, im Bitcoin-Quellcode herumzustöbern, insbesondere im Bignum-Wrapper. Ich fand viele überladene Konstruktoren und Operatoren, konnte aber letztendlich aufgrund meiner geringen Erfahrung mit C++ nicht herausfinden, wie diese drei Bytes berechnet und zurückgegeben werden.
Ich glaube jedoch, dass es diese Funktion ist
void setulong(unsigned long n)
{
if (!BN_set_word(this, n))
throw bignum_error("CBigNum conversion from unsigned long : BN_set_word failed");
}
Diese Bytes werden jedoch immer noch nicht zurückgegeben. Meine Frage ist also, wie ist die Ganzzahl 4, die immer noch 0x04
in Hex-Codierung sein sollte, um diese Folge von Bytes 0x010445
(Big-Endian) zu sein, damit ich es in C machen kann?
Sieht so aus, als würdest du den Code falsch interpretieren.
CBigNum ist nur eine Klasse, die Zahlen speichert. CBigNum(4)
speichert einfach die Zahl 4 und CBigNum(SHA256(block))
würde den Hash eines Blocks als Zahl speichern (schließlich gibt uns SHA256 Zahlen). CBigNum
tut, was es verspricht: es speichert eine große Zahl. Da es eine Funktion hat, die die Zahl als Big Endian exportiert, ist es hier nützlich, und die Bitcoin-Quelle verwendet es oft, um Zahlen in einem Datenstrom zu verketten.
Werfen wir einen kurzen Blick auf das Skript des Genesis-Blocks, ohne auf den Code zu schauen. Bitte öffnen Sie die entsprechende Wiki-Seite: Skript
04FFFF001D0104455468652054696D65732030332F4A616E2F32303039204368616E63656C6C6F72206F6E206272696E6B206F66207365636F6E64206261696C6F757420666F722062616E6B73
Ein Teil davon kann interpretiert werden als:
04 -> PUSH 4 bytes (FFFF001D)
01 -> PUSH 1 byte (04)
45 -> PUSH 69 bytes (The Times 03/Jan/2009 Chancellor on brink of second bailout for banks)
farmdve
Tom van der Woerdt