Wann und wo sind beim Signieren von P2SH-Rohtransaktionen zusätzliche Informationen hinzuzufügen?

Dieser Beitrag ist ziemlich lang, also zusammenfassend: Ich frage mich, wo ich zusätzliche Informationen hinzufügen kann, wenn ich eine Rohtransaktion signiere (in diesem Fall ein Klartext eines Digest ). Ich frage mich auch, ob das Missing inputs (code -25), was ich bekomme, ohne den Digest bereitgestellt zu haben und zu versuchen, trotzdem zu unterschreiben, daran liegt oder an etwas anderem.

Ich versuche, einen gehashten Time-Lock-Vertrag mit Bitcoin zu unterzeichnen, der so aussieht:

OP_IF [HASHOP] <digest> OP_EQUALVERIFY OP_DUP OP_HASH160 <seller pubkey hash> OP_ELSE <num> [TIMEOUTOP] OP_DROP OP_DUP OP_HASH160 <buyer pubkey hash> OP_ENDIF OP_EQUALVERIFY OP_CHECKSIG

und wie bei allen P2SH sollten Sie es so zum Netzwerk hinzufügen und signieren:

Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Signature script: <sig> [sig] [sig...] <redeemScript>.

Also habe ich einige Bitcoins an die base58-codierte P2SH-Adresse gesendet und eine Rohtransaktion an dieselbe Adresse wie erstellt seller pubkey hash. Aber wenn ich gerade unterschreibe, kann ich einfach nicht finden, wo ich die digest.

Gemäß dem signrawtransaction RPC-Aufruf: http://chainquery.com/bitcoin-api/signrawtransaction muss ich hinzufügen

2. "prevtxs" (string, optional) An json array of previous dependent transaction outputs [ (json array of json objects, or 'null' if none provided) { "txid":"id", (string, required) The transaction id "vout":n, (numeric, required) The output number "scriptPubKey": "hex", (string, required) script key "redeemScript": "hex", (string, required for P2SH or P2WSH) redeem script "amount": value (numeric, required) The amount spent } ,... ]

wo ich denke, dass ich den Digest hinzufügen kann. Sollte es vielleicht zu den hinzugefügt werden redeemScript?

Dann gibt es auch noch:

3. "privkeys" (string, optional) A json array of base58-encoded private keys for signing [ (json array of strings, or 'null' if none provided) "privatekey" (string) private key in base58-encoding ,... ]

aber es scheint mir seltsam, dass ich das base58-codieren muss, digestwenn es wahrscheinlich ein Hex-String sein sollte?

Nur für den Fall, dass ich nichts Wichtiges verpasse, werde ich auch einige der Schritte im Detail auflisten, die ich bis zu diesem Punkt gemacht habe (alles auf Regtest gemacht).

Also habe ich damit begonnen, eine Rohtransaktion an die P2SH-Adresse zu erstellen (da sendtoaddressmir Fehler über zu hohe oder niedrige Gebühren angezeigt wurden):

createrawtransaction "[{\"txid\":\"5f3671ca7d5dea44dd3dd40fad076e76c57189702a4bb92bacb1747017136982\",\"vout\":0}]" "{\"2N5ZRwT42rHFjAtizZPa3Rp7Tn88PcoSzEB\":5, \"n1uGNwJ5nrrhTh4wQX5XKYpxDoZsp3w2fB\":40}" Nachdem ich die Rohtransaktion signiert und entschlüsselt hatte, um die zu erhalten, txiderstellte ich eine weitere Transaktion für mein eigenes Konto:

createrawtransaction "[{\"txid\":\"f345938d21bc3fc0966a4f11a0e6b98831640b2cc6cf49bd143758cd95762a1c\",\"vout\":0}]" "{ \"n1uGNwJ5nrrhTh4wQX5XKYpxDoZsp3w2fB\":5}".

Schließlich habe ich versucht, die Transaktion mit nichts als den Feldern zu signieren, die ich kannte prevtxs:

signrawtransaction "02000000011c2a7695cd583714bd49cfc62c0b643188b9e6a0114f6a96c03fbc218d9345f30000000000ffffffff010065cd1d000000001976a914df9ac343e79ae35a727ff757b02e93ac5a4748dd88ac00000000" "[{\"txid\":\"f345938d21bc3fc0966a4f11a0e6b98831640b2cc6cf49bd143758cd95762a1c\",\"vout\":0, \"scriptPubKey\": \"76a9149a57624114b8c67ea007616a210ffe79e711bbd988ac\", \"redeemScript\":\"63a61486b8e067c700620260ad44f108e4add2ebf3c1d28876a91422a29435b1386d8fbc779a72612ccda7401d4aa2675cb27576a9147074ce8ff2f417d6b232d73a789ca09e7c0e8ef36888ac\", \"amount\":5}]".

Beim Versuch, sendrawtransactiondies zu tun, erhalte ich einen Fehlercode Missing inputs (code -25). Meine letzte Frage lautet also: hängt es damit zusammen Missing inputs, dass ich nichts angegeben habe, oder liegt es daran, dass ich es versäumt habe, etwas anderes hinzuzufügen?digestsignrawtransaction

Antworten (1)

Der RPC von Bitcoin Core signrawtransactionkennt den spezifischen Skripttyp nicht, für den Sie zu signieren versuchen, und kann nicht verwendet werden.

Sie müssen die Signaturlogik selbst implementieren.

Ok, das ist schade ... Ein paar Fragen: Gibt es einen anderen Client, der diese Art von Transaktion einfacher unterstützt? Wenn ich versuchen würde, dies zu implementieren, wie viel Arbeit würden Sie damit rechnen?
Es ist im Allgemeinen nicht möglich, glaube ich, oder zumindest sehr schwer. Sie können sich nicht einfach ein Skript ansehen und wissen, wie Sie es erfüllen können.
Ok, dann wurde also ein Großteil der P2SH-Funktionalität nicht vollständig implementiert? Scheint nur seltsam, weil es an vielen Stellen erwähnt wird, wie hier: en.bitcoin.it/wiki/Hashed_Timelock_Contracts , aber sie sprechen auch über die Einrichtung von Zahlungskanälen, die meiner Meinung nach etwas außerhalb des Netzwerks sein müssen, wie das Lightning Network dann?
@Jestin "vollständig implementiert" ist bedeutungslos; Skripte sind kein Selbstzweck, sondern ein Mittel, um bestimmte übergeordnete Ziele zu erreichen. Wenn Ihre Anwendung ein ungewöhnliches Skript benötigt, müssen Sie einen Unterzeichner für dieses Skript implementieren.
Ich denke, Sie müssen P2SH (als Blockchain-Validierungsregel) und P2SH-Implementierungen in Brieftaschen unterscheiden. Da P2SH zum Senden an beliebige Skripte verwendet werden kann, ist es unmöglich, eine Wallet-Software zu haben, die für jedes mögliche Skript signieren kann. Das ist nicht anders als sich zu fragen, da wir CPUs haben, die beliebige Software ausführen können, warum wir Krebs noch nicht mit Simulationen gelöst haben (da CPUs beliebige Simulationen ausführen können!). Jemand muss es noch umsetzen.