美文网首页区块链
比特币区块结构解析

比特币区块结构解析

作者: DavieKong | 来源:发表于2018-03-25 12:08 被阅读64次

    前言

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

    准备工作

    我们在https://webbtc.com网站上查询区块哈希值为00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee的区块,查询到该区块的json格式信息和十六进制格式信息。

    json格式信息:

    {
      "hash": "00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee",
      "ver": 1,
      "prev_block": "000000002a22cfee1f2c846adbd12b3e183d4f97683f85dad08a79780a84bd55",
      "mrkl_root": "7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff",
      "time": 1231731025,
      "bits": 486604799,
      "nonce": 1889418792,
      "n_tx": 2,
      "size": 490,
      "tx": [
        {
          "hash": "b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082",
          "ver": 1,
          "vin_sz": 1,
          "vout_sz": 1,
          "lock_time": 0,
          "size": 134,
          "in": [
            {
              "prev_out": {
                "hash": "0000000000000000000000000000000000000000000000000000000000000000",
                "n": 4294967295
              },
              "coinbase": "04ffff001d0102"
            }
          ],
          "out": [
            {
              "value": "50.00000000",
              "scriptPubKey": "04d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725b OP_CHECKSIG"
            }
          ],
          "nid": "c56705435de47674259d6c92125907645d4fb512fa8e7f31457f5f29ba983d80"
        },
        {
          "hash": "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
          "ver": 1,
          "vin_sz": 1,
          "vout_sz": 2,
          "lock_time": 0,
          "size": 275,
          "in": [
            {
              "prev_out": {
                "hash": "0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9",
                "n": 0
              },
              "scriptSig": "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901"
            }
          ],
          "out": [
            {
              "value": "10.00000000",
              "scriptPubKey": "04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c OP_CHECKSIG",
              "next_in": {
                "hash": "ea44e97271691990157559d0bdd9959e02790c34db6c006d779e82fa5aee708e",
                "n": 0
              }
            },
            {
              "value": "40.00000000",
              "scriptPubKey": "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG",
              "next_in": {
                "hash": "a16f3ce4dd5deb92d98ef5cf8afeaf0775ebca408f708b2146c4fb42b41e14be",
                "n": 0
              }
            }
          ],
          "nid": "a1629e004eb3d703ecf3807f976e402a626d84c559f8eab1450adf207619f319"
        }
      ],
      "mrkl_tree": [
        "b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082",
        "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
        "7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff"
      ],
      "next_block": "00000000c9ec538cab7f38ef9c67a95742f56ab07b0a37c5be6b02808dbfb4e0"
    }
    

    十六进制格式信息:

    0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e700201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000
    

    区块整体结构

    一个完整的区块结构主要由以下几部分构成:

    字节 字段 说明
    4 区块大小 用字节表示的该字段之后的区块大小
    80 区块头 组成区块头的几个字段
    1-9 交易计数器 该区块包含的交易数量,包含coinbase交易
    不定 交易 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致

    比特币的区块大小目前被严格限制在1MB以内。4字节的区块大小字段不包含在此内。

    区块头信息分析

    我们首先分析前80字节的区块头信息:

    0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e70
    

    区块头结构1

    字节 字段 说明
    4 版本 区块版本号,表示本区块遵守的验证规则
    32 父区块头哈希值 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算
    32 Merkle根 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算
    4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块
    4 难度目标 该区块工作量证明算法的难度目标,已经使用特定算法编码
    4 Nonce 为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数

    区块头信息与实际信息对照

    说明

    • 版本、父区块头哈希值和Merkle根采用的是小端格式编码,即低有效位放在前面。
    • 时间戳表示的是自1970年1月1日0时0分0秒以来的秒数,1231731025秒转为十六进制值为0x496AB951,然后采用小端格式编码表示为0x51b96a49。
    • 难度目标486604799转化为十六进制值为0x1d00ffff,该值采用小端格式编码。而当前区块的难度值0x1d00ffff需要采用一种特殊的编码方式才能正确转化为目标哈希值。
    • 随机数nonce表示的随机数值转化为十六进制为0x709E3E28,然后采用小端格式编码表示为0x283e9e70。

    交易整体结构

    接下来我们分析交易信息:

    0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000
    

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

    Coinbase交易信息分析

    一个区块第一个交易规定为coinbase交易。

    Coinbase交易结构为

    字节 字段 描述
    4 版本 这笔交易参照的规则
    1-9 输入计数器 包含的交易输入数量
    32 交易哈希 不引用任何一个交易,值全部为0
    4 交易输出索引 固定为0xFFFFFFFF
    1-9 Coinbase数据长度 coinbase数据长度
    不定 Coinbase数据 在V2版本的区块中,除了需要以区块高度开始外,其它数据可以任意填写,用于extra nonce和挖矿标签
    4 顺序号 值全部为1,0xFFFFFFFF
    1-9 输出计数器 包含的交易输出数量
    8 总量 用聪表示的比特币值
    1-9 锁定脚本大小 用字节表示的后面的锁定脚本长度
    不定 锁定脚本 一个定义了支付输出所需条件的脚本
    4 锁定时间 一个区块号或UNIX时间戳

    Coinbase交易信息与实际信息对照

    [图片上传失败...(image-7304fc-1521950785413)]

    说明

    • 版本采用小端格式编码。
    • Coinbase交易没有交易输入,也就是说它不引用任何一个UTXO,它所引用的交易哈希只是一个256位的0,表示引用为空。
    • 交易输出索引也是固定值,为0xffffffff,转化为十进制值为4294967295。
    • Coinbase数据采用大端格式编码。
    • Coinbase交易只有一个特殊的“交易输入”和一个交易输出,均采用变长整型来表示。
    • 输出总量为50亿聪的比特币,转化为十六进制为0x12A05F200,将其扩充为8字节,变为0x000000012A05F200,之后采用小端格式表示。
    • 锁定脚本共有67个字节。开头的41含义,表示要将接下来的65个字节压入堆栈。最后一个字节的16进制数值,ac,表示的是OP_CHECKSIG。
    • 最后的锁定时间为0,表示立即执行。

    普通交易信息分析

    剩余的信息就是一个普通交易信息:

    0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000
    

    普通交易结构为

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

    普通交易输入为

    字节 字段 描述
    32 交易哈希值 指向被花费的UTXO所在的交易的哈希指针
    4 输出索引 被花费的UTXO的索引号,第一个是0
    1-9 解锁脚本大小 用字节表示的后面的解锁脚本长度
    不定 解锁脚本 满足UTXO解锁脚本条件的脚本
    4 序列号 目前未被使用的交易替换功能,设为0xFFFFFFFF

    普通交易输出为

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

    普通交易信息与实际信息对照

    [图片上传失败...(image-3d79b3-1521950785413)]

    说明

    • 版本号、交易哈希值采用小端格式编码。
    • 输入计数器、输出计数器、解锁脚本大小和锁定交易大小均采用变长整型值。
    • 输出索引为0,这表明该输入引用的UTXO是交易0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9的第一个输出。
    • 解锁脚本大小为0x48,则说明后面有72字节的解锁脚本。
    • 解锁脚本开头的0x47表示现将后面的71个字节压入堆栈。
    • 本交易共有两个输出,第一个输出总量为10亿聪,转化为十六进制值为0x000000003B9ACA00,最后采用小端格式编码。同理可得第二个输出总量为40亿聪,转化为十六进制值为0x00000000EE6B2800,最后采用小端格式编码。
    • 第一个交易的锁定脚本大小十六进制值为0x43,这说明后面有67个字节的锁定脚本。
    • 第一个锁定脚本开头的0x41表示将接下来的65个字节压入堆栈。而结尾的0xac表示OP_CHECKSIG。
    • 第二个交易与第一个交易同理分析。
    • 最后锁定时间为0,表示立即执行。

    参考:https://bitcoin.stackexchange.com/questions/11104/what-is-the-database-for?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

    相关文章

      网友评论

      本文标题:比特币区块结构解析

      本文链接:https://www.haomeiwen.com/subject/ewchcftx.html