Wie werden Blöcke verifiziert?

Ich sehe im Bitcoin-Wiki, dass es etwas namens "Skript" gibt, das zu einem Bytecode kompiliert wird, der von einer sehr sehr einfachen virtuellen Maschine ausgeführt wird. Bedeutet dies, dass jeder Block tatsächlich nur eine Zeichenfolge/ein Array von Bytes ist, wenn er ankommt und von einem Knoten verarbeitet wird? ein Block in seinem "wahren" Format würde also ungefähr so ​​​​aussehen wie [0x01, 0x04, 0x0f, 0xa1 .... etc. ?

und dann legt der Knoten, der den Block empfängt, die Bytes einfach in den Interpreter, der von der Bitcoin-VM ausgeführt werden soll?

welches ist richtig? ein Block ist reiner Bytecode oder JSON? Was würde ein Bitcoincore-Knoten verstehen, wenn er einen neuen Block erhält?

... und das Wiki gibt einen detaillierten Überblick über die stattfindenden Prüfungen: en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages

Antworten (2)

Ein Block besteht aus einem Header und einer Reihe von serialisierten Transaktionen. Der Block-Header enthält kein Skript, er enthält nur Daten wie den Merkle-Stamm der Transaktionen im Block (der Header wird also in die Liste der Transaktionen übernommen), Nonce, Versionsnummer usw. Beachten Sie, dass ein Block nicht mit codiert ist JSON, es hat ein eigenes Serialisierungsformat, das Sie in den meisten Entwicklerdokumentationen finden können (z. B. hier )

Das Skript ist nur in den Transaktionen selbst enthalten, speziell um die Ausgabenbedingung einer Ausgabe zu diktieren. Eine Ausgabe hat einen scriptPubKey, der das Ausgabeskript enthält (normalerweise in einer bestimmten Form wie P2PKH, P2SH), und die Eingabe, wenn sie ausgegeben wird, enthält eine scriptSig, die das Ausgabeskript enthält. Bei getrennten Zeugentransaktionen ist die scriptSig leer und das Skript befindet sich stattdessen im Zeugenabschnitt der Transaktion, aber es ist immer noch das gleiche Prinzip.

Die Blockverifizierung umfasst eine Reihe von Schritten, z. B. die Validierung des Arbeitsnachweises, die Validierung, dass der Zeitstempel in Ordnung ist, dass die Coinbase-Transaktion in Ordnung ist, dass alle anderen Transaktionen in Ordnung sind usw. usw.

Ich sehe im Bitcoin-Wiki, dass es etwas namens "Skript" gibt, das zu einem Bytecode kompiliert wird, der von einer sehr sehr einfachen virtuellen Maschine ausgeführt wird.

Skript ist eine Stack-basierte Sprache, die verwendet wird, um Ein- und Ausgabeskripte in Transaktionen zu validieren . Das Skript ist absichtlich so konzipiert, dass es keine Turing-Vollständigkeit (keine Schleifen) aufweist, sodass es deterministischer Natur ist. (Keine Endlosschleifen usw.). Eine Eingabe/Ausgabe wird als "gültig" betrachtet, wenn das oberste Stapelelement wahr (oder 0x01) ist.

Bedeutet dies, dass jeder Block tatsächlich nur eine Zeichenfolge/ein Array von Bytes ist, wenn er ankommt und von einem Knoten verarbeitet wird?

Bitcoin-Knoten validieren Transaktionen, Bitcoin-Miner berechnen Blöcke gemäß dem im Bitcoin-Protokoll definierten Proof-of-Work-Modell. Abgesehen davon, ja, technisch gesehen sind die rohen Blockdaten ein Array von hexadezimalen Bytes. Wenn Miner mit dem Mining des Blocks beginnen, hashen sie nur den Header des Blocks (die ersten 80 Bytes), der die folgenden Informationen enthält:

nVersion|hashPrevBlock|hashMerkleRoot|Time|Bits|Nonce

Sie können damit durchkommen, da der hashMerkleRootWert ein Verweis auf den Hash aller Transaktionen in dem Block ist, den sie abbauen. Diese Transaktionen wurden von Nodes validiert.

getblockIn Bitcoin-Core können Sie die Serialisierung als zweiten Parameter im Befehl angeben . Standardmäßig werden die Daten in einer JSON-ähnlichen Ausgabe angezeigt, obwohl es sich wirklich um eine lange hexadezimale Ausgabe handelt.


Beispiel:

getblock 00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 0

Ausgabe:010000007de867cc8adc5cc8fb6b898ca4462cf9fd66...