如何從外部私鑰簽署原始多重簽名交易
我正在創建一個 2-of-3 多重簽名錢包,其中 2 個熱鍵是外部 HSM 設備。我正在使用 Bcoin 來創建我的交易。創建交易後,我會將原始交易發送到外部應用程序進行簽名。
我的問題是,究竟哪一部分需要用私鑰簽名?
例如,這是我的交易:
{ "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" }
如果你解碼它
script
是inputs
:OP_0 OP_0 OP_0 OP_0 52210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53ae
如您所見,有 4 個
OP_0
佔位符用於輸入簽名。現在我的問題是,外部簽名應用程序應該簽署交易的哪一部分。只是000000004c6952210209ad6cf408e41362fa175d5869e4561f1890c0d8d74353c86095fdecde34459721024a92aa3f883cc4438b75205555e517a4f7cc10ffd42517297a17821ae6f0bb8821037d2a259a52f62fee96fea072844139224fbd9027116ac7582025dd446fc73e3e53ae
一部分嗎?任何參考都受到高度讚賞。我已閱讀<https://en.bitcoin.it/wiki/Transaction>和<https://en.bitcoin.it/wiki/OP_CHECKSIG>但我無法確定。謝謝你。
OP_CHECKSIG 的比特幣 Wiki 條目回答了您的問題。OP_CHECKMULTISIG 的工作方式相同,只是應用於序列中的每個簽名。
首先,這取決於您作為簽名者選擇的 SIGHASH 類型。您很可能會
SIGHASH_ALL
為每個必需的簽名使用預設值,但實際上您可以為每個單獨的簽名使用不同的 SIGHASH 方法。由於您提到了 bcoin,您可以查看
lib/primitives/tx.js
此處的簽名雜湊方法,以及緊隨其後的方法。非常簡短:
SIGHASH_ALL 方法將序列化交易的所有輸入* 和所有輸出,包括
nLocktime
, 並簽署該 blob。*輸入腳本全部替換為單
0x00
字節。被簽名/檢查的輸入腳本被來自資金交易的相應輸出腳本替換。所以實際上,您發布的十六進製字元串(模板化輸入腳本000000004c695...
)是交易中唯一不會被任何多重簽名參與者簽署的部分!額外花絮: 2-of-3 簽名模板有四個
OP_0
。為什麼?好吧。第一個由 彈出堆棧OP_CHECKMULTISIG
,這是中本聰留給我們的一個錯誤。其他三個是實際簽名的佔位符。有三個而不是兩個,因為簽名需要與兌換腳本中的 pubKey 的順序相同。在廣播交易之前刪除額外的佔位符。在 bcoin 中,這個腳本模板是在這裡組裝的。