比特币区块结构解析

    xiaoxiao2024-12-21  1

    比特币区块结构解析

     https://blog.csdn.net/u013137970/article/details/69891985

     

    目录

    1 获取区块数据2 区块结构3 区块头数据分析4 交易 4.1 coinbase交易结构4.2 coinbase交易数据分析4.3 普通交易信息结构4.4 普通交易数据分析5 特殊的区块——创世区块6 结语

     

    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父区块头哈希值前一个区块头的哈希值32Merkle根哈希交易列表生成的默克尔树根哈希4时间戳该区块产生的近似时间,精确到秒的UNIX时间戳4难度目标难度目标,挖矿难度值4Nonce挖矿过程中使用的随机值

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

    3 区块头数据分析

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

    0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e70

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

    例如小端十六进制格式数据为 0x01020304,那么转化为大端正常的数据就是 0x04030201。04代表高位字节值,01 代表低位字节值,转化为十进制数为 4∗166+3∗164+2∗162+1∗160=67305985

    4∗166+3∗164+2∗162+1∗160=67305985。

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

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

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

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

    json格式prev_block字段:000000002a22cfee1f2c846adbd12b3e183d4f97683f85dad08a79780a84bd55hex格式32个字节数据:55bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000

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

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

    json格式mrkl_root字段:7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ffhex格式32个字节数据:ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d

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

    其次4个字节是时间戳:

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

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

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

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

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

    其次4个字节是Nonce:

    json格式nonce字段:1889418792hex格式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交易哈希值固定为全04输出索引固定为全11-9Coinbase脚本长度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字段:1hex格式4个字节数据:01000000

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

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

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

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

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

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

    32字节全0为固定值。

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

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

    4个字节全1为固定值。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    4.3 普通交易信息结构

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

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

    普通交易输入结构为:

    字节长度字段说明32交易哈希值指向被花费的UTXO所在的交易的哈希4输出索引被花费的UTXO的索引号,第一个是01-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字段:1hex格式4个字节数据:01000000

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

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

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

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

    json格式prev_hash字段:0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9hex格式32个字节数据:c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    json格式script字段:4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84chex格式67个字节数据:4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac

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

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

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

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

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

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

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

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

    json格式script字段:410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3achex格式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' 12345

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

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

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

    得到的哈希值 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

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

    最新回复(0)