6 - 2 使用多簽交易

要使用多簽交易,必須要有一些前置作業

找到資金

首先要將多簽地址匯入錢包

$ bitcoin-cli -named importaddress address="2N5CBdYjGPqMb1KByBcVzxa111HmzZA98Ua"

匯入地址後要稍等一下,因為錢包會掃過所有交易,將多簽交易加進來,

匯入後,列出 unspent 可以看到

{
    "txid": "7d2142fb20eb5753d29d96886b86f244949e68c9cc07c6cca4973a8985518cc0",
    "vout": 0,
    "address": "2N5CBdYjGPqMb1KByBcVzxa111HmzZA98Ua",
    "account": "",
    "scriptPubKey": "a914830e4b26e7bfe724b9f9de7f8bb8c1f6463452b387",
    "amount": 0.00900000,
    "confirmations": 1,
    "spendable": false,
    "solvable": false,
    "safe": true
  }

設定變數

當要花費多簽交易時,我們需要很多資料,大致上是三項:

  • UTXO 延伸資訊
  • 履行腳本
  • 參與的私鑰

得到 UTXO 資訊

先拿到想要花費的多簽交易的 txid, vout

$ utxo_txid=$(bitcoin-cli listunspent | jq -r '.[0] | .txid') 
$ utxo_vout=$(bitcoin-cli listunspent | jq -r '.[0] | .vout')

我們還需要額外的 scriptPubKey 這個資訊:

$ utxo_spk=$(bitcoin-cli listunspent | jq -r '.[0] | .scriptPubKey')

得到履行腳本

把之前建立多簽地址的履行腳本記錄下來

$ redeem_srcipt="5221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452ae"

決定接收方

現在我們要把多簽交易的錢送回給自己,這樣可以把多簽交易還原成 P2PKH 交易

$ recipient=$(bitcoin-cli getrawchangeaddress)

建立交易

步驟跟以前依樣

$ rawtxhex=$(bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$recipient'": 1.299}''')

現在準備好要簽名了

多簽交易的簽名需要每個機器參與,每個機器要提供自己的私鑰

印出私鑰

在機器上印出私鑰

$ bitcoin-cli -named dumpprivkey address=$address1
cWAEPpYDh2DQvRy3sRgzsAoSYhN3wd8gwgoyZ1jKQ1mK82KSGBhW

千萬不要在主網的機器上印出私鑰,那非常危險!

製作多重簽名

現在可以開始簽名,用的是跟以前一樣的 signrawtransaction,只是參數稍有不同,

用 prevtxs,並設定 txid, vout, scriptPubKey, redeemScript

用 privkeys,並把剛剛印下來的私鑰放進去

machine1$ bitcoin-cli -named signrawtransaction hexstring=$rawtxhex prevtxs='''[{"txid": "'$utxo_txid'", "vout": '$utxo_vout', "scriptPubKey": "'$utxo_spk'", "redeemScript": "'$redeem_script'"}]''' privkeys='["cWAEPpYDh2DQvRy3sRgzsAoSYhN3wd8gwgoyZ1jKQ1mK82KSGBhW"]'
{
  "hex": "0200000001c08c5185893a97a4ccc607ccc9689e9444f2866b88969dd25357eb20fb42217d000000004900475221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452aeffffffff0100350c00000000001976a9146f05e89e839a3bd9e5e35dd048b7bc92c5610b5e88ac00000000",
  "complete": false,
  "errors": [
    {
      "txid": "7d2142fb20eb5753d29d96886b86f244949e68c9cc07c6cca4973a8985518cc0",
      "vout": 0,
      "witness": [
      ],
      "scriptSig": "00475221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452ae",
      "sequence": 4294967295,
      "error": "Operation not valid with the current stack size"
    }
  ]
}

他會跟你說你還沒完成,因為還需要下一個私鑰參與

bitcoin-cli -named signrawtransaction hexstring=0200000001c08c5185893a97a4ccc607ccc9689e9444f2866b88969dd25357eb20fb42217d000000004900475221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452aeffffffff0100350c00000000001976a9146f05e89e839a3bd9e5e35dd048b7bc92c5610b5e88ac00000000 prevtxs='''[{"txid": "'$utxo_txid'", "vout":'$utxo_vout', "scriptPubKey": "'$utxo_spk'", "redeemScript": "'$redeem_srcipt'"}]''' privkeys='["cRDWdh2XzYqEYiJRy4DxQFmj1TZTnp4SjhnXvBXw5Yk1CYUh5jeD"]'
{
  "hex": "0200000001c08c5185893a97a4ccc607ccc9689e9444f2866b88969dd25357eb20fb42217d000000004b000000475221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452aeffffffff0100350c00000000001976a9146f05e89e839a3bd9e5e35dd048b7bc92c5610b5e88ac00000000",
  "complete": true
}

需要的簽名都簽過後,就可以發送交易了

$ signedtx = $(bitcoin-cli -named signrawtransaction hexstring=0200000001c08c5185893a97a4ccc607ccc9689e9444f2866b88969dd25357eb20fb42217d000000004b000000475221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452aeffffffff0100350c00000000001976a9146f05e89e839a3bd9e5e35dd048b7bc92c5610b5e88ac00000000 prevtxs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout', "scriptPubKey": "'$utxo_spk'", "redeemScript": "'$redeem_script'" } ]''' privkeys='["cTi1Muvj24vG159R8orFjtqsPygCxhu8mJt2GLDQv7bNBGYoav4B"]' | jq -r '.hex')
machine2:~$ bitcoin-cli -named sendrawtransaction hexstring=$signedtx
u56srfca37ed8875a1ed3b2827dd60ae3089f9caa7c7c23d47635f6f5b397c04

這種履行的方式顯示了 P2SH 交易的方式,如果要履行 P2SH 資金的話,signrawtransaction 需要:

  1. 包含 scriptPubKey,P2SH 的密碼鎖
  2. 包含 redeemScript,用來解鎖 P2SH 密碼鎖,然後在生出新的密碼鎖
  3. 需要每台要跑的機器的簽章
  4. 包含需要的簽章,用來解鎖 redeemScript 產生的密碼鎖

results matching ""

    No results matching ""