如何解析比特幣中的交易原始數據rawData


交易數據結構

有關交易的詳細信息可以查看比特幣的wiki網站:Transaction

TxBinaryMap: txbinarymap 原始圖片地址

交易的結構表格(Transaction): txf

示例數據

以一個正式網絡的一筆交易為例分析:ac89b280cc21854b82b4cc111a0e6c0d10315117b6001e3f4f3af3d2f7b2fd53

交易詳情圖片

通過blockcypher的API接口可以拿到更加詳細的JSON數據

這筆交易的JSON返回數據:

{
  "block_hash": "0000000000000000011edeab34b5145125efa596fbc2e6a88825acd9570aa4d8",
  "block_height": 423431,
  "block_index": 927,
  "hash": "ac89b280cc21854b82b4cc111a0e6c0d10315117b6001e3f4f3af3d2f7b2fd53",
  "hex": "0100000001f744bec7dd6c33cf384c8a4cb33269ca48c940e5852410d395807f6e56f6734301000000fd5e0100483045022100bd16b2ffa112937856716909162c00a66e7c5e6cccd0093ec9aece127632f8dc02205a567c53161e5fb62ac8d202acf8f8cc2f5a6496f47a878555dae7ffde85a41d01483045022100ac3c0365e103d97d3cc935755d5177e8f383993a558998200f8537e64f6b520002202216716f7fa54adc69095c4127ff6f97d42e28517a103f7691808db3cde6ee5b014cc9524104a7ada7c84ae36e98735597ee770a7cfd2d5d9398154b088ee352d3a83b21bbf537c0b8e4ea0acc172285b37571a9b1e36c0da387d6d1f361f0b65cad5c3f659e4104fe411f77e5aa50b54e0f2be0204b26cd1d2bf77bf95f2108a6b012e34637289121cd351c696c8a519b4b58674a87e7907385b4a5e7c0cfa5019346c1b04040914104eeffa9bbfe6dd2c99a9747ca5d1c1ebd15fe0344f52ff2915e3c11b3be9be11236895e5514b085c1f8a1bd8ef9c3db0cf1095aaf442cae11d88c3af026fabd1653aeffffffff0100090000000000001976a914921a4c141746bbd7beb8e81b05ba93d84b076a0088ac00000000",
  "addresses": [
    "1EKXAAiJDntbEK3WSVW3vTcwYJ5ciJ5kSL",
    "38bPsA6ZXfRuxFD7efVXTkQd69422uzD4B"
  ],
  "total": 2304,
  "fees": 2304,
  "size": 437,
  "preference": "low",
  "relayed_by": "124.205.119.164",
  "confirmed": "2016-08-03T06:18:06Z",
  "received": "2016-08-03T03:26:33.685Z",
  "ver": 1,
  "double_spend": false,
  "vin_sz": 1,
  "vout_sz": 1,
  "confirmations": 100505,
  "confidence": 1,
  "inputs": [
    {
      "prev_hash": "4373f6566e7f8095d3102485e540c948ca6932b34c8a4c38cf336cddc7be44f7",
      "output_index": 1,
      "script": "00483045022100bd16b2ffa112937856716909162c00a66e7c5e6cccd0093ec9aece127632f8dc02205a567c53161e5fb62ac8d202acf8f8cc2f5a6496f47a878555dae7ffde85a41d01483045022100ac3c0365e103d97d3cc935755d5177e8f383993a558998200f8537e64f6b520002202216716f7fa54adc69095c4127ff6f97d42e28517a103f7691808db3cde6ee5b014cc9524104a7ada7c84ae36e98735597ee770a7cfd2d5d9398154b088ee352d3a83b21bbf537c0b8e4ea0acc172285b37571a9b1e36c0da387d6d1f361f0b65cad5c3f659e4104fe411f77e5aa50b54e0f2be0204b26cd1d2bf77bf95f2108a6b012e34637289121cd351c696c8a519b4b58674a87e7907385b4a5e7c0cfa5019346c1b04040914104eeffa9bbfe6dd2c99a9747ca5d1c1ebd15fe0344f52ff2915e3c11b3be9be11236895e5514b085c1f8a1bd8ef9c3db0cf1095aaf442cae11d88c3af026fabd1653ae",
      "output_value": 4608,
      "sequence": 4294967295,
      "addresses": [
        "38bPsA6ZXfRuxFD7efVXTkQd69422uzD4B"
      ],
      "script_type": "pay-to-script-hash",
      "age": 423147
    }
  ],
  "outputs": [
    {
      "value": 2304,
      "script": "76a914921a4c141746bbd7beb8e81b05ba93d84b076a0088ac",
      "addresses": [
        "1EKXAAiJDntbEK3WSVW3vTcwYJ5ciJ5kSL"
      ],
      "script_type": "pay-to-pubkey-hash"
    }
  ]
}

接口數據中的hex字段是發送到區塊鏈上的交易原文,接下來主要分析這一段數據。

先看解析結果

01000000 // Version,4字節 01 // 交易輸入個數,變長VarInt f744bec7dd6c33cf384c8a4cb33269ca48c940e5852410d395807f6e56f67343 // UTXO(Unspent Transaction Output),32字節 01000000 // UTXO的index,4字節 fd5e01 // 解鎖腳本長度,VarInt,變長 00483045022100bd16b2ffa112937856716909162c00a66e7c5e6cccd0093ec9aece127632f8dc02205a567c53161e5fb62ac8d202acf8f8cc2f5a6496f47a878555dae7ffde85a41d01483045022100ac3c0365e103d97d3cc935755d5177e8f383993a558998200f8537e64f6b520002202216716f7fa54adc69095c4127ff6f97d42e28517a103f7691808db3cde6ee5b014cc9524104a7ada7c84ae36e98735597ee770a7cfd2d5d9398154b088ee352d3a83b21bbf537c0b8e4ea0acc172285b37571a9b1e36c0da387d6d1f361f0b65cad5c3f659e4104fe411f77e5aa50b54e0f2be0204b26cd1d2bf77bf95f2108a6b012e34637289121cd351c696c8a519b4b58674a87e7907385b4a5e7c0cfa5019346c1b04040914104eeffa9bbfe6dd2c99a9747ca5d1c1ebd15fe0344f52ff2915e3c11b3be9be11236895e5514b085c1f8a1bd8ef9c3db0cf1095aaf442cae11d88c3af026fabd1653ae // 解鎖腳本,變長 ffffffff // 交易序列號,4字節 01 // 交易輸出個數,變長VarInt* 0009000000000000 // 輸出金額,8字節 19 // 鎖定腳本長度,VarInt,變長 76a914921a4c141746bbd7beb8e81b05ba93d84b076a0088ac // 鎖定腳本,變長 00000000 // Time Lock,4字節

下面進行說明:

Lettle-endian 小端編碼

比特幣中很多數據都是小端編碼的,除了交易輸入腳本和交易輸出腳本,其余內容全部是小端編碼的。這個在第一張圖片TxBinaryMap左下角的字可以看出來。

比特幣交易的數據結構

可以看到比特幣交易數據最外層的結構包括:Version,交易輸入個數,交易輸入,交易輸出個數,交易輸出,TimeLock。

示例圖: default

一個完整的交易中,交易輸入和輸出可以為多個。

但是只有這個結構是不能解析整個交易的,因為交易輸入的長度和交易輸出的長度是變長的,還需要解析交易輸入和交易輸出的長度。

交易輸入的結構圖: 交易輸入結構

交易輸出的結構圖: 交易輸出結構

有了基本的結構圖,基本可以解析了。

但是在交易輸入和交易輸出的結構圖中,都提到了一個VarInt的變長參數,需要這個變長參數的規則才能知道后續腳本的長度。

VarInt變長 VarInt的長度規則為:

假設腳本長度定義為len 如果0 < len < 0xFD,那么腳本長度就是一個字節的len 如果0xFD ⇐ len ⇐ 0xFFFF,腳本長度為:0xFD + len轉換為兩個字節bytes以后倒序 如果0xFFFF < len ⇐ 0xFFFF FFFF,腳本長度為:0xFE + len轉換為四個字節bytes后倒序 如果0xFFFF FFFF < len,腳本長度為:0xFF + len轉換為八個字節bytes后倒序

例子: (1) len=200(0xC8),那么腳本的長度為:0xC8 (2) len=40000(0x9C40),那么腳本的長度為:0xFD,0x40,0x9C (3) len=100000(0x186A0),那么腳本的長度為:0xFE,0xA0,0x86,0x01,0x00 (4) len=5000000000(0x12A05F200),那么腳本的長度為:0xFF,0x00,0xF2,0x05,0x2A,0x01,0x00,0x00,0x00

比如上面的解鎖腳本開頭為0xfd,0xfd表示后續兩個字節0x5e01表示長度,那么腳本的實際長度是0x15e,注意后面的長度是小端編碼的。

有了上面的東西,就可以解析比特幣交易的原始數據了。

比特幣各項數據的說明

Version

01000000 // version,4字節,小端編碼

交易的版本號在比特幣中是固定的值1,填充為4個字節數據並倒序即為hex中的版本號。

UTXO

f744bec7dd6c33cf384c8a4cb33269ca48c940e5852410d395807f6e56f67343// UTXO(Unspent Transaction Output,未花費的交易輸出),小端編碼

輸入交易的HASH是交易輸入中的一項,實際填充時是倒序的,上面的輸入正序排列以后為4373f6566e7f8095d3102485e540c948ca6932b34c8a4c38cf336cddc7be44f7,可以在blockcypher網站上查詢到這筆交易的詳細信息,網頁展示api調用的JSON數據

交易序列號sequence

ffffffff // sequence,序列號

交易序列號為4個字節數據,一般都填寫0xffffffff。

附上精通比特幣中對sequence的描述:

seq01 seq02

lock time

00000000 // lock time,時間戳

交易鎖定時間,4字節,默認情況下為全0,表示立刻可以消費掉。

附上精通比特幣里面關於鎖定時間的描述:

timelock01 timelock02 png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM