比特币区块结构解析

版权声明:本文为博主原创文章,转载请注明来源! https://blog.csdn.net/u013137970/article/details/69891985

1 获取区块数据

有多个区块链浏览器可以查询比特币区块值,本节使用 https://blockchain.info 获取高度为170的区块数据。通过其API可以很方便的获取区块的json和hex格式数据。

使用以下链接获取json格式区块数据:

https://blockchain.info/rawblock/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee

获取的json格式区块数据:

{
    "hash":"00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee",
    "ver":1,
    "prev_block":"000000002a22cfee1f2c846adbd12b3e183d4f97683f85dad08a79780a84bd55",
    "mrkl_root":"7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff",
    "time":1231731025,
    "bits":486604799,
    "fee":0,
    "nonce":1889418792,
    "n_tx":2,
    "size":490,
    "block_index":15019,
    "main_chain":true,
    "height":170,
    "tx":[

{
   "lock_time":0,
   "ver":1,
   "size":134,
   "inputs":[
      {
         "sequence":4294967295,
         "witness":"",
         "script":"04ffff001d0102"
      }
   ],
   "weight":536,
   "time":1231731025,
   "tx_index":15030,
   "vin_sz":1,
   "hash":"b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082",
   "vout_sz":1,
   "relayed_by":"0.0.0.0",
   "out":[
      {
         "spent":false,
         "tx_index":15030,
         "type":0,
         "addr":"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc",
         "value":5000000000,
         "n":0,
         "script":"4104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac"
      }
   ]
},

{
   "lock_time":0,
   "ver":1,
   "size":275,
   "inputs":[
      {
         "sequence":4294967295,
         "witness":"",
         "prev_out":{
            "spent":true,
            "tx_index":14862,
            "type":0,
            "addr":"12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S",
            "value":5000000000,
            "n":0,
            "script":"410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac"
         },
         "script":"47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901"
      }
   ],
   "weight":1100,
   "time":1231731025,
   "tx_index":15029,
   "vin_sz":1,
   "hash":"f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
   "vout_sz":2,
   "relayed_by":"0.0.0.0",
   "out":[
      {
         "spent":true,
         "tx_index":15029,
         "type":0,
         "addr":"1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3",
         "value":1000000000,
         "n":0,
         "script":"4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac"
      },
      {
         "spent":true,
         "tx_index":15029,
         "type":0,
         "addr":"12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S",
         "value":4000000000,
         "n":1,
         "script":"410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac"
      }
   ]
}]
 }

使用以下链接获取十六进制格式区块数据:

https://blockchain.info/rawblock/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee?format=hex

十六进制格式区块数据:

0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e700201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

2 区块结构

区块整体结构

字节长度 字段 说明
4 区块大小 用字节表示的该字段之后的区块大小
80 区块头 组成区块头的几个字段
1-9 交易计数器 该区块包含的交易数量,包含coinbase交易
不定 交易列表 记录在区块里的交易信息

区块头结构

字节长度 字段 说明
4 区块版本号 区块版本号
32 父区块头哈希值 前一个区块头的哈希值
32 Merkle根哈希 交易列表生成的默克尔树根哈希
4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳
4 难度目标 难度目标,挖矿难度值
4 Nonce 挖矿过程中使用的随机值

下文主要具体分析一个区块头和交易的值,通过逐字节分析,找出与比特币区块字段对应的部分,就可以加深对比特币区块的了解。

3 区块头数据分析

前面已经提到比特币区块头有80个字节长度,首先分析前 80 字节的区块头信息:

0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e70

按照字节长度和字段顺序逐步对 80 字节区块头数据进行分析,为了便于理解,将 json 格式和 hex 格式数据进行对比。比特币的原始数据保存方式是小端格式编码。也就是原始十六进制格式值需要字节逆转转化为大端格式数据然后才能转化为正常的数值。因为大端格式编码就是内存地址大的空间保存高位,书写出来就是左边的数据表示高位,与十进制表示法相同,更符合人的阅读习惯,

例如小端十六进制格式数据为 0x01020304,那么转化为大端正常的数据就是 0x04030201。04代表高位字节值,01 代表低位字节值,转化为十进制数为 4166+3164+2162+1160=673059854*16^6+3*16^4+2*16^2+1*16^0=67305985

首先4个字节是区块版本号:

  • json格式ver字段:1
  • hex格式4个字节数据:01000000

将小端十六进制数据0x01000000转化为大端格式数据0x00000001,则转化为十进制数值为1。

其次32个字节是父区块头哈希值:

  • json格式prev_block字段:000000002a22cfee1f2c846adbd12b3e183d4f97683f85dad08a79780a84bd55
  • hex格式32个字节数据:55bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000

将小端十六进制数据0x55bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000转化为大端格式数据0x000000002a22cfee1f2c846adbd12b3e183d4f97683f85dad08a79780a84bd55,则在验证的时候需要将此数据转化为大数与标准难度值进行比较,最高有效位为0x2a,最低有效位为0x55。

其次32个字节是默克尔树根哈希值:

  • json格式mrkl_root字段:7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff
  • hex格式32个字节数据:ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d

同理,小端十六进制值转化为大端格式的默克尔树根需要将32字节逆序转换。

其次4个字节是时间戳:

  • json格式time字段:1231731025
  • hex格式4个字节数据:51b96a49

将小端十六进制数据0x51b96a49转化为大端格式数据0x496ab951,则转化为十进制数值为1231731025,表示的是自1970年1月1日0时0分0秒以来的秒数,转化为格林尼治时间为2009-01-12 03:30:25,这说明矿工挖出该区块的时间在这附近。

其次4个字节是难度目标:

  • json格式bits字段:486604799
  • hex格式4个字节数据:ffff001d

将小端十六进制数据0xffff001d转化为大端格式数据0x1d00ffff,则转化为十进制数值为486604799。

其次4个字节是Nonce:

  • json格式nonce字段:1889418792
  • hex格式4个字节数据:283e9e70

将小端十六进制数据0x283e9e70转化为大端格式数据0x709e3e28,则转化为十进制数值为1889418792。

4 交易

接下来分析交易信息:

0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

交易信息前面几个字节表示的是该区块包含的交易数量,coinbase交易也计入在内。交易数量类型采用的是一种压缩尺寸的变长整型。可以看出第一个字节是0x02,这就说明本区块只有2个交易:一个coinbase交易和一个普通交易。每个区块第一个交易规定为coinbase交易。

coinbase交易的交易哈希值为:b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082

普通交易的交易哈希值为:f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16

接下来将对这两个交易进行逐字段分析。

4.1 coinbase交易结构

每个区块的第一个交易叫做coinbase交易,它的结构如下:

字节长度 字段 说明
4 交易版本号 明确这笔交易参照的规则
1-9 输入计数器 包含的交易输入数量
不定 交易输入 一个或多个交易输入
1-9 输出计数器 包含的交易输出数量
不定 交易输出 一个或多个交易输出
4 锁定时间 一个区块号或UNIX时间戳

coinbase的交易输入结构为:

字节长度 字段 说明
32 交易哈希值 固定为全0
4 输出索引 固定为全1
1-9 Coinbase脚本长度 coinbase的脚本字节长度
不定 coinbase脚本 coinbase脚本,可以任意填充
4 序列号 固定值0xFFFFFFFF

coinbase交易的输入格式经过数次改变,在高度227836之前遵从的区块版本号为1。因为本文分析的区块实例高度为170,则coinbase交易遵从版本1的规定。之后的区块版本中规定coinbase数据中需要添加区块高度值,版本2、3、4更详细的说明可以查看比特币官网的开发文档,在此不再赘述。

coinbase的交易输出结构为:

字节长度 字段 说明
8 总量 用聪表示的比特币值
1-9 锁定脚本大小 用字节表示的后面的锁定脚本长度
不定 锁定脚本 一个定义了支付输出所需条件的脚本

4.2 coinbase交易数据分析

使用以下链接获取coinbase交易的对应json数据:

https://api.blockcypher.com/v1/btc/main/txs/b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082

获取的json格式交易数据:

{
  "block_hash": "00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee",
  "block_height": 170,
  "block_index": 0,
  "hash": "b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082",
  "addresses": [
    "1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc"
  ],
  "total": 5000000000,
  "fees": 0,
  "size": 134,
  "preference": "low",
  "confirmed": "2014-11-16T18:53:46.237Z",
  "received": "2014-11-16T18:53:46.237Z",
  "ver": 1,
  "double_spend": false,
  "vin_sz": 1,
  "vout_sz": 1,
  "confirmations": 541062,
  "confidence": 1,
  "inputs": [
    {
      "output_index": -1,
      "script": "04ffff001d0102",
      "sequence": 4294967295,
      "script_type": "empty",
      "age": 170
    }
  ],
  "outputs": [
    {
      "value": 5000000000,
      "script": "4104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac",
      "addresses": [
        "1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc"
      ],
      "script_type": "pay-to-pubkey"
    }
  ]
}

coinbase交易的原始数据为:

01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac00000000

首先4个字节表示交易版本号:

  • json格式ver字段:1
  • hex格式4个字节数据:01000000

将小端格式数据0x01000000转化为大端格式数据为0x00000001,转化为十进制数值为1。表示coinbase交易的数据格式遵循的格式版本号为1。

其次1个字节表示交易输入的个数:

  • json格式vin_sz字段:1
  • hex格式1个字节数据:01

表示coinbase交易输入只有一个。

其次32个字节表示引用的UTXO交易哈希值:

  • json格式字段:无对应
  • hex格式32个字节数据:0000000000000000000000000000000000000000000000000000000000000000

32字节全0为固定值。

其次4个字节表示引用的UTXO所对应的输出索引:

  • json格式output_index字段:-1
  • hex格式4个字节数据:ffffffff

4个字节全1为固定值。

其次1个字节表示coinbase脚本数据的长度:

  • json格式字段:无对应
  • hex格式4个字节数据:07

0x07表示之后的coinbase脚本数据长度为7字节。

其次7个字节表示coinbase脚本:

  • json格式script字段:04ffff001d0102
  • hex格式4个字节数据:04ffff001d0102

coinbase脚本数据和普通交易的解锁脚本不同,因为coinbase是创币交易,则coinbase的脚本不需要对其它UTXO进行解锁,故可以填充任意数据。

其次4个字节序列号为固定值0xffffffff:

  • json格式sequence字段:4294967295
  • hex格式4个字节数据:ffffffff

十六进制0xffffffff转化为十进制值为4294967295。

其次1个字节表示交易输出的个数:

  • json格式vout_sz字段:1
  • hex格式1个字节数据:01

表明该交易有1个交易输出。

其次8个字节表示挖出新比特币的数量,单位为聪:

  • json格式value字段:5000000000
  • hex格式8个字节数据:00f2052a01000000

小端格式十六进制值0x00f2052a01000000转化为大端格式十六进制值0x000000012a05f200,之后转化为十进制值为5000000000,表示该交易输出转出比特币的值为50亿聪,表明该区块新挖出50个比特币。

其次1个字节表示锁定脚本的字节长度:

  • json格式字段:无对应
  • hex格式8个字节数据:43

表明接下来的锁定脚本字节长度为67个字节,转化为十六进制值为0x43。

其次67个字节表示锁定脚本:

  • json格式script字段:4104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac
  • hex格式67个字节数据:4104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac

锁定脚本开头的0x41表示将后面的65个字节压入堆栈。

其次4个字节表示锁定时间:

  • json格式字段:无对应
  • hex格式4个字节数据:00000000

锁定时间为0,表示立即执行。

4.3 普通交易信息结构

剩余的信息就是一个普通交易信息,普通交易结构为:

字节长度 字段 说明
4 交易版本号 明确这笔交易参照的规则
1-9 输入计数器 包含的交易输入数量
不定 交易输入 一个或多个交易输入
1-9 输出计数器 包含的交易输出数量
不定 交易输出 一个或多个交易输出
4 锁定时间 一个区块号或UNIX时间戳

普通交易输入结构为:

字节长度 字段 说明
32 交易哈希值 指向被花费的UTXO所在的交易的哈希
4 输出索引 被花费的UTXO的索引号,第一个是0
1-9 解锁脚本大小 用字节表示的后面的解锁脚本长度
不定 解锁脚本 满足UTXO解锁脚本条件的脚本
4 序列号 固定值0xFFFFFFFF

普通交易输出结构为:

字节长度 字段 说明
8 总量 用聪表示的比特币值
1-9 锁定脚本大小 用字节表示的后面的锁定脚本长度
不定 锁定脚本 一个定义了支付输出所需条件的脚本

4.4 普通交易数据分析

使用以下链接获取该普通交易的对应json数据:

https://api.blockcypher.com/v1/btc/main/txs/f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16

获取的json格式交易数据:

{
  "block_hash": "00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee",
  "block_height": 170,
  "block_index": 1,
  "hash": "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
  "addresses": [
    "12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S",
    "1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3"
  ],
  "total": 5000000000,
  "fees": 0,
  "size": 275,
  "preference": "low",
  "confirmed": "2009-01-12T03:30:25Z",
  "received": "2009-01-12T03:30:25Z",
  "ver": 1,
  "double_spend": false,
  "vin_sz": 1,
  "vout_sz": 2,
  "confirmations": 541034,
  "confidence": 1,
  "inputs": [
    {
      "prev_hash": "0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9",
      "output_index": 0,
      "script": "47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901",
      "output_value": 5000000000,
      "sequence": 4294967295,
      "addresses": [
        "12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S"
      ],
      "script_type": "pay-to-pubkey",
      "age": 9
    }
  ],
  "outputs": [
    {
      "value": 1000000000,
      "script": "4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac",
      "spent_by": "ea44e97271691990157559d0bdd9959e02790c34db6c006d779e82fa5aee708e",
      "addresses": [
        "1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3"
      ],
      "script_type": "pay-to-pubkey"
    },
    {
      "value": 4000000000,
      "script": "410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac",
      "spent_by": "a16f3ce4dd5deb92d98ef5cf8afeaf0775ebca408f708b2146c4fb42b41e14be",
      "addresses": [
        "12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S"
      ],
      "script_type": "pay-to-pubkey"
    }
  ]
}

普通交易的原始数据为:

0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

首先4个字节表示交易版本号:

  • json格式ver字段:1
  • hex格式4个字节数据:01000000

将小端格式数据0x01000000转化为大端格式数据为0x00000001,转化为十进制数值为1。

其次1个字节表示交易输入的数量:

  • json格式vin_sz字段:1
  • hex格式1个字节数据:01

其次32个字节表示引用的UTXO交易哈希值:

  • json格式prev_hash字段:0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9
  • hex格式32个字节数据:c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704

原生数据是小端格式,json格式数据是大端格式。

其次4个字节表示引用的UTXO所对应的输出索引:

  • json格式output_index字段:0
  • hex格式4个字节数据:00000000

这说明该交易输入引用的UTXO是交易 0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9 的第一个输出。

其次1个字节表示解锁脚本字节长度:

  • json格式字段:无对应
  • hex格式1个字节数据:48

表明接下来的解锁脚本字节长度为72个字节,转化为十六进制值为0x48。

其次72个字节表示解锁脚本:

  • json格式script字段:47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901
  • hex格式72个字节数据:47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901

解锁脚本开头的0x47表示将后面的71个字节压入堆栈。

其次4个字节序列号为固定值0xffffffff:

  • json格式sequence字段:4294967295
  • hex格式4个字节数据:ffffffff

十六进制0xffffffff转化为十进制值为4294967295。

其次1个字节表示交易输出的个数:

  • json格式vout_sz字段:2
  • hex格式1个字节数据:02

表明该交易有两个交易输出。

其次8个字节表示转出的btc的数量,单位为聪:

  • json格式value字段:1000000000
  • hex格式8个字节数据:00ca9a3b00000000

小端格式十六进制值0x00ca9a3b00000000转化为大端格式十六进制值0x000000003b9aca00,之后转化为十进制值为1000000000,表示该交易输出转出比特币的值为10亿聪,1亿聪=1BTC,因此该交易输出转出了10个比特币。

其次1个字节表示锁定脚本的字节长度:

  • json格式字段:无对应
  • hex格式8个字节数据:43

表明接下来的锁定脚本字节长度为67个字节,转化为十六进制值为0x43。

其次67个字节表示锁定脚本:

  • json格式script字段:4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c
  • hex格式67个字节数据:4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac

锁定脚本开头的0x41表示将后面的65个字节压入堆栈。

其次8个字节表示转出的btc的数量,单位为聪:

  • json格式value字段:4000000000
  • hex格式8个字节数据:00286bee00000000

小端格式十六进制值0x00286bee00000000转化为大端格式十六进制值0x00000000ee6b2800,之后转化为十进制值为4000000000,表示该交易输出转出比特币的值为40亿聪,因此该交易输出转出了40个比特币。

其次1个字节表示锁定脚本的字节长度:

  • json格式字段:无对应
  • hex格式1个字节数据:43

表明接下来的锁定脚本字节长度为67个字节,转化为十六进制值为0x43。

其次67个字节表示锁定脚本:

  • json格式script字段:410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac
  • hex格式67个字节数据:410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac

其次4个字节表示锁定时间:

  • json格式字段:无对应
  • hex格式4个字节数据:00000000

锁定时间为0,表示立即执行。

5 特殊的区块——创世区块

创世区块的UTXO无法被消费。

6 结语

比特币的区块哈希值其实就是区块头的双哈希的大端表示。本例中,计算区块头哈希值:

>>> import hashlib
>>> hashlib.sha256(bytes.fromhex('0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e70')).hexdigest()
'08b2bb46ca900c6a5ce7b918908ae484431b64d8eda251d817fec44f29c7a096'
>>> hashlib.sha256(bytes.fromhex('08b2bb46ca900c6a5ce7b918908ae484431b64d8eda251d817fec44f29c7a096')).hexdigest()
'eea2d48d2fced4346842835c659e493d323f06d4034469a8905714d100000000'

得到的哈希值为 eea2d48d2fced4346842835c659e493d323f06d4034469a8905714d100000000,该值为小端格式显示,但是比特币的区块头哈希值一般是大端表示,然后转换为大数与难度值进行比较。因此,更一般的区块头表示其实是大端格式 00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee。存储的区块链原始数据其实是小端格式哈希值。

同理,本例中计算 coinbase 交易哈希值:

>>> import hashlib
>>> hashlib.sha256(bytes.fromhex('01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac00000000')).hexdigest()
'10942aadb029da601aa93314c70e9c388244e19a11e1553ee532f0c4a2f35504'
>>> hashlib.sha256(bytes.fromhex('10942aadb029da601aa93314c70e9c388244e19a11e1553ee532f0c4a2f35504')).hexdigest()
'82501c1178fa0b222c1f3d474ec726b832013f0a532b44bb620cce8624a5feb1'

得到的哈希值 82501c1178fa0b222c1f3d474ec726b832013f0a532b44bb620cce8624a5feb1 为小端格式,而在表示成 json 格式的成员中,就需要转换为大端格式 b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082。

在用户使用区块链浏览器查询比特币的区块信息和交易信息时,查询的哈希值均为大端格式哈希值。至于为什么存储使用小端格式,而显示却采用大端格式?比特币核心开发 Wladimir van der Laan 对此进行了解释:

Due to historical accident, the tx and block hashes that bitcoin core uses are byte-reversed. I’m not entirely sure why. May be something like using openssl bignum to store hashes or something like that, then printing them as a number.
引自:http://learnmeabitcoin.com/glossary/txid

这个解释有一定的说服力,因为区块头哈希值使用大端格式表示是因为需要将哈希值转换为一个大整数与标准难度值进行比较。而进行其它双哈希运算的时候可能复用了相同的函数,导致出现了这个情况。当然,早期的这点“错误”对比特币的安全性没有什么影响。

没有更多推荐了,返回首页