比特币区块底层数据详细解析

准备工作

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

注:该网站最新的区块信息是16年12月份的,比较滞后,但作为测试的话还是可以参考。如果要获取最新的比特币区块信息,可以自己搭建比特币钱包的全节点(bitcoin.conf里面要设置txindex=1才能同步完整的钱包节点数据),然后通过rpc命令去获取。假设要获取区块高度为500000的区块数据,可按以下方式操作。

方法一:
1、先根据区块高度获取区块hash
bitcoin-cli getblockhash 500000


得到的hash值为:00000000000000000024fb37364cbf81fd49cc2d51c09c75c35433c3a1945d04
2、根据区块hash查询区块信息
bitcoin-cli getblock 00000000000000000024fb37364cbf81fd49cc2d51c09c75c35433c3a1945d04
3、上面返回的是json数据,如果要返回十六进制数据,只需要在命令后面加false即可。
bitcoin-cli getblock 00000000000000000024fb37364cbf81fd49cc2d51c09c75c35433c3a1945d04 false

方法二:
如果没有搭建比特币的钱包节点怎么办,我们还可以在下面这个网站执行我们上面的命令http://chainquery.com/bitcoin-api
1、找到getblockhash命令,然后填入height,点击执行按钮,就可以看到返回结果。


2、找到getblock命令填入上一步得到的区块hash值,如果要得到十六进制格式选false:hex即可

特别说明:本文分析用到的区块hash是00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee,区块高度是170,是属于比较早期的区块数据,比特币在2017年8月24日激活了隔离验证,区块高度481,824,在此高度之后的一些区块如果有隔离验证支持的数据,底层数据分析会略有不同,隔离验证的底层协议数据解析我在《比特币隔离验证协议结构分析》中有所介绍

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

转为十六进制字符串

区块头结构

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

区块头(80字节):
0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e70

版本号(4字节):01000000

父区块头hash值(32字节):55bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000

merkle根(32字节):ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d

时间戳(4字节):51b96a49

难度(4字节):ffff001d

Nonce(4字节):283e9e70

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

说明:

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

交易整体结构

接下来我们分析交易信息,除去头部的80个字节,剩下的都为交易信息整体信息:
0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

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

Coinbase交易信息分析

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

Coinbase交易信息:
0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac00000000

交易数量:02
版本(4字节):01000000
输入计数器(1~9字节):01
交易哈希(32字节):0000000000000000000000000000000000000000000000000000000000000000
交易输出索引(4字节):ffffffff
Coinbase数据长度(1~9字节):07
Coinbase数据(不定):04ffff001d0102
顺序号(4字节):ffffffff
输出计数器(1~9字节):01
总量(8字节):00f2052a01000000

锁定脚本大小(1~9字节):43

锁定脚本(不定):
4104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac

锁定时间(4字节):00000000

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交易信息与实际信息对照:

说明:

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

普通交易信息分析

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

0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

版本(4字节):01000000
输入计数器(1~9字节):01
输入(不定):

交易哈希值(32字节):c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704
输出索引(4字节):00000000
解锁脚本大小(1~9字节):48
解锁脚本(不定):47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901
序列号(4字节):ffffffff

输出计数器(1~9字节):02
输出(不定):
1、(
总量(8字节):00ca9a3b00000000


锁定脚本大小(1~9字节):43
锁定脚本(不定):4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac

2、(
总量(8字节):00286bee00000000

锁定脚本大小(1~9字节):43
锁定脚本(不定):410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac

锁定时间(4字节):00000000

普通交易结构

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

普通交易输入

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

普通交易输出

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

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

说明:

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

关于OP_CHECKSIG:

OP_CHECKSIG是一个脚本操作码(script opcode),用来验证一个交易(tx)输入中的签名的正确性。OP_CHECKSIG需要堆栈中有个值。分别是,按照堆栈深度,公钥和脚本的签名。这两个值通常是待确认运行交易输入中的scriptSig脚本得到的。scriptSig脚本在执行完之后就被删除了,但是堆栈仍然保留。因此,上一个交易输出(已被花掉)的scriptPubKey脚本,通常包含一个OP_CHECKSIG。https://en.bitcoin.it/wiki/OP_CHECKSIG

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,770评论 4 88
  • 钱包、密钥 私钥衍生家族----适用于各种树形权限分配,比如企业钱包 交易 交易费按交易数据字节大小计算,交易费市...
    观星客阅读 939评论 0 2
  • 我有一匹马,它非常温顺,很听我的话,我们不但快乐的生活,还到处去做好事。 一次,我和我的马儿一起去散...
    杨益辰阅读 227评论 0 0
  • 敏捷开发中的PO即Product Owner,字面意思是产品或业务负责人,即熟悉该产品所有业务相关的逻辑、流程、设...
    贱小得阅读 18,305评论 0 4
  • 列支敦之登很小,全国的国土就是半边山和山下的河谷,首都瓦杜兹是著名的旅游景点,这里有很多中国人开的商铺,而我住...
    风之子C阅读 474评论 0 1