So signieren Sie eine rohe Multisig-Transaktion von einem externen privaten Schlüssel

Ich erstelle eine 2-von-3-Multisig-Brieftasche, bei der die 2 Hotkeys externe HSM-Geräte sind. Ich verwende Bcoin, um meine Transaktionen zu erstellen. Nachdem die Transaktionen erstellt wurden, sende ich die Rohtransaktion an eine externe Anwendung, um die Signierung vorzunehmen.

Meine Frage ist, welcher Teil genau vom privaten Schlüssel signiert werden muss?

Das ist zum Beispiel meine Transaktion:

{
    "hash": "e82c7bdfc864ab4d0592045dd86b81a438eeee77f8415c0a84e1aa0ea8e17786",
    "witnessHash": "e82c7bdfc864ab4d0592045dd86b81a438eeee77f8415c0a84e1aa0ea8e17786",
    "fee": 1000000,
    "rate": 4424778,
    "mtime": 1568880046,
    "version": 1,
    "inputs": [
        {
            "prevout": {
                "hash": "3b1dd17cc82e2ac43ba62bf8f1c6a0fe805df43911653d22c902571eb3a212ce",
                "index": 0
            },
            "script": "000000004c6952210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53ae",
            "witness": "00",
            "sequence": 4294967295,
            "coin": {
                "version": 1,
                "height": -1,
                "value": 10000000000,
                "script": "a9144de6d3580732a7c7c2b1eb043cb1b89350c265fa87",
                "address": "38nvUMbXFdXDp4PTWvbohCbnPJuLUVwzXr",
                "coinbase": false
            }
        }
    ],
    "outputs": [
        {
            "value": 5000000000,
            "script": "a91481be67198d33319415d09b03f2dc2cfa4cdb42aa87",
            "address": "3DX3BhmdRGf5vYbtzHKzazGmZ7WgUkhFRk"
        },
        {
            "value": 4999000000,
            "script": "a9144de6d3580732a7c7c2b1eb043cb1b89350c265fa87",
            "address": "38nvUMbXFdXDp4PTWvbohCbnPJuLUVwzXr"
        }
    ],
    "locktime": 0,
    "hex": "0100000001ce12a2b31e5702c9223d651139f45d80fea0c6f1f82ba63bc42a2ec87cd11d3b000000006f000000004c6952210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53aeffffffff0200f2052a0100000017a91481be67198d33319415d09b03f2dc2cfa4cdb42aa87c0aff6290100000017a9144de6d3580732a7c7c2b1eb043cb1b89350c265fa8700000000"
}

Wenn Sie das scriptin entschlüsseln, inputsist es:

OP_0 OP_0 OP_0 OP_0 52210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53ae

Wie Sie sehen können, gibt es 4 OP_0 Platzhalter , um die Signaturen einzugeben. Nun ist meine Frage, welchen Teil der Transaktion die externe Signaturanwendung signieren soll. Ist es nur das 000000004c6952210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53aeTeil?

Jede Referenz wird sehr geschätzt. Ich habe https://en.bitcoin.it/wiki/Transaction und https://en.bitcoin.it/wiki/OP_CHECKSIG gelesen , aber ich kann es nicht genau herausfinden. Danke schön.

Antworten (1)

Der Bitcoin-Wiki-Eintrag für OP_CHECKSIG beantwortet Ihre Frage. OP_CHECKMULTISIG funktioniert auf die gleiche Weise, nur auf jede Signatur in der Sequenz angewendet.

Zunächst einmal kommt es auf den SIGHASH-Typ an, den Sie als Unterzeichner wählen. Höchstwahrscheinlich werden Sie die Standardeinstellung SIGHASH_ALLfür jede der erforderlichen Signaturen verwenden, aber Sie könnten tatsächlich unterschiedliche SIGHASH-Methoden für jede einzelne Signatur verwenden.

Da Sie bcoin erwähnt haben, können Sie die Signatur-Hash-Methoden hier lib/primitives/tx.js und in den unmittelbar folgenden Methoden überprüfen.

Sehr kurz:

Die SIGHASH_ALL-Methode serialisiert alle Eingaben* und alle Ausgaben der Transaktion, einschließlich der nLocktime, und signiert diesen Blob.

*Die Eingabeskripte werden alle durch ein einzelnes 0x00Byte ersetzt. Das Skript der zu signierenden/geprüften Eingabe wird durch das entsprechende Ausgabeskript aus der Finanzierungstransaktion ersetzt. Die von Ihnen gepostete Hex-Zeichenfolge (das Vorlagen-Eingabeskript 000000004c695...) ist also der einzige Teil der Transaktion, der von keinem der Multisig-Teilnehmer für diese Eingabe signiert wird!

Bonus-Leckerbissen: Die 2-von-3-Signaturvorlage hat VIER OP_0. Warum? Also. der erste wird von vom Stack entfernt OP_CHECKMULTISIG, das ist ein Fehler, den Satoshi uns hinterlassen hat. Die anderen drei sind Platzhalter für die eigentlichen Signaturen. Es gibt DREI statt nur ZWEI, weil die Signaturen in der gleichen Reihenfolge wie die pubKeys im Redeem-Skript sein müssen. Der zusätzliche Platzhalter wird entfernt, bevor die Transaktion gesendet wird. In bcoin wird diese Skriptvorlage hier zusammengestellt .

Vielen Dank. Können Sie bitte erläutern, was signiert wird, falls mehrere Eingaben mit unterschiedlichen Multisig-Skripten für jede von ihnen vorhanden sind. Werden bei jeder Unterzeichnung der Transaktion alle Eingaben durch 0x00für alle Eingaben ersetzt? Danke schön.
Ja, in SIGHASH_ALL signiert jede Eingabe das gleiche Schema: 0x00für jedes Eingabeskript mit Ausnahme der zu signierenden Eingabe, wo das Skript durch das Ausgabeskript des vorherigen txs ersetzt wird.