区块结构
区块链开发之前,先了解比特币的区块结构,有利于了解后续比特币的各种数据结构的做用。
本文要介结几个重要概念:
- 区块结构
- 区块头
- 区块体
- 区块查看工具
区块
区块是比特币的核心。 当前比特币网络,每10分产一个块。 区块的作用: 比特币最核心的数据结构,包含了交易的重要标识,包括:区块头、区块体、区块大小等数据。
一个完整的区块结构
数据项 | 字节 | 字段 | 说明 |
---|---|---|---|
Magic NO | 4 | 魔数 | 常数0xD9B4BEF9 |
Blocksize | 4 | 区块大小 | 用字节表示的该字段之后的区块大小 |
Blockheader | 80 | 区块头 | 组成区块头的几个字段 |
Transaction counter | 1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 |
Transactions | 不定 | 交易 | 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致 |
这里最典型的要数 区块头和 区块体 了,因为它们通常在学习区块链的时候,比较能说明区块链的重要特性。
另外区块链不看不见摸不着的东西,人往往需要可视化的模型会更有助于理解抽象的概念。
这里介绍一个工具,区块链浏览器: https://blockchain.info/
通过这个浏览器,可以查看区块内的信息。 为什么这个站点可以查看区块信息? 因为区块链的服务,也就是个服务,提供了查询接口,机构或个人,只需要运行区块链服务,在本地运行就可以访问区块链信息,前提是要同步好区块数据。 之前的文章就强调过,鼓励大家运行区块链服务是区块链的特点,币是奖励,算是一种副产物,是被金融机构炒起来的。
区块头
查看区块信息
代码语言:javascript复制getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2
{
"hash": "00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2",
"confirmations": 30,
"strippedsize": 884103,
"size": 1345977,
"weight": 3998286,
"height": 681181,
"version": 536870912,
"versionHex": "20000000",
"merkleroot": "574dfd1961a53bb1fd307d7345b2aff6a196cce29a824b9029d454e1f61cfb35",
"tx": [
"1a44cb6551af919652eac49d953c50ab2acb1ebdfe7d2b20ed3c1944bd37ac96",
"3e06d35f7f550068a72991d62dd32281a13e1492867b1c8531a4aa12f591cff8",
"9d66b3a4b6b683aa4d03d8186d31d33e41e73bd96692cbf33a152b99100b326a",
"ae6fdde3a16e91d587a5d3c1500d5828a01e69c02b6832cde132111fd90c4760",
"91a5aa20c0582695a90cfdf4dab5540406c9b78fba4a20f6cd6cb96445d31be5",
"471ce26f56eb1c164315704b923a1095145256c0e43a77ccd72254265c950b0f",
"fb56a184da1cff5e8c0cc65c13392c68517713754338f87047bef07c1a43b032",
"8be8b938eff96313ee9e61c287fdffea2779c0537d2f0ccd7fc1e973693fd12b",
"d12faee60ec1f46f2bdd6a490b1c92c2e804955786a014b56d8fb9e6d2a35eef",
"819f0fb4a16a3f88079bf35f6f03c0b032879a75f56b412baedfe525e19708f4",
"dcc9e980cd345e9a6e136d76a4cd36a36bb7e3217b3685ad9ca577acc8019bf8",
"6a1a122610ff86d6037d46e57c49183960bcefad04ea233a387fc3d8a0db997b",
"23dab800d04d100b2748b2addec5237b75ad6da992de80984f95d8decd546859"
//省略部份交易
],
"time": 1619758979,
"mediantime": 1619755004,
"nonce": 32721792,
"bits": "170bef93",
"difficulty": 23581981443663.85,
"chainwork": "00000000000000000000000000000000000000001cb2cd894a35651ba07be168",
"nTx": 2158,
"previousblockhash": "00000000000000000004cabf7ba2626c0da40182c19324ea12c13b2aac8ade98",
"nextblockhash": "000000000000000000058960a47748b02e4b659ba529a0e9c6fb9e1991158f6f"
}
包含以下数据:
字节长度 | 字段 | 说明 |
---|---|---|
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