Details zum Genesis-Block

Die hier gestellte Frage zeigt den Genesis-Block ziemlich detailliert an. Ich versuche immer noch, eine Aufschlüsselung einiger der Elemente zu erhalten, die hier zu sehen sind (und einige andere, die hier nicht zu sehen sind):

  1. Die Merkle-Wurzel
  2. Zeit
  3. Bits
  4. Nonce
  5. Der Transaktionsbereich:
    • Münzbasis
    • scriptSig
    • scriptPubKey

Woher all diese Elemente kommen, ist mir noch unklar.

Die Merkle Root ist, wie ich es verstehe, im Grunde ein Hash aus vielen Hashes (gutes Beispiel hier ) - um eine Merkle Root zu erstellen, müssen Sie damit beginnen, einen doppelten SHA-256-Hash der Byteströme der Transaktionen im Block zu nehmen. Was sind das daten (die bytestreams), wie sehen sie aus und wo kommen sie her? Ich denke, um diese Fragen zu verstehen, sollte man die Daten besser verstehen, die hier unter "Example tx message" zu finden sind .

Nachdem ich diese Daten studiert habe, verstehe ich sie auch nicht vollständig. Ich bin mir nicht sicher, woher TxIn, TxOut und OutPoint kommen. Wie sehen sie für den Genesis-Block aus? Ich habe gesehen, dass ein Kollege eine ähnliche Frage hatte, aber sie wurde nie wirklich beantwortet (es sei denn, die TxIn-Sequenz ist etwas völlig anderes als nur TxIn).

Wenn die Coinbase "die erste Eingabe der ersten Transaktion" ist, würde es meiner Meinung nach erklären, wie die Coinbase für den Genesis-Block aussieht, wenn ich mehr über TxIn und TxOut weiß, was eine andere Sache ist, die ich nicht verstehe.

Kann mir jemand erklären oder mich darauf hinweisen, wie diese Datenbits für den Genesis-Block aussehen?

Für eine technisch tiefgehende Erklärung dieser verschiedenen Dinge wärst du am besten dran, entweder das Bitcoin-Wiki zu durchsuchen oder mein persönlicher Favorit ist der Entwickler-GUide! Zum Beispiel die Erklärung des Block Headers mit der Zeit, Bits, Nonce etc und mehr auf dem Merkleroot

Antworten (1)

Beachten Sie, dass alle Hex-Zahlen und Hashes hier und im Protokoll Little Endian sind. Die, die ich zeige, werden also von vielen Seiten rückwärts blicken, die sie im Big-Endian-Format zeigen.

Die Merkle-Wurzel

Dies ist eine Möglichkeit, alle Hashes der Transaktion zu einem Hash zusammenzufassen. Dazu benötigen wir zunächst die Hashes aller Transaktionen. Es gibt nur eine Transaktion im Genesis-Block, also suchen wir ihren Hash. Dies basiert auf diesem Format.

import hashlib

#version 1, uint32_t
version = "01000000"

#1 input transaction, var_int
tx_in_count = "01"

#the default for generation transactions since there is no transaction to use as output
OutPoint_hash = "0000000000000000000000000000000000000000000000000000000000000000" 

#also default for generation transactions, uint32_t
OutPoint_index = "ffffffff"

previous_output = OutPoint_hash + OutPoint_index

#77, var_int
script_length = "4d"

#The coinbase. In a regular transaction this would be the scriptSig, but unused in generation transactions.
#Satoshi inserted the headline of The Times to prove that mining did not start before Jan 3, 2009.
#???????EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks
signature_script = "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"

#final sequence, means it can't be replaced and is immediately locked, uint32_t
sequence = "ffffffff"

tx_in = previous_output + script_length + signature_script + sequence

#1 transaction output, var_int
tx_out_count = "01"

#5000000000 satoshis == 50 bitcoin, uint64_t
value = "00f2052a01000000"

#67 var_int
pk_script_length = "43"

#The scriptPubKey saying where the coins are going.
pk_script = "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac"
#We can decode this.
#41 push the next 65 bytes onto the stack
#04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f the 65 bytes that get pushed onto the stack
#ac OP_CHECKSIG
#This is a pay-to-pubkey output, which is the default for generation transactions.

tx_out = value + pk_script_length + pk_script

#immediately locked, uint32_t
lock_time = "00000000"

transaction = version + tx_in_count + tx_in + tx_out_count + tx_out + lock_time

transaction_bin = transaction.decode("hex")
transaction_hash_bin = hashlib.sha256(hashlib.sha256(transaction_bin).digest()).digest()
transaction_hash = transaction_hash_bin.encode("hex")
print(transaction_hash)
3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a

Jetzt, da wir den Transaktions-Hash für die 1-Transaktion haben, müssen wir die Merkle-Wurzel finden. Es stellt sich heraus, dass die Merkle-Wurzel eines einzelnen Hashs ... dieser einzelne Hash ist. Das ist also die Merkle-Wurzel.

Zeit

29ab5f49, uint32_t. Dies ist 1231006505 in Dezimalzahl und ist ein Unix-Zeitstempel, der den 3. Januar 2009 um 18:15:05 Uhr UTC bedeutet.

Bits

ffff001d == 486604799, uint32_t. Dies ist eine Möglichkeit, die Schwierigkeit darzustellen. Es ist eine Art Fließkommazahl. Dies ist Schwierigkeit 1 und erfordert Hashes, die kleiner oder gleich dem Ziel von 00000000000000000000000000000000000000000000000000FFFF00000000 sind.

Nonce

1dac2b7c == 2083236893, uint32_t

Transaktionsbereich

Das meiste davon habe ich im Merkle-Wurzel-Abschnitt behandelt.

Wenn Sie die Erklärung eines anderen für jedes Byte des Genesis-Blocks wünschen, schauen Sie hier .