如何解析比特币中的交易原始数据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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,561评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,218评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,162评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,470评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,550评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,806评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,951评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,712评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,166评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,510评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,643评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,306评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,930评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,745评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,983评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,351评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,509评论 2 348

推荐阅读更多精彩内容