如何解析比特币中的交易原始数据rawData
交易数据结构
有关交易的详细信息可以查看比特币的wiki网站:Transaction
TxBinaryMap:

原始图片地址
交易的结构表格(Transaction):

示例数据
以一个正式网络的一笔交易为例分析: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。
示例图:

一个完整的交易中,交易输入和输出可以为多个。
但是只有这个结构是不能解析整个交易的,因为交易输入的长度和交易输出的长度是变长的,还需要解析交易输入和交易输出的长度。
交易输入的结构图:

交易输出的结构图:

有了基本的结构图,基本可以解析了。
但是在交易输入和交易输出的结构图中,都提到了一个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的描述:
lock time
00000000 // lock time,时间戳
交易锁定时间,4字节,默认情况下为全0,表示立刻可以消费掉。
附上精通比特币里面关于锁定时间的描述:
如何解析比特币中的交易原始数据rawData的更多相关文章
- 比特币中P2PKH(pay-to-public-key-hash)的锁定脚本和解锁脚本
脚本格式 P2PKH的锁定脚本为: OP_DUP OP_HASH160 PUSHDATA(<Cafe Public Key Hash>) OP_EQUALVERIFY OP_CHECKSI ...
- 比特币中P2SH(pay-to-script-hash)多重签名的锁定脚本和解锁脚本
P2SH(pay-to-script-hash)多重签名的脚本 P2SH是多重签名的一种应用形式.在P2SH的交易中,多了一个Redeem Script的概念,称为赎回脚本.当向P2SH脚本的地址转账 ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- 深入解析Javascript中this关键字的使用
深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...
- js中eval详解,用Js的eval解析JSON中的注意点
先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...
- 2dx解析cocosbuilder中使用layer时的缺陷
2dx解析cocosbuilder中使用layer时的缺陷 cocos2d-x 3.7 cocosbuilder中的layer通常会用到触摸属性: 但是在2dx解析布局文件的时候,却很多属性都没解析: ...
- asp自动解析网页中的图片地址,并将其保存到本地服务器
程序实现功能:自动将远程页面的文件中的图片下载到本地. 程序代码 <% '将本文保存为 save2local.asp '测试:save2local.asp?url=http://ent.sina ...
- XML解析——Java中XML的四种解析方式
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
随机推荐
- 图像的读取,显示与保存(基于skimage模块)
一 skiamge模块 skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能.它 ...
- 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)
传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...
- 测试之美 Part 1
1. 本人曾经在一次电话面试中被问到,为什么你作为一个测试人员,还要别人来告诉你要在哪些平台上去测试,你完全可以自己去定夺.下面的这段话是来自<测试之美>,我觉得很有逻辑的反驳了那位面试官 ...
- 当重装eclipse后,给现有web项目添加tomcat的构建路径
在eclipse“首选项”-“service environment”中配置好tomcat后,给现有web项目添加构建路径: 1.选中一个web项目右键选中“构建路径”-“配置构建路径”
- AT2402 Dam
传送门 考虑到一个很显然的事实:水是逃不掉的,一定要接的 所以我们就可以得到一个结论:如果当前的水温比上次低,就混合起来(因为水是逃不掉的),如果高就保留(因为我可以将前面的全部抛弃,只取这个高的) ...
- 008-数据类型(Dictionary)
数据类型(Dictionary) 一.定义 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括 ...
- JMeter - 如何在多个测试环境中运行多个线程组
概述: 作为性能测试的一部分,我不得不为我们的应用程序提供各种用例/业务工作流程的性能测试脚本.当我设计我的性能测试脚本时,我将确保我有本文中提到的可重用测试脚本. JMeter - 如何创建可重用和 ...
- sortable结合angularjs实现拖动排序
记录拖动排序 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Codeforces Round #565 (Div. 3) B. Merge it!
链接: https://codeforces.com/contest/1176/problem/B 题意: You are given an array a consisting of n integ ...
- urlScan 配置阻止sql注入
工具 urlscan_v31_x64 urlscan_v31_x86 URLScan是一个IIS下的ISAPI 筛选器,它能够限制服务器将要处理的HTTP请求的类型.通过阻止特定的 HTTP 请求,U ...



