Wie erfolgt die Kodierung von extraNonce im Genesis-Block?

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 0x04in Hex-Codierung sein sollte, um diese Folge von Bytes 0x010445(Big-Endian) zu sein, damit ich es in C machen kann?

Antworten (1)

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). CBigNumtut, 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)
Vielen Dank. Sie müssen jedoch verstehen, dass der Code im Inneren kaum dokumentiert ist. Das Protokoll ist größtenteils gut dokumentiert, der Code jedoch nicht so sehr. CBigNum soll ein Wrapper sein, um ein C++-Wrapper für BigNum zu sein, und nicht mehr. Ich konnte nicht wissen, was es tut.
Ich habe mir diesen Code aus genau diesem Grund noch nie angesehen. Die Antwort, die ich Ihnen gegeben habe, basiert nur auf Informationen, die ich im Wiki gefunden habe.