1. 比特币交易的数据结构
1.1比特币区块的结构
每个区块包含5个结构:none,区块大小,区块头信息,交易数据,交易详情
- 魔法数 什么意思????
占4个字节
- 正式网络中魔法数:0xD9B48EF9(实际区块中存储为小头位序,显示为F9 BE B4 D9)
- 正式网络中魔法数:0x709110B(实际区块中存储为小头位序,显示为0B 11 09 07)
- 正式网络中魔法数:0xDAB5BFFA(实际区块中存储为小头位序,显示为FA FB B4 DA)
-
区块大小
占4个字节 -
区块头
包含6个数据项,共占80字节
* 区块版本号(Version),4字节
* 前一区块Hash(hashPrevBlock),占32字节
* Merkle根hash,占32字节
* 时间戳(Timestamp),占4字节
* 难度目标hash (bits),占4字节
* 随机数(nonce),占4字节
-
交易数量(Transaction counter)
占1-9字节 -
交易详情
包含6个数据项,字节大小取决了交易中输入和输出的数量
1.2比特币交易的数据结构(以P2PKH为例)
- 交易数据格式的版本号(version)
- 占4个字节
- 交易中输入的数量(tx_in count)
- 占1-9字节
- 交易中输入的列表信息(tx_in)
- 最少占41字节
- 标准的P2PKH交易的输入包含8项信息
- 上笔交易的hash,32字节
- 该交易是上一笔交易的输出的第几条,4字节(索引小标从0开始)
- 解锁脚本总长度,占106~108字节 (私钥签名+压缩公钥长度+2字节标记)
- 私钥签名长度,1字节
- 私钥签名的DER编码格式,71~73字节
- 压缩公钥长度,1字节
- 压缩公钥,32字节
- 发送者定义的交易版本,就是JSON格式中的sequence,4字节,常用来识别交易的一个输入结束
- 交易中输出的数量(tx_out count)
- 占1~9字节
- 交易中输出的列表信息
- 最少占8字节
- 交易输出包含3项信息
- 交易金额,8字节
- 锁定脚本长度,1字节
- 锁定脚本内容,不定长度,根据脚本复杂程度而可变长度。
- 锁定时间(lock_time)
- 占4个字节
- 锁定时间表示在某个高度的区块诞生之前或某个时间点之前,该交易处于锁定状态而不能被收录进区块链中,只有在满足锁定条件后才能被打包上链。
- lock_time==0 ,表示该交易可以立即被打包
- lock_time >= 500 00 0000,lock_time表示unix时间戳,就是说这笔交易只能等待当前时间大于等于lock_time才能被打包进区块
- lock_time < 500 00 0000 ,lock_time 表示区块高度,就是说只能打包进高度大于lock_time的区块
交易的16进制形式
浏览器中输入下面地址可以看到以下结果
https://blockchain.info/rawtx/32b0f0d04f0e5eef454d94489081c7ff9faa5c1fbe89135eddd436b9da738559?format=hex
0100000001a59371498d99730fd15969aa38d5eb115cf158bc4431661c64bddd349db1744c020000006a473044022054c7e4b0d50da0f9964ee881a9ee8f35a5e5532a2fd7cb41b7ed919c67aa1904022066bad005f4076e5b13199676436648ea9a934778ae6c82f553e4e56af9814ec7012102b1344441f90de9ee5cabeb4b265d9dc947855816117d5405bc5640dc2502f8c1ffffffff02c81405000000000017a9140e3f675d1d9efac6d590e662dc5f6d96c5e526cf8790ce3e01000000001976a914d5c7c9940467fe8a319f89b22254a8b6d9f1f21988ac00000000
01000000
注明:计算机存储的16进制数据是小头位序排列格式,即低位在前,高位在后,区块链浏览器中16进制数值显示的是大头位序排列形式。
-
版本号
000000010扫描二维码关注公众号,回复: 5283437 查看本文章 -
交易中输入的数量
01
交易输入
- a59371498d99730fd15969aa38d5eb115cf158bc4431661c64bddd349db1744c //上笔交易的hash,32字节。
- 02000000 //固定4字节,表示该输入是上一笔交易的第1个输出
- 6a //签名数据的总长度为(16*6+10=106)106字节
- 47 //私钥签名的数据长度为71字节(4*16+7=71)
- 3044022054c7e4b0d50da0f9964ee881a9ee8f35a5e5532a2fd7cb41b7ed919c67aa1904022066bad005f4076e5b13199676436648ea9a934778ae6c82f553e4e56af9814ec701 //72字节的私钥签名DER编码格式,以“30”开头,常以"01"结尾
- 21 //对应压缩公钥长度为33
> 特别注明:
> * 非压缩公钥共65字节,第一个字节是0x04,32字节为x坐标,32字节为y坐标,一共是130位16进制数字。
> * 压缩公钥共33字节,第一个字节是0x02或0x03,只包含x坐标的32字节,不包含坐标。 - 02b1344441f90de9ee5cabeb4b265d9dc947855816117d5405bc5640dc2502f8c1 //压缩公钥
- ffffffff //发送者定义的交易版本,占4个字节对,应对json格式中的sequence,常用于识别交易的输入结束
交易输出 - 02 //交易中输出的数量
(第一笔交易不太懂,这里我就只写了第二笔交易)
第二笔交易
- 19 //输出脚本总长度 (25字节)
- 76 //OP_DUP
- a9 //HASH_160
- 14 //PUSHDATA(20)将下面20字节压入堆栈
- d5c7c9940467fe8a319f89b22254a8b6d9f1f219 //压入堆栈的压缩公钥HASH160
- 88 //OP_EQUALVERIFY
- ac //OP_CHECKSIG
- 00000000 锁定时间
将这个16进制码作分割,那么如下:(不太理解第一个输出的指令为什么不太一样????)
01
a59371498d99730fd15969aa38d5eb115cf158bc4431661c64bddd349db1744c
02000000
6a
47
3044022054c7e4b0d50da0f9964ee881a9ee8f35a5e5532a2fd7cb41b7ed919c67aa1904022066bad005f4076e5b13199676436648ea9a934778ae6c82f553e4e56af9814ec701
21
02b1344441f90de9ee5cabeb4b265d9dc947855816117d5405bc5640dc2502f8c1
ffffffff
02
c814050000000000 (16进制514c8,转换成16进制就是514c8)
17
a9
14
0e3f675d1d9efac6d590e662dc5f6d96c5e526cf87
90ce3e0100000000(16进制13ece90,转换成10进值就是20893328)
19
76
a9
14d5c7c9940467fe8a319f89b22254a8b6d9f1f219
88
ac
00000000
下面两个链接的页面完全一样,其中tx-index就是json中tx-index
https://www.blockchain.com/btc/tx/32b0f0d04f0e5eef454d94489081c7ff9faa5c1fbe89135eddd436b9da738559
https://blockchain.info/tx-index/418301952
交易的json格式
{
"ver":1,
"inputs":[
{
"sequence":4294967295,
"witness":"",
"prev_out":{
"spent":true,
"spending_outpoints":[
{
"tx_index":418301952,
"n":0
}
],
"tx_index":418296606,
"type":0,
"addr":"18gzeGKaFikAFZhDE2P5bzfzDXEoJcQWU7",
"value":21230486,
"n":2,
"script":"76a91454593873fa83c7ed77a64f5ef8e230bd055a430888ac"
},
"script":"473044022054c7e4b0d50da0f9964ee881a9ee8f35a5e5532a2fd7cb41b7ed919c67aa1904022066bad005f4076e5b13199676436648ea9a934778ae6c82f553e4e56af9814ec7012102b1344441f90de9ee5cabeb4b265d9dc947855816117d5405bc5640dc2502f8c1"
}
],
"weight":892,
"block_height":564016,
"relayed_by":"127.0.0.1",
"out":[
{
"spent":true,
"spending_outpoints":[
{
"tx_index":418542089,
"n":40
}
],
"tx_index":418301952,
"type":0,
"addr":"32zMLbmErXhf81SgTHGETJPUPtEcxcudai",
"value":333000,
"n":0,
"script":"a9140e3f675d1d9efac6d590e662dc5f6d96c5e526cf87"
},
{
"spent":true,
"spending_outpoints":[
{
"tx_index":418309541,
"n":0
}
],
"tx_index":418301952,
"type":0,
"addr":"1LVNGLJc1zT4Gf9aLWFs8rawehvtLG2yuW",
"value":20893328,
"n":1,
"script":"76a914d5c7c9940467fe8a319f89b22254a8b6d9f1f21988ac"
}
],
"lock_time":0,
"size":223, //交易总大小223字节
"double_spend":false, //是否双花
"block_index":1751284,
"time":1550748324,
"tx_index":418301952, //交易索引号
"vin_sz":1,
"hash":"32b0f0d04f0e5eef454d94489081c7ff9faa5c1fbe89135eddd436b9da738559",
"vout_sz":2
}
注明:
参考:千峰教育课程