Wie überprüfen wir die Signatur einer Rohtransaktion mit Bitcoinj?

Ich habe es geschafft, mit Bitcoinj einen Roh-TX zu erstellen, konnte aber nicht herausfinden, wie ich seine Signaturen verifizieren kann. Angenommen, ich kenne die Adressen, die den (angeblich) nicht verbrauchten Ausgängen entsprechen, die als Eingänge für den Tx verwendet werden, was ist der einfachste Weg, den Tx zu überprüfen?

Antworten (1)

Sie interessieren sich für die folgenden API-Aufrufe:

public List<TransactionInput> Transaction.getInputs()
public Script TransactionInput.getScriptSig() throws ScriptException
public void Script.correctlySpends(Transaction txContainingThis, long scriptSigIndex, Script scriptPubKey)

Verwenden Sie sie wie folgt:

Transaction tx = ...
List<TransactionInput> inputs = tx.getInputs();
for(int i = 0; i < inputs.size(); i++) {
    TransactionInput input = inputs.get(i);
    Script scriptSig = input.getScriptSig();
    Script scriptPubKey = ...
    scriptSig.correctlySpends(tx, i, scriptPubKey);
}

Das Knifflige ist, scriptPubKey zu bekommen. Wenn Sie die Transaktionen, die Sie ausgeben, im Speicher haben, ist es so einfach wieinput.getConnectedOutput().getScriptPubKey();

Wenn dies nicht der Fall ist, können Sie eine fundierte Vermutung anstellen, indem Sie die Adresse in einen P2PKH -SkriptPubKey konvertieren.

public static Script ScriptBuilder.createOutputScript(Address to)

Dies schafft einen Grenzfall, in dem jemand versucht, eine P2PK-Ausgabe auszugeben , die scheinbar falsch mit Ihrem Programm signiert ist. (Beide werden durch Adressen repräsentiert.)

Scheint die Frage zu beantworten. Werde prüfen und zurückschicken. Danke für die Erwähnung der P2PK-Ausgänge. Die Transaktionen werden von mir erstellt und sind Standard, daher kann ich dies wahrscheinlich ignorieren.
correctlySpendserfordert einen vierten booleschen Parameter ( enforceP2SH). Was ist das?
@ Jus12 Es dient zur Implementierung eines seltenen Randfalls von BIP0016 . Setzen Sie es auf wahr. PS Sie verwenden eine alte Version von BitcoinJ. Sie sollten es aktualisieren.
Vielen Dank. Ich habe es auf wahr gesetzt. Es gibt signifikante Änderungen von 0,11 bis 0,12. Ich habe versucht, ein Upgrade durchzuführen, aber es beschädigt meinen Code (erfordert einige Umgestaltungen). Werde es irgendwann hinbekommen. Gibt es ernsthafte Probleme bei der Verwendung von 0,11?
@ Jus12 I tried to upgrade but it breaks my code (requires some refactoring)Ah, fair genug. Are there any serious issues in using 0.11?Nun, die Leute im Internet werden davon ausgehen, dass Sie die neueste Version verwenden. :) Aber mir fällt nichts Konkretes ein.
Als Update gibt es tatsächlich einige ernsthafte Probleme bei der Verwendung von 0.11, basierend auf diesem Fehlerbericht: github.com/bitcoinj/bitcoinj/issues/1082