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
  }

這就是自訂交易的方法!

results matching ""

    No results matching ""