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 script
in entschlüsseln, inputs
ist 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 000000004c6952210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53ae
Teil?
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.
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_ALL
fü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 0x00
Byte 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 .
madu
0x00
für alle Eingaben ersetzt? Danke schön.Stecknadelkopf
0x00
für jedes Eingabeskript mit Ausnahme der zu signierenden Eingabe, wo das Skript durch das Ausgabeskript des vorherigen txs ersetzt wird.