Wenn ich mehrere Eingaben von derselben Adresse tätige, muss ich für jede Eingabe eine Unterschrift leisten?

Angenommen, ich habe zwei Eingänge, die zur selben Adresse gehören.

  • Muss ich für jede Eingabe ein Signaturskript bereitstellen, das beweist, dass sie mir gehört? Würde das nicht Platz verschwenden? Sind die Signaturen im Standard-Client genau gleich oder handelt es sich um zwei unterschiedliche, aber gültige Signaturen?
  • Oder kann ich nachweisen, dass ich diese Adresse nur einmal besitze?

Antworten (1)

Muss ich für jede Eingabe ein Signaturskript bereitstellen, das beweist, dass sie mir gehört?

Signaturen nur einmal für jeden öffentlichen Schlüssel zu signieren und zu überprüfen, vorausgesetzt, dass er mit SIGHASH_ALL signiert ist, scheint sicher zu sein, aber ich glaube nicht, dass es eine solche Optimierung im Bitcoin-Code gibt. Wenn jedoch etwas mit SIGHASH_SINGLE signiert wurde, wäre es nicht in Ordnung anzunehmen, dass der Besitzer des Schlüssels auch alle anderen Ausgaben genehmigt.

Würde das nicht Platz verschwenden?

Ja, und Signaturen sind die größte einzelne Komponente einer Bitcoin-Transaktion, also ist es auch ein nicht zu vernachlässigender Raum. Gleichzeitig sind Ausgaben von zwei UTXOs, die an dieselbe Adresse gesendet wurden, wahrscheinlich nicht die häufigste Art von Transaktionen.

Sind die Signaturen im Standard-Client genau gleich oder handelt es sich um zwei unterschiedliche, aber gültige Signaturen?

Wenn man sich den SignatureHashCode ansieht, werden die Eingaben scripSigalle geleert und dann wird nur diejenige, die der zu signierenden Eingabe entspricht, mit dem vorherigen scriptPubKey gefüllt (aus etwas seltsamen Gründen).

// Blank out other inputs' signatures
for (unsigned int i = 0; i < txTmp.vin.size(); i++)
    txTmp.vin[i].scriptSig = CScript();
txTmp.vin[nIn].scriptSig = scriptCode;

Dadurch ist der zu signierende Hash (das Ergebnis von SignatureHash) für jede Eingabe unterschiedlich. Da also unterschiedliche Daten signiert werden, werden die Signaturen mit Sicherheit unterschiedlich sein. Selbst wenn die zu signierenden Daten gleich wären, sind ECC-Signaturen nicht deterministisch (mit einer Zufallszahl) und daher von Signierung zu Signierung nicht gleich.


BEARBEITEN: Das lange und kurze daran ist, dass der doppelte Hash, der signiert werden muss, für jede Eingabe in der neuen Transaktion unterschiedlich ist. Selbst wenn dasselbe Schlüsselpaar verwendet wird, muss eine neue Signatur berechnet werden.

hash that needs to be signed ... is different for each inputErnsthaft? Bedeutet das, dass spätere Signaturen von früheren Signaturen abhängen?
PS Der von Ihnen zitierte Code scheint nicht mehr verwendet zu werden.
Die Signaturen hängen nicht von anderen Signaturen ab, die zu signierenden Hashes können alle im Voraus berechnet werden und sind unterschiedlich, nur weil der Index der Ausgaben von ihnen unterschiedlich ist. Wo ist der Code, der jetzt verwendet wird, um den SignatureHash zu erhalten?
Das sieht richtig aus. Es ist jetzt in einem ausgefallenen Serialisierungsobjekt in Interpreter.cpp ( github.com/bitcoin/bitcoin/blob/… ) eingekapselt.