bitcoin-03-比特币区块结构
区块结构
区块链开发之前,先了解比特币的区块结构,有利于了解后续比特币的各种数据结构的做用。
本文要介结几个重要概念:
- 区块结构
- 区块头
- 区块体
- 区块查看工具
区块
区块是比特币的核心。
当前比特币网络,每10分产一个块。
区块的作用: 比特币最核心的数据结构,包含了交易的重要标识,包括:区块头、区块体、区块大小等数据。
一个完整的区块结构
数据项 | 字节 | 字段 | 说明 |
---|---|---|---|
Magic NO | 4 | 魔数 | 常数0xD9B4BEF9 |
Blocksize | 4 | 区块大小 | 用字节表示的该字段之后的区块大小 |
Blockheader | 80 | 区块头 | 组成区块头的几个字段 |
Transaction counter | 1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 |
Transactions | 不定 | 交易 | 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致 |
这里最典型的要数 区块头和 区块体 了,因为它们通常在学习区块链的时候,比较能说明区块链的重要特性。
另外区块链不看不见摸不着的东西,人往往需要可视化的模型会更有助于理解抽象的概念。
这里介绍一个工具,区块链浏览器:
https://blockchain.info/
通过这个浏览器,可以查看区块内的信息。
为什么这个站点可以查看区块信息?
因为区块链的服务,也就是个服务,提供了查询接口,机构或个人,只需要运行区块链服务,在本地运行就可以访问区块链信息,前提是要同步好区块数据。
之前的文章就强调过,鼓励大家运行区块链服务是区块链的特点,币是奖励,算是一种副产物,是被金融机构炒起来的。
区块头
查看区块信息
getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2
1 | { |
包含以下数据:
字节长度 | 字段 | 说明 |
---|---|---|
4 | version | 区块版本号 |
32 | previousblockhash | 前一个区块头的哈希值 |
32 | merkleroot | Merkle根哈希,交易列表生成的默克尔树根哈希 |
4 | time | 时间戳,该区块产生的近似时间,精确到秒的UNIX时间戳 |
4 | bits | 难度目标,挖矿难度值 |
4 | Nonce | 挖矿过程中使用的随机值 |
区块头中的数据分成三不同的意义:
- 区块元数据
- 打包相关元数据
- 交易树据根
1.区块元数据
- 父哈希(前一个块)
- 版本号
即前区块的上一个区块,就是父区块(前一个块)的哈希值,父哈希值用来将该区块与它的前一区块相连接;
2.打包相关元数据
- 难度
- 时间戳
- Nonce(随机数)
3.交易树据根
这个根在区块头中就是根哈希值,即区块体中的默克尔树的根。
区块体
区块体包括当前区块经过验证的、 区块创建过程中生成的所有交易记录。这些记录通过默克尔(Merkle)树的哈希过程生成唯一的默克尔,根并记入区块头。
区块体,包含交易数据。
比特币中的交易比较简单,就是转账,A -> B 转账,这笔交易从比特币客户端发起后,就会进行广播。
比特币的节点收到交易后,会将交易存储到交易队列当中,直到进行打包时才会将交易队列中的交易,打包其实是构建一个数据结构,包括:
默克尔树
当前区块的交易集合而生成的一颗树,目的是通过每一笔交易,从下往上生成一树哈希树。
自下往上看:
区块链
就是字面意思,由一个个区块组成的链条。
创世块:比特币网络中的第一个块。几乎所有的区块链服务,都有创有块。
学习区块链,就必须了解区块的本质,区块链的是由一个一个区块组成的链条。
区块链是逻辑上的链条,每一个区块之间通过确认父哈希的形式,来确定自己的父块。
那么这样就会产生几个问题?
- 区块链网络中有很多的节点同时产块,该确认谁才是下一个节点?
- 如果 A 先产块,B 后产块,但是 A 的网速有延迟,传输比 B 后到达,其他节点怎么处理 A 的区块?
- 如何保证传输过来的块一定是合法块,不是一个恶意节点广播过来的块 或者 没有被恶意修过过的块?
比特币是如何解决上述这些问题的。
综上,比特币的区块头 和 区块体 是紧密相连的数据结构,缺一不可。
bitcore 区块链钱包
比特币的工具有很多,PC端常用的工具就是比特币钱包。钱包的种类也有不少,可以查看比特币官网,这里用的是 bitcore。
通过命令行窗口,可以执行一些命令来看查看比特币相关的数据。
查看区块信息
getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2