拆解 Gcoin raw transaction

徐粲邦
6 min readNov 4, 2016

--

當我們在 Bitcoin 上生一個 transaction 時,會拿到一個 raw transaction,長長一串的不知道代表什麼意思,我們拿去呼叫 decoderawtransaction RPC 才會看到他的樣貌,在拿的到 utxo 的情況下實作本地端創建 raw transaction 時,常常會出現問題,而學會看懂 transaction 的結構可以有效地幫忙 debug,所以也就順便做個筆記以免以後忘記了。

而 Gcoin 是一個從 Bitcoin 衍生出來的區塊鏈技術,如果不了解 Gcoin 的基本架構,想要瞭解更多的可以去看看這裡。Gcoin 在 transaction 的結構上其實和 Bitcoin 長的很類似,唯獨 Gcoin transaction 會多兩個原本 Bitcoin transaction 沒有的欄位

  1. type: 在 Gcoin,transaction 有分為七種型態,分別是 NORMAL LICENSE MINT VOTE BANVOTE MATCH CANCEL,前面三個為比較常見的型態。
  2. color: 因為 Gcoin 有多貨幣功能,可以允許 issuer 發行自己的貨幣,不像 Bitcoin 只有一種貨幣在流通,所以在做交易的時候也需要寫清楚是用哪一個貨幣來做流通。

以下為一個 raw transaction,從 1FPWFMPvYNTBx3fJYVmbFyhKtfi4QPQ6MY 送了 100 個 color 1 到 17Ca1G5PFHBNd6sARgtYQKRK7PnCsM4uSn

01000000018eff490c3dac592caf4954ad1e142e6e8d8fbb427909bb18d7271e7d66dcf9d4000000001976a9149dd353a079ad3b149e00dcc9f6a62f399d3d1c8f88acffffffff0200e40b54020000001976a9144400e18b93766b106220343dbd37d4135501d6da88ac01000000003bbf15f08623001976a9149dd353a079ad3b149e00dcc9f6a62f399d3d1c8f88ac010000000000000000000000

讓我們來了解一下這一串亂碼在幹什麼,它是由以下所組成的

  1. 4 個 bytes 的 version,這邊表明這個 transaction 是遵照哪一個規則,但其實就是 1
  2. 1 個 byte 為 transaction input 的數量
  3. 32 個 bytes 的 transaction hash,代表著我們準備要花掉的那筆 transaction output
  4. 4 個 bytes 為上一個 transaction 的第幾個 output,3 和 4 整合起來的意思就是我們現在要準備去花掉 transaction hash 為8eff490c3dac592caf4954ad1e142e6e8d8fbb427909bb18d7271e7d66dcf9d4 的第 0 個 output
  5. 1 byte 為 unlocking script 的長度,0x19 換算成十進位是 25 (bytes)
  6. 25 bytes 的 unlocking script,它的意義在於要滿足準備花掉的 output 的條件,而這條件就是那個 output 的 locking script,而現在你會發現他長得跟自己 output 的 locking script 很像或一樣,但這只是暫時的,等到這個 transaction 經過簽名之後,這個欄位的值就會被改成真正可以滿足前一個 output 的 locking script
  7. 4 bytes 的 sequence,通常就設為 0xffffffff
  8. 1 byte 為 transaction output 的數量
  9. 8 bytes 為第一個 output 交易的金額
  10. 1 byte 為 locking script 的長度,0x19 換算成十進位是 25 (bytes)
  11. 25 bytes 的 locking script,它的用處顧名思義就是定義這個 output 要被花掉的條件,如果有人要用掉這個 output,他就必須要有相對應的 unlocking script 來解鎖
  12. 4 bytes 為第一個 output 交易的 color,代表我們這個 output 是在交易 color 1,而這個是在 Bitcoin 上沒有的
  13. 8 bytes 為第二個 output 交易的金額
  14. 1 byte 為 locking script 的長度,0x19 換算成十進位是 25 (bytes)
  15. 25 bytes 為 locking script,他的用處跟第 11 點一樣
  16. 4 bytes 為第二個 output 交易的 color,代表我們這個 output 也是在交易 color 1,這個 Bitcoin 上沒有
  17. 4 bytes 的 locktime,這個數字是表示這個 transaction 最早可以多早進到 blockchain,如果是 0 的話代表希望立刻執行不想要有拖延,如果是介於 0 到 5 億,這個值就代表著區塊高度,區塊鏈沒有長到這個區塊高度就不要把這個 transaction 收進去,最後如果是大於 5 億的值就代表是一個 Unix Epoch timestamp,沒到這個時間就不要把這個 transaction 收進去
  18. 最後 4 bytes 為 type,在這邊是 0,即 NORMAL transaction type,這是 Bitcoin 上沒有的

可以發現,除了第 12, 16 和 18 點之外,其實 Gcoin transaction 和 Bitcoin transaction 是長一樣的,另外在 input 的 unlocking script 跟 output 的 locking script 會另外做介紹。而以下是這個範例完整的拆解

比較需要注意的是,不管是 Bitcoin 還是 Gcoin 在 transaction 裡面的表達方式為 little endian,以第一個 output 交易的金額為例,00e40b5402000000 轉成數字之後就是 10000000000,而 version color 等其他欄位的表達方式也是要透過這樣的轉換,如果直接把十六進位轉成十進位會發現出來的數字是很奇怪的。

另外剛剛轉出來的數字 10000000000 單位為 satoshi,雖然在 Gcoin 裡沒有 BTC 這個貨幣了(當然你也可以創一個 license 叫做 BTC),但 Gcoin 還是沿用了 satoshi 的概念來代表貨幣最小的單位,所以上面的例子我們可以說是 10000000000 satoshi color 1 或 100 個 color 1。

以上就是 Gcoin transaction 的拆解。

Reference

  1. Mastering Bitcoin
  2. http://bitcoin.stackexchange.com/questions/3374/how-to-redeem-a-basic-tx

--

--