Transactions

如何從外部私鑰簽署原始多重簽名交易

  • December 7, 2019

我正在創建一個 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"
}

如果你解碼它scriptinputs

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 中,這個腳本模板是在這裡組裝的。

引用自:https://bitcoin.stackexchange.com/questions/90511