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 需要:
- 包含 scriptPubKey,P2SH 的密碼鎖
- 包含 redeemScript,用來解鎖 P2SH 密碼鎖,然後在生出新的密碼鎖
- 需要每台要跑的機器的簽章
- 包含需要的簽章,用來解鎖 redeemScript 產生的密碼鎖