Wie signiere ich eine Transaktion mit mehreren Eingaben?

Ich konnte eine Anwendung in Python programmieren, die gültige Transaktionen sendet, die 1 Eingabe ausgeben, aber ich kann es wirklich nicht mit 2 oder mehr Eingaben zum Laufen bringen.

Meine Frage ist also, wie genau wird der Hash berechnet, der für jede Eingabe signiert werden muss?

Was ich bisher gemacht habe, ist zum Beispiel, wenn wir 2 Eingaben haben, generieren wir eine Transaktion, die nur diese erste Eingabe ausgibt, und das ist der Hash, der für die erste Eingabe signiert werden muss. Und das gleiche gilt für die zweite Eingabe, wir generieren eine Transaktion, die nur diese zweite Eingabe ausgibt. Beide Transaktionen müssen dieselben Ausgaben haben.

Ist das korrekt? Zum Beispiel möchten wir Eingabe aaaa:0 und Eingabe bbbb:1 ausgeben und wir möchten sie an eine Adresse senden:

Um den Hash zu berechnen, den die erste Eingabe signieren muss, müssen wir diese Transaktion generieren:

'version': 1,
'inputs': (1)
    'output_tx_hash': 'aaaa',
    'output_position': 0,
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

Und um den Hash zu berechnen, den die zweite Eingabe signieren muss:

'version': 1,
'inputs': (1)
    'output_tx_hash': 'bbbb', # this changes
    'output_position': 1,     # this changes
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

Wir serialisieren sie, fügen sie 01000000 (SIGHASH_ALL) hinzu, verdoppeln sha256 das, signieren es und fügen 01 hinzu. Auf diese Weise erhalten wir die beiden Signaturen, die wir jeweils für jede Eingabe verwenden werden. Meine Anwendung tut genau das und funktioniert nicht. Was vermisse ich?

Vielleicht werfen Sie einen Blick auf python-bitcoinlib .
Das genaue Vorgehen ist in dieser Frage dokumentiert: bitcoin.stackexchange.com/questions/3374/…
Dieses Verfahren zeigt, wie eine Transaktion mit nur einer Eingabe signiert wird. Das ist die Antwort, mit der ich gelernt habe, wie man 1 Eingabe signiert, und ich habe es erreicht, aber mit 2 oder mehr Eingaben kann ich es einfach nicht zum Laufen bringen, und diese Antwort sagt nicht, wie es gemacht werden sollte.

Antworten (3)

Ich habe den Weg gefunden, also, falls es jemanden interessiert, hier ist, wie es geht:

Wenn Sie mehr als eine Eingabe haben, müssen Sie die Eingaben, die Sie nicht signieren möchten, nicht entfernen, Sie müssen nur ihre Skripts entfernen . Wenn Sie also die in der Frage gepostete Transaktion signieren möchten, würde der erste Hash wie folgt berechnet:

'version': 1,
'inputs': (2)
    {
    'output_tx_hash': 'aaaa',
    'output_position': 0,
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
    }, {
    'output_tx_hash': 'bbbb',
    'output_position': 1,
    'script': '', # Nothing
    'sequence': ffffffff,
    }
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

Und der zweite Hash:

'version': 1,
'inputs': (2)
    {
    'output_tx_hash': 'aaaa',
    'output_position': 0,
    'script': '', # Nothing
    'sequence': ffffffff,
    }, {
    'output_tx_hash': 'bbbb',
    'output_position': 1,
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
    }
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

Hoffe, es hilft jemandem.

Alter, ich habe das den ganzen verdammten Tag recherchiert. Ich wünschte, ich hätte das vor fünf Stunden gesehen. Vielen Dank.
Dasselbe! Ich könnte nicht glücklicher sein, dies zu finden.
Was machen Sie also mit den beiden Hashes?

Bei mir hat es auch funktioniert.

Du musst nur

1) Verfassen Sie signierbar für die erste Eingabe, mit einer Zeichenfolge der Länge Null als Skript für alle Eingaben außer der signierten

2) Signieren Sie die erste Eingabe mit der Kodierung von signed signable from 1.

3) Führen Sie die gleiche Operation an jedem Eingang durch

Ja, das funktioniert, aber pass auf, wenn es sagt

'script': '' # Nothing

Sie sollten dort eigentlich ein 0x00 platzieren. Sobald ich das getan hatte, gelang es mir erfolgreich, meine Transaktion mit mehreren Eingaben zu übertragen. Anfangs hatte ich buchstäblich nichts dort (kein einziges Byte), was nicht funktionieren wird.