Wie erkennt die Brieftasche, welche UTXOs zu einer öffentlichen Adresse gehören, während sie eine neue Transaktion erstellt?

Ich bin hier Anfänger. Eine Transaktionsausgabe hat ein Feld für den Betrag und ein Sperrskript, aber kein direktes Feld für die öffentliche Adresse, für die die Ausgabe bestimmt ist. Wenn eine neue Transaktion erstellt wird, durchsucht das Wallet das UTXO-Set nach Ausgaben, die an eine der öffentlichen Adressen des Wallets gebunden sind.

Meine Frage ist, woher weiß die Brieftasche während der Suche, dass ein bestimmtes UTXO an seine öffentliche Adresse gebunden ist?

Überprüft es jedes UTXO mit einem Entsperrskript, um festzustellen, ob es an seine öffentliche Adresse gesperrt ist?

Oder unterhält es eine separate Datenbank, die öffentliche Adressen den dafür vorgesehenen UTXOs zuordnet, oder ähnliches für eine schnellere Suche?

Wie findet es diese Teilmenge von UTXOs, die an die öffentliche Adresse gebunden ist?

Antworten (3)

Eine Transaktionsausgabe hat ein Feld für den Betrag und ein Sperrskript, aber kein direktes Feld für die öffentliche Adresse, für die die Ausgabe bestimmt ist.

Das ist nicht ganz richtig und scheint die Quelle der Verwirrung zu sein. Ein "Sperrskript" enthält den wesentlichen Teil einer Adresse, umgeben von den zusätzlichen Befehlen, die erforderlich sind, um die Bitcoins in dieser Ausgabe für die Adresse zu sperren (oder zu belasten ). Schauen wir uns ein Beispiel an; Zuerst bekommen wir eine Adresse:

$ bitcoin-cli getnewaddress
397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b

Dann fragen wir das Wallet, was es über diese Adresse weiß:

$ bitcoin-cli validateaddress 397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b
{
  "isvalid": true,
  "address": "397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b",
  "scriptPubKey": "a91451812710fc166bf61033afc0d2a8d7cda7a0fd8c87",
  "isscript": true,
  "iswitness": false
}

Beachten Sie das scriptPubKey – das nennen Sie das „Sperrskript“. Mal sehen, was das Skript sagt:

$ bitcoin-cli decodescript a91451812710fc166bf61033afc0d2a8d7cda7a0fd8c87
{
  "asm": "OP_HASH160 51812710fc166bf61033afc0d2a8d7cda7a0fd8c OP_EQUAL",
  "reqSigs": 1,
  "type": "scripthash",
  "addresses": [
    "397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b"
  ]
}

Das asmFeld ist die interpretierte Form des Sperrskripts; OP_HASH160und OP_EQUALsind zwei Teile der Belastung im P2SH-Stil für Adressen, die mit einer 3 beginnen. Der Wert in der Mitte 5181...fd8cist die hexadezimale Form des wesentlichen Bestandteils der Adresse (andere Teile der Adresse sind ein Versionsbyte und eine Prüfsumme; diese sind ' Es ist nicht erforderlich, das Sperrskript einzufügen).

Kurz gesagt, die Adresse 397yNmAFc1w6AK1gqkKNxJPb44jnvznm2bist eine Repräsentation derselben Sache wie der scriptPubKey a91451812710fc166bf61033afc0d2a8d7cda7a0fd8c87. Der scriptPubKey sind die Daten, die tatsächlich in die Ausgabe eingefügt werden, um anzuzeigen, dass ein bestimmter Satz von Bitcoins vom Eigentümer der entsprechenden Adresse kontrolliert wird.

Wie findet es diese Teilmenge von UTXOs, die an die öffentliche Adresse gebunden ist?

Ein Wallet, das Teil eines Full Node ist, scannt einfach jede Transaktion, die der Full Node erhält, um zu sehen, ob eine ihrer Ausgaben einen der scriptPubKeys (Adressen) dieses Wallets bezahlt. Wenn dies der Fall ist, speichert das Wallet diesen UTXO in seiner eigenen Datenbank, bis es Zeit ist, ihn auszugeben.

Lightweight Wallets bitten in der Regel Full Nodes oder Server, ihnen bei der Suche nach den Ausgängen zu helfen. Manchmal beinhaltet dies das Scannen von Blöcken im Grunde genauso wie das Full Node Wallet mit einigen zusätzlichen Schritten (siehe BIP37 ), manchmal baut der Server eine riesige Datenbank mit jeder gesehenen Adresse auf und führt Suchabfragen darauf durch (siehe Electrum-Server ) und manchmal die full node erstellt einen sehr kompakten Index und sendet diesen an den Lightweight-Client, damit der Client Blöcke anfordern kann, die seine Transaktionen enthalten könnten (siehe BIP158 ).

Insbesondere müssen Brieftaschen wissen, welches UTXO Sie bezahlt hat, um Ihnen Ihr Guthaben anzuzeigen, sodass Brieftaschen UTXOs nicht nachschlagen, wenn Sie sie ausgeben , sondern wenn sie sie erhalten.

Ich danke dir sehr. Mein Verständnis des "Sperrskripts" war falsch. Nochmals vielen Dank für die Hilfe. :)

Das Skript des UTXO enthält entweder einen öffentlichen Schlüssel (in P2PK-Ausgaben nicht mehr wirklich verwendet) oder einen HASH_160 des öffentlichen Schlüssels oder des Einlösungsskripts. Segwit-Ausgaben enthalten in ähnlicher Weise einen Hash des Witness-Skripts (obwohl dies ein SHA256 und kein HASH_160 ist).

Ihr Wallet weiß, welche Einlöseskripte und Schlüssel es enthält, und kann die entsprechenden Hashes berechnen. Es überprüft dann einfach neue Blöcke, um zu sehen, ob eine Ausgabe mit einer für Ihre Brieftasche übereinstimmt. Es muss nicht versucht werden, irgendwelche Ausgänge zu entsperren.

Da das Wallet eingehende Blöcke scannt (und die Kette beim ersten Erstellen), ist es in der Lage, ein lokales UTXO-Set zu verwalten. Das bedeutet, dass Sie nicht jedes Mal die gesamte Kette durchsuchen müssen, wenn Sie eine Sendung machen möchten.

Eine Transaktionsausgabe hat ein Feld für den Betrag und ein Sperrskript, aber kein direktes Feld für die öffentliche Adresse, für die die Ausgabe bestimmt ist.

Eine Form der Anrede ist im Skript enthalten.

Die Art von Skript, auf die Sie sich beziehen, ist Pay-to-Public-Key-Hash (P2PKH). Ihre Sperrbedingung (Ausgabeskript) erfordert, dass der Zahlungsempfänger eine Signatur bereitstellt, die mit einem öffentlichen Schlüssel übereinstimmt, der durch seinen Hash-Wert identifiziert wird.

OP_DUP OP_HASH160 <pubkeyhash> OP_EQUALVERIFY OP_CHECKSIGNATURE

Die Freischaltbedingung im Eingabeskript liefert den öffentlichen Schlüssel und die Signatur.

<signature> <pubkey>

Die Entsperrbedingung wird zuerst ausgeführt, dann die Sperrbedingung, was zu diesem Validierungsskript führt:

<signature> <pubkey> OP_DUP OP_HASH_160 <pubkeyhash> OP_EQUALVERIFY OP_CHECKSIGNATURE

Meine Frage ist, woher weiß die Brieftasche während der Suche, dass ein bestimmtes UTXO an seine öffentliche Adresse gebunden ist?

Das Wallet kennt den öffentlichen Schlüssel, nach dem es suchen möchte. Aus dem öffentlichen Schlüssel kann es <pubkeyhash>. Unter Verwendung des Hashs kann es eine Reihe von Ausgaben abfragen, die nach P2PKH-Sperren suchen, die mit dem Hash des öffentlichen Schlüssels übereinstimmen.