比特币原理-比特币交易脚本及交易数据(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yujuan110/article/details/87888276

1. 比特币交易的数据结构

1.1比特币区块的结构

每个区块包含5个结构:none,区块大小,区块头信息,交易数据,交易详情

  1. 魔法数 什么意思????
    占4个字节
  • 正式网络中魔法数:0xD9B48EF9(实际区块中存储为小头位序,显示为F9 BE B4 D9)
  • 正式网络中魔法数:0x709110B(实际区块中存储为小头位序,显示为0B 11 09 07)
  • 正式网络中魔法数:0xDAB5BFFA(实际区块中存储为小头位序,显示为FA FB B4 DA)
  1. 区块大小
    占4个字节

  2. 区块头

包含6个数据项,共占80字节
* 区块版本号(Version),4字节
* 前一区块Hash(hashPrevBlock),占32字节
* Merkle根hash,占32字节
* 时间戳(Timestamp),占4字节
* 难度目标hash (bits),占4字节
* 随机数(nonce),占4字节

  1. 交易数量(Transaction counter)
    占1-9字节

  2. 交易详情
    包含6个数据项,字节大小取决了交易中输入和输出的数量

1.2比特币交易的数据结构(以P2PKH为例)

  1. 交易数据格式的版本号(version)
  • 占4个字节
  1. 交易中输入的数量(tx_in count)
  • 占1-9字节
  1. 交易中输入的列表信息(tx_in)
  • 最少占41字节
  • 标准的P2PKH交易的输入包含8项信息
    • 上笔交易的hash,32字节
    • 该交易是上一笔交易的输出的第几条,4字节(索引小标从0开始)
    • 解锁脚本总长度,占106~108字节 (私钥签名+压缩公钥长度+2字节标记)
      • 私钥签名长度,1字节
      • 私钥签名的DER编码格式,71~73字节
      • 压缩公钥长度,1字节
      • 压缩公钥,32字节
      • 发送者定义的交易版本,就是JSON格式中的sequence,4字节,常用来识别交易的一个输入结束
  1. 交易中输出的数量(tx_out count)
  • 占1~9字节
  1. 交易中输出的列表信息
  • 最少占8字节
  • 交易输出包含3项信息
    1. 交易金额,8字节
    2. 锁定脚本长度,1字节
    3. 锁定脚本内容,不定长度,根据脚本复杂程度而可变长度。
  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

  • 交易中输入的数量
    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
}

注明:
参考:千峰教育课程

猜你喜欢

转载自blog.csdn.net/yujuan110/article/details/87888276