bitcoin-03-比特币区块结构

2023-10-23 08:45:24 浏览数 (1)

区块结构

区块链开发之前,先了解比特币的区块结构,有利于了解后续比特币的各种数据结构的做用。

本文要介结几个重要概念:

  1. 区块结构
  2. 区块头
  3. 区块体
  4. 区块查看工具

区块

区块是比特币的核心。 当前比特币网络,每10分产一个块。 区块的作用: 比特币最核心的数据结构,包含了交易的重要标识,包括:区块头、区块体、区块大小等数据。

一个完整的区块结构

数据项

字节

字段

说明

Magic NO

4

魔数

常数0xD9B4BEF9

Blocksize

4

区块大小

用字节表示的该字段之后的区块大小

Blockheader

80

区块头

组成区块头的几个字段

Transaction counter

1-9

交易计数器

该区块包含的交易数量,包含coinbase交易

Transactions

不定

交易

记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致

这里最典型的要数 区块头区块体 了,因为它们通常在学习区块链的时候,比较能说明区块链的重要特性。

另外区块链不看不见摸不着的东西,人往往需要可视化的模型会更有助于理解抽象的概念。

这里介绍一个工具,区块链浏览器: https://blockchain.info/

通过这个浏览器,可以查看区块内的信息。 为什么这个站点可以查看区块信息? 因为区块链的服务,也就是个服务,提供了查询接口,机构或个人,只需要运行区块链服务,在本地运行就可以访问区块链信息,前提是要同步好区块数据。 之前的文章就强调过,鼓励大家运行区块链服务是区块链的特点,币是奖励,算是一种副产物,是被金融机构炒起来的。

区块头

查看区块信息

getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2

代码语言:javascript复制
{
  "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. 打包相关元数据
  3. 交易树据根
1.区块元数据
  1. 父哈希(前一个块)
  2. 版本号 即前区块的上一个区块,就是父区块(前一个块)的哈希值,父哈希值用来将该区块与它的前一区块相连接;
2.打包相关元数据
  1. 难度
  2. 时间戳
  3. Nonce(随机数)
3.交易树据根

这个根在区块头中就是根哈希值,即区块体中的默克尔树的根。

区块体

区块体包括当前区块经过验证的、 区块创建过程中生成的所有交易记录。这些记录通过默克尔(Merkle)树的哈希过程生成唯一的默克尔,根并记入区块头。 区块体,包含交易数据。 比特币中的交易比较简单,就是转账,A -> B 转账,这笔交易从比特币客户端发起后,就会进行广播。 比特币的节点收到交易后,会将交易存储到交易队列当中,直到进行打包时才会将交易队列中的交易,打包其实是构建一个数据结构,包括:

默克尔树 当前区块的交易集合而生成的一颗树,目的是通过每一笔交易,从下往上生成一树哈希树。 自下往上看:

区块链

就是字面意思,由一个个区块组成的链条。 创世块:比特币网络中的第一个块。几乎所有的区块链服务,都有创有块。 学习区块链,就必须了解区块的本质,区块链的是由一个一个区块组成的链条。

区块链是逻辑上的链条,每一个区块之间通过确认父哈希的形式,来确定自己的父块。

那么这样就会产生几个问题?

  1. 区块链网络中有很多的节点同时产块,该确认谁才是下一个节点?
  2. 如果 A 先产块,B 后产块,但是 A 的网速有延迟,传输比 B 后到达,其他节点怎么处理 A 的区块?
  3. 如何保证传输过来的块一定是合法块,不是一个恶意节点广播过来的块 或者 没有被恶意修过过的块?

比特币是如何解决上述这些问题的。

综上,比特币的区块头 和 区块体 是紧密相连的数据结构,缺一不可。

bitcore 区块链钱包

比特币的工具有很多,PC端常用的工具就是比特币钱包。钱包的种类也有不少,可以查看比特币官网,这里用的是 bitcore。 通过命令行窗口,可以执行一些命令来看查看比特币相关的数据。 查看区块信息

getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2

0 人点赞