BTC transaction rawtx 解析

很多情况下,我们都需要对交易中的某一些rawtx进行解析,以便更加清楚的理解,其在交易过程中的一些详细信息,现在,详细罗列一下rawtx中每一个字节码究竟代表什么,建议一定要耐心阅读,可能有点恶心。
先来一段交易过程中的原始rawtx:

0100000001697f98c004bbb7d184119a31b2b8c96683fa8c7ca0d7755c6196888fb6ba046e010000006a473044022077de54191ae91b502d03a83bd1d580a8b4467fc3d205c7bce169f13e6abc1c91022064f759845c960b04ddf9dd5a635da5f8b990fc934fced06747d52f2658603735012103c426034f05b3b66700f151991e6e45f2d63545a73b36c0a8e8c4200c53f7fd2cfeffffff02a0f53813000000001976a914e85324d4402d9758122c5498de80d1cfcc6330cb88aca09f6636000000001976a914093f4c533deb449f6bd0a427bddb0f02c297101388ac5dad0700

这个是截取的块高度为503134,交易为27f5f35b447e219d0b3a3ac55f9dc6aacf2d4145fbd930207ef5b7710c47d883的rawtx。

在了解如何解析之前,首先我们需要了解 tx 中都包含哪些字段,究竟有哪些格式:

tx

field size description data type comments
4 version int32_t Transaction data format version (note, this is signed)
0 or 2 flag optional uint8_t[2] If present, always 0001, and indicates the presence of witness data
1+ tx_in count var_int Number of Transaction inputs (never zero)
41+ tx_in tx_in[] A list of 1 or more transaction inputs or sources for coins
9+ tx_out count var_int Number of Transaction outputs
41+ tx_out tx_out[] A list of 1 or more transaction outputs or destinations for coins
0+ tx_witnesses tx_witness[] A list of witnesses, one for each input; omitted if flag is omitted above
4 lock_time uint32_t 一般为 00000000

TxIn consists of the following fields:

field size description data type comments
36 previous_output outpoint The previous output transaction reference, as an OutPoint structure
1+ script length var_int The length of the signature script
? signature script uchar[] Computational Script for confirming transaction authorization
4 sequence uint32_t 一般为 FFFFFFFF

The OutPoint structure consists of the following fields:

field size description data type comments
32 hash char[32] The hash of the referenced transaction.
4 index uint32_t The index of the specific output in the transaction. The first output is 0, etc.

The TxOut structure consists of the following fields:

field size description data type comments
8 value int64_t Ttransaction value.
1+ pk_script length var_int Length of the pk_script
? pk_script uchar[] Usually contains the public key as a Bitcoin script setting up conditions to claim this output.

Standard Transaction to Bitcoin address (pay-to-pubkey-hash)

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

To demonstrate how scripts look on the wire, here is a raw scriptPubKey:

  76       A9             14
OP_DUP OP_HASH160    Bytes to push

89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA   88         AC
                      Data to push                     OP_EQUALVERIFY OP_CHECKSIG

比特币交易(P2PKH:对公钥哈希的付款)的解锁和锁定脚本的示例,显示了在脚本验证之前从解锁和锁定脚本的并置产生的组合脚本

签名+pubKey

PUB_KEY 格式:

  1. pubkey分为压缩和未压缩两种方式
  2. 公钥是在椭圆曲线上的一个点,由一对坐标(x,y)组成。
04  //代表未压缩公钥(02、03 代表压缩公钥)
025a1cffe502a80dfa1f543ae14c082aff24d5ecadab160ca904d288eed8e3d8 //x
cacef0985f690868df4f416c3890909b4c0c843da153d41382ac20c80170240a //y

ok,对上述格式有一个简单的了解之后,我们来解析上述rawtx,看看它究竟为何方神圣。

======================================================
===================飙车 分割线==========================
======================================================

tx describes a bitcoin transaction, in reply to getdata

01000000 //[4字节] 的版本号(16进制,两位一个字节)
         //[0或2字节] no flag( If present, always 0001, and indicates the presence of witness data)
01       //[1字节] tx_in count(01代表一个输入,可能有多个)
// tx_in array:
2ac424bf26875f2fa550b6df61a49564d510c6e8b535fd6f8870a0dc4b3711a301000000       //[36字节]的previous_output
8a       //[1字节]的script length(16进制,8a=138 )

47304402205a2041854aba3d33ec92fae4894eb38c99aab1e6cfca619c08545f5eb757925902205f5593e104860a300df6c0d463744fed610a6bc914ee9959be467dae9b306623014104025a1cffe502a80dfa1f543ae14c082aff24d5ecadab160ca904d288eed8e3d8cacef0985f690868df4f416c3890909b4c0c843da153d41382ac20c80170240a
         // [138字节]的signature script
ffffffff  //[4字节]的sequence
02      //[1字节]的tx_out count,02代表有两个输出。
//tx_out array:
//第一个输出:
40420f0000000000  //[8字节]的Transaction Value(这里是小端,从后往前看(0f4240的十六进制转化为十进制,之后除以1亿,就是交易比特币的值。))
19    //[1字节]的pk_script length(代表pk_script长度是16进制的19(25字节))
76a914ae3b0aaf5e2ab94e0c8297fe055df443c69b4bdc88ac //pk_script(25字节)
//第二个输出:
fe130e9400000000  //[8字节]的 Transaction Value(2位在一起看(94 0e 13 fe))

19    //[1字节]的pk_script length
76a914bae025140c454518b8cba0c25d45a6dc87f4b9ce88ac //pk_script(25字节)
00000000     //[4字节]的lock_time

继续拆分signature script(一个签名,一个pubKey)

// [138字节]的signature script
47  //数据的长度。//47代表*******所包含的范围,是一个签名

******************
30  //表示DER序列的开始
44  //序列的长度(16进制,68字节)//44代表的是>>>>>所包含的范围

>>>>>>>>>>>>
02  //一个整数值
20  //整数的长度(32字节)
5a2041854aba3d33ec92fae4894eb38c99aab1e6cfca619c08545f5eb7579259 //R
02  //一个整数值
20  //整数的长度(32字节)
5f5593e104860a300df6c0d463744fed610a6bc914ee9959be467dae9b306623 //S
>>>>>>>>>>>>>

01  //签名hash类型(sighash)
*******************

41  //(16进制的65,有65个字节) 这个是pubKey的长度
04025a1cffe502a80dfa1f543ae14c082aff24d5ecadab160ca904d288eed8e3d8cacef0985f690868df4f416c3890909b4c0c843da153d41382ac20c80170240a 
//65字节 未压缩公钥(pubKey)
         

继续拆分pk_script

//pk_script(25字节)
76  //OP_DUP
a9  //OP_HASH160
14  //(20字节的push数据)
ae3b0aaf5e2ab94e0c8297fe055df443c69b4bdc //20字节 data to push
88  //OP_EQUALVERIFY
ac  //OP_CHECKSIG

P2SH MULTISIG (2 of 3)拆分

00    //00是当时候设计的一个bug,目前已经成为一种共识,只有当多重签名的时候,才会使用 00

//两个签名脚本
47    //OP_DATA_71
304402206a46d2803f9bc7bb59fd66a7e2eb19625bc7c897e0ab84d841179fdfdfb2ebbb02202949e64609827687fd9b2c7cbb3b706a34e67cdd3f6536c630dcac78a8eb6cf001

47
304402207946b95930ce13d96592a35b278df16ff6544083ab18dd3a7fb35a2cc118a88102203bcb33f08b3230cc0c42ac77050bcbdc4e3a5643b4c29986d844c6314e71614c01

4c    //操作码--> OP_PUSHDATA1

69 //105字节 代表>>>所包含的内容
>>>>>
52
21028bb6ee1127a620219c4f6fb22067536649d439929e177ebfe76386dff52a7084
2102f9cd8728b12b6c8a17a15cb4a19de000641f78a449c1b619dc271b84643ce0e9
2103d33aef1ae9ecfcfa0935a8e34bb4a285cfaad1be800fc38f9fc869043c1cbee2
53       //代表有3个公钥
ae       //代表脚本OP_XXX(OP_CHECKMULTISIG 校验多重签名是否正确)
>>>>>>

本文由Copernicus 团队 冉小龙 总结,转载无需授权。

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