4 - 2 送出比特幣 - Raw Transaction - 1
Raw transaction 我翻譯為「自訂交易」,因為這種交易可以讓我們定義如何挑選 UTXO、設置手續費
這裏會先用「單進單出」(simple one-input, one-output transaction) 的交易當作範例,但這種交易很少用,因為這種交易
是將所有的錢送出去,沒有餘額(後面會詳述),通常是錢包轉錢包在用的。
先來了解一下甚麼是 UTXO (Unspent Transaction Output),當我們收到比特幣時,其實是收到很多交易,交易包含多個 UTXO,
這些 UTXO 儲存在錢包裡,當我們發出交易,也是從錢包裡的 UTXO 蒐集到要發出去的量,再送出去。
用 bitcoin-cli listunspent
可以列出錢包裡的所有 UTXO
$ bitcoin-cli listunspent
[
{
"txid": "c71ec531a2149dba59bca99c4646de919d213c516156d39f03cef2459eb1cb35",
"vout": 0,
"address": "mrR54buSCnMnf9cBGSrg4zCrWdDnyiQkdM",
"account": "",
"scriptPubKey": "76a914778c899d7364cc5c33e5e07d622e31b3798d60f588ac",
"amount": 1.30000000,
"confirmations": 2491,
"spendable": true,
"solvable": true,
"safe": true
},
{
"txid": "03e99644fff32f9d7fc68e1b3253ed1ee9ddc1371c41a0a8e29b1f01ca06f4d9",
"vout": 0,
"address": "mrR54buSCnMnf9cBGSrg4zCrWdDnyiQkdM",
"account": "",
"scriptPubKey": "76a914778c899d7364cc5c33e5e07d622e31b3798d60f588ac",
"amount": 1.30000000,
"confirmations": 9,
"spendable": true,
"solvable": true,
"safe": true
}
]
注意一下 vout ,這個是說 UTXO 是屬於某交易的哪個 output,一個交易可以包含很多 output, txid+vout = UTXO
現在來創造一個只有一個 output 的 raw transaction
先建立 txid, vout, recipient 變數
$ utxo_txid="c71ec531a2149dba59bca99c4646de919d213c516156d39f03cef2459eb1cb35"
$ utxo_vout="0"
$ recipient="2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF"
double check!!!! 哪一個錯都很可怕的
$ echo $utxo_txid
c71ec531a2149dba59bca99c4646de919d213c516156d39f03cef2459eb1cb35
$ echo $utxo_vout
0
$ echo $recipient
2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF
接下來用 bitcoin-cli createrawtransaction
他的格式如下
$ bitcoin-cli createrawtransaction
'''[
{
"txid": "'$your_txid'",
"vout": "'$your_vout'"
}
]'''
'''{
"'$your_recipient'": bitcoin_amount
}'''
將變數填進去變成
$ rawtxhex=$(bitcoin-cli createrawtransaction '''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' '''{ "'$recipient'": 1.29 }''')
$ echo $rawtxhex
020000000135cbb19e45f2ce039fd35661513c219d91de46469ca9bc59ba9d14a231c51ec70000000000ffffffff014062b0070000000017a914a9974100aeee974a20cda9a2f545704a0ab54fdc8700000000
一大串數字就是這筆交易的 hex 形式
金額填 1.29 是因為 1.3 - 1.29 = 0.01 是手續費
送出之前檢查一下
$ bitcoin-cli decoderawtransaction $rawtxhex
{
"txid": "6eeed843d436bc7173171a4f0f008ea9b7cb6bdadcf98ed21548a637cc0d14ca",
"hash": "6eeed843d436bc7173171a4f0f008ea9b7cb6bdadcf98ed21548a637cc0d14ca",
"version": 2,
"size": 83,
"vsize": 83,
"locktime": 0,
"vin": [
{
"txid": "c71ec531a2149dba59bca99c4646de919d213c516156d39f03cef2459eb1cb35",
"vout": 0,
"scriptSig": {
"asm": "",
"hex": ""
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 1.29000000,
"n": 0,
"scriptPubKey": {
"asm": "OP_HASH160 a9974100aeee974a20cda9a2f545704a0ab54fdc OP_EQUAL",
"hex": "a914a9974100aeee974a20cda9a2f545704a0ab54fdc87",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF"
]
}
}
]
}
檢查 vin 是不是我們要的那個 UTXO,金額對嗎?地址對嗎?
現在有了這筆交易,送出之前要「簽名」,才能知道這筆交易屬於你發的
$ bitcoin-cli signrawtransaction $rawtxhex
{
"hex": "020000000135cbb19e45f2ce039fd35661513c219d91de46469ca9bc59ba9d14a231c51ec7000000006a47304402207aacda76140e31f984672b6a527e6588970e1c40ee13b7fcd233da5c601495740220128cb55186776ec4cedc1b2acbc9c8f767cde4045d43d4fd0c27760239f4db310121023a7f38bcf7e8e1daebedc3377c809c73dd29f94c833c89e2d2113c8e44a630bbffffffff014062b0070000000017a914a9974100aeee974a20cda9a2f545704a0ab54fdc8700000000",
"complete": true
}
$ signedtx="020000000135cbb19e45f2ce039fd35661513c219d91de46469ca9bc59ba9d14a231c51ec7000000006a47304402207aacda76140e31f984672b6a527e6588970e1c40ee13b7fcd233da5c601495740220128cb55186776ec4cedc1b2acbc9c8f767cde4045d43d4fd0c27760239f4db310121023a7f38bcf7e8e1daebedc3377c809c73dd29f94c833c89e2d2113c8e44a630bbffffffff014062b0070000000017a914a9974100aeee974a20cda9a2f545704a0ab54fdc8700000000"
準備就緒後,可以送出交易
$ bitcoin-cli sendrawtransaction $signedtx
1bee366139af05a825872172743656f36d59eef84b32272b7bbb433cbe658972
這時候看看我們的 UTXO : bitcoin-cli listunspent
應該可以看到那一個 UTXO 不在了
用 bitcoin-cli listtransactions
可以到剛剛那筆交易,類別屬於 “send”
{
"account": "",
"address": "2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF",
"category": "send",
"amount": -1.29000000,
"vout": 0,
"fee": -0.01000000,
"confirmations": 0,
"trusted": true,
"txid": "1bee366139af05a825872172743656f36d59eef84b32272b7bbb433cbe658972",
"walletconflicts": [
],
"time": 1519808480,
"timereceived": 1519808480,
"bip125-replaceable": "no",
"abandoned": false
}
這就是自訂交易的方法!