区块头的组成是一个复杂且至关重要的过程。如果说比特币是一个活生生的有机体,那么区块头就是整个机器的心脏。比特币区块链中的“区块”每10分钟就会在区块内移动和结算数百万美元的价值。区块头负责对区块中的资金进行公证,对共识决策进行投票,并最终指导和定义比特币交易的流动和合法性。
版本号为网络软分叉升级提供了手段。前一个区块的哈希值将当前区块与其父区块链接起来,从而在“区块链”中创建一条链。Merkle 根以加密方式将区块中的所有交易与其关联的区块头绑定在一起。时间戳充当可验证的时间戳系统,在比特币之外的许多应用中都很有用。编码的目标难度让矿工知道网络将接受哪些有效区块。最后,nonce 为矿工提供了一个专用的搜索空间来挖掘,推动网络向前发展。
这篇文章旨在提供每个领域的技术概述,旨在成为比特币区块头的技术参考。
介绍
比特币的区块链由区块组成。区块(和交易)是版本化的二进制数据结构。区块由两部分组成:交易区块(区块中的所有交易都完整地存储在其中)和区块头。区块头是一个简短且格式严格的数据字段,位于每个区块的前面。它包含六个字段,每个字段的功能各不相同,这些字段的 SHA256d 哈希值用作区块的标识符。区块头是本文的重点,我们将继续深入探讨它,但首先让我们简单介绍一下交易区块。
当网络参与者向网络提交新交易时,该交易会被添加到所有其他未确认交易的列表中。此列表称为内存池。矿工是网络参与者,负责从内存池中选择未确认的交易,并将其包含在下一个区块中。下一个区块称为候选区块。矿工负责构建有效区块。有效区块是指区块头哈希值小于或等于比特币网络设定的数字(称为目标 )的区块。
矿工会执行大量哈希运算,以寻找符合目标要求的有效区块哈希值。为了从相同的区块数据创建新的哈希值,区块头中有一个字段称为nonce字段,矿工可以快速更改该字段,以便在查找有效区块的过程中生成唯一的哈希值。正如后面将要讨论的,nonce 字段仅提供四个字节(2³² 位)可供更改。因此,搜索空间为 2³² 位,这意味着如果除了 nonce 值之外没有其他更改,则最多4,294,967,296可以为区块生成唯一的哈希值。虽然这看起来似乎有足够的搜索空间,但考虑到目前可用的比特币 ASIC 硬件,这个搜索空间实际上相当小。例如,比特大陆的 Antminer S19 Pro ASIC 矿机的运行速度为110 Th/s,即每秒约 2⁴⁶ 次哈希运算。因此,这台机器在不到一毫秒的时间内就完全耗尽了 nonce 字段提供的搜索空间。
一旦搜索空间耗尽,矿工必须从一组新的交易中创建一个新的区块。构建这个新区块的计算成本和带宽都非常高。因此,矿工有动力去寻找方法,在专用的四字节随机数之外扩展搜索空间。扩展搜索空间的方法有很多种:矿工可以使用 (1) 未使用的版本字段位,(2) 部分时间字段位,以及 (3) coinbase 交易脚本签名中的一些额外位。后者通常被称为 extranonce,尽管它并不是比特币协议中正式定义的字段。
与所有数据一样,交易数据可归结为一系列字节。由于各种资源限制,我们不希望区块包含过多字节或过于“沉重”。最常见的两个限制是 (1) 上行链路相关(带宽/延迟)和 (2) 验证相关(CPU 验证交易的速度)。由于存储成本已相当低廉且节点可以进行修剪,因此与存储相关的限制现在已不再是大问题。但是,较大的区块可能会阻止空间受限的用户运行完整节点,从而破坏网络去中心化。此外,如果没有区块大小限制,网络将容易受到恶意行为者向网络发送低价值交易的 DDoS 攻击。为了解决这些问题,共识机制对区块大小限制设置了一个上限,称为区块权重。
是什么促使矿工挖矿?他们有两个收入来源:区块补贴(下文将讨论)和交易费。对于矿工来说,最大化交易费利润需要一种微妙的平衡:尽可能多地将交易打包到候选区块中,同时将区块大小保持在 4MB 以下。这类问题类似于背包问题,本文作者认为,交易选择是一个引人入胜的问题,但并非光鲜亮丽。
有一种特殊类型的交易,称为coinbase 交易,与区块头的讨论相关。coinbase 交易是每个区块的首笔交易,负责铸造新的比特币(区块补贴)并支付矿工奖励。如前所述,coinbase 交易中的可延展位可以用来增加矿工的搜索空间。
区块头
现在我们来讨论一下比特币区块头。区块头大小为 80 字节,包含六个不同的数据字段,每个字段都采用小端格式。
为了能够解析和理解区块头和交易内容,有必要了解二进制数、十六进制数和字节序。为了解释这些内容,我们将在下一节中简要介绍。如果读者已经熟悉这些概念,则可以跳过本节。
相关数字系统和字节序
二进制、十进制和十六进制数系统
整数通常用十进制表示,通常称为十进制。然而,它们也可以用任何其他进制等效地表示。另外两个有助于理解这些底层比特币概念的进制是二进制(基数为 2)和十六进制(基数为 16)。将基数从 10 更改为 2 或 16(或任何数字)不会改变整数的值,只会改变其表示方式。
二进制数以 2 为基数,因此只需两个值即可表示所有整数。这两个值是 0 和 1。例如,考虑 u8 类型的数字(每个数字长度为 8 位):

十进制和二进制比较
请注意,与十进制数相比,二进制数要冗长得多。
通常在b二进制数前添加字符“ ”。例如,十进制数 4 的二进制等价形式写为b0100。
你可能想知道,例如,为什么要用四位数字来表示二进制数b0000 0001,而不是b1?这是因为在计算机内存中,必须提前选择整数所需的位数。因此,如果整数必须表示不超过 的任何数字b1111 1111,那么在内存中,该整数必须始终占用八位数字,即使它并非始终使用所有数字。
在二进制数的每四个零之间放置一个可选空格使其更易于阅读,但没有其他意义。
十六进制数以 16 为基数,因此需要 16 个值来表示所有数字。这些值分别是 0 到 9 以及 A 到 F。

十进制和十六进制比较
请注意,在这种情况下,十进制系统比十六进制系统更详细。
通常在0x十六进制数前添加字符“ ”。例如,3,735,928,559十进制数的十六进制表示为0xDEADBEEF。
另外,请注意,0xDEADBEEF是一个四字节数字。每两个字符相当于一个字节:0xDE是一个字节,0xAD是一个字节,依此类推。
为了完整起见,十进制数的3,735,928,559二进制等价物是b1101 1110 1010 1101 1011 1110 1110 1111。
小端与大端
为了让大家更容易理解字节序的概念,在英语中我们说“23”,但在德语中他们说“3 and 20”。这是相同的数字,只是表达方式不同。字节序是一个类似的概念,大端首先排列最高有效位,小端首先排列最低有效位。术语“大端”和“小端”引用自乔纳森·斯威夫特的《格列佛游记》 。在故事中,有两组人,大端
和小端。大端组从顶部打破鸡蛋,小端组从底部打破鸡蛋。这种荒谬而微不足道的打破鸡蛋方法差异引发了混乱。
从底层来看,字节序与计算机处理器如何将值加载到其寄存器(内存)有关。也就是说,字节是如何排序的。
在大端格式中,首先读取最高3,735,928,559有效字节。这是我们直观地读取数字的方式。以大端十六进制格式写入的十进制数是0xDEADBEEF,正如人们所期望的那样。在大端格式的系统中,该数字以二进制形式存储在计算机内存中,如下所示(为了清晰起见,也显示了十六进制值):

大端格式的二进制和十六进制数
或者,数字也可以使用小端格式存储在计算机内存中。在小端格式中,数字的最低有效字节会被优先读取。这不符合数字的直观读取方式。
在小端格式的系统中,该数字以二进制形式存储在计算机内存中,如下所示(为清楚起见,也提供了十六进制值):

小端格式的二进制和十六进制数
比较大端和小端格式时,(希望如此)可以清楚地看出,唯一的区别在于字节顺序。在大端格式中, 的十六进制等价值3,735,928,559是0xDEADBEEF。在小端格式中, 的十六进制等价值是 0xefbeadde 。注意字节顺序非常重要,因为小端格式的数字0xEFBEADDE仍然表示十进制数3,735,928,559,而不是十进制数4,022,250,974。
记住,所有这些数字都是等效的,只是表达方式不同。在大多数情况下,系统或程序使用大端还是小端并不重要,重要的是一致性。
比特币(大部分)采用小端格式,牢记这一点很重要。
返回区块头
返回区块头。
以十六进制格式,典型的块头如下所示:

高度为 645,536 的比特币区块头
此区块头来自高度 645,536 的区块,由 Slushpool 挖矿。本文将以此区块头为例进行说明。
下表详细说明了每个字段、其数据类型和简要说明。

区块头数据字段
区块头在挖矿过程中的作用
从高层次来看,挖矿过程可以归结为以下步骤:
1. 选择合适的版本号和当前纪元时间。从网络中检索
最长链上最新区块和目标区块的上一个区块哈希值。
2. 从内存池中选择一定数量的未确认交易,将其包含在候选区块中。
3. 构建coinbase交易。
4. 从 coinbase 交易和选定的交易计算 Merkle 根。
5. 连接这些值以创建阻止消息。
6. 为随机数选择一个数字并将其附加到块消息中,从而创建完整的候选块头。
7. 对区块头执行 SHA256 哈希(两次),并将结果与网络目标进行比较。
8. 如果区块头哈希值小于或等于目标值,则该
区块有效,矿工会将其广播到网络,等待
其他矿工确认。然后,矿工返回步骤 1,开始
挖掘下一个候选区块。
9. 如果区块头哈希不满足目标,则该区块无效,矿工返回步骤 6,增加随机数并再次尝试运气。
这些步骤在下面的流程图中有详细说明。

构建区块头的挖矿流程图
现在已经定义了区块头并表达了它在比特币中扮演的重要角色,接下来可以更详细地探讨每个参数。
版本

高度 645,536 处的区块的版本字段
版本字段通常被视为一个四字节大端数字,解释为类型int32,并包含额外的位,矿工可以使用它来表示对软分叉提案的准备情况以及 2¹⁶ 的额外搜索空间。
对于这样一个不起眼的领域,当涉及到区块的版本号时,却有很多需要解读的地方。版本号为矿工提供了信号,让他们可以发出信号表明自己已准备好进行网络软分叉升级。矿工激活的软分叉提案的成功或失败取决于是否有足够多的区块发出信号表明其已准备好。这里的“准备就绪”是指矿工已更新其软件,使其与包含提议更改的比特币客户端版本兼容。隔离见证软分叉就是一个软分叉提案的例子。
版本字段的最高三位保留用于未来可能的机制升级。目前,必须将最高三位设置为 b001。这意味着大端模式下允许的最小版本号为0x2000000(b0010 0000 0000 0000 0000 0000 0000 0000)。大端模式下允许的最大版本号为0x3FFFFFF(b0011 1111 1111 1111 1111 1111 1111 1111)。
在撰写本文时,版本号的行为符合BIP9规范。在深入探讨 BIP9 之前,让我们先来看看自网络诞生以来版本号是如何演变的。
区块头版本字段简史
版本 1 始于2009 年的创世区块。直到 2012 年 9 月,在此期间没有发生任何有意义的信号。
2012年9月,比特币核心v0.7.0引入了BIP34,这使得版本1的区块变得非标准。具体来说,这个BIP做了两件事:
1. 为矿工提供一种结构化的方式来表示他们已准备好接受软分叉提案。这通过双阈值切换机制(也称为)实现IsSuperMajority(),该机制包含两个阈值,分别称为 75% 规则和 95% 规则。75% 规则规定,一旦最近 1,000 个区块中有 750 个区块通过将版本设置为 2 或更高版本来表示已准备好,则任何在区块头中指定版本 2 的新区块都必须符合软分叉提案规范。否则,即使该区块符合版本 1 的标准,也会被网络拒绝。此后,95% 规则规定,一旦最近 1,000 个区块中有 950 个区块的版本为 2 或更高版本,则所有版本 1 区块都将被拒绝。
2. 指定实际的软分叉提案,要求所有版本 2 或更高版本的区块将区块高度作为 coinbase 交易脚本签名中的第一项。
大约花了六个月的时间,版本 2 区块才成为标准,最后一个版本 1区块的高度为 227,835,时间戳为 2013-03-24 15:49:13 GMT。
定义版本 3 的软分叉提案在BIP66中指定,并于 2015 年 2 月在Bitcoin Core v0.10.0中引入。版本 3 区块将签名限制为严格的 DER 编码。其就绪信号表示方法遵循 BIP34。
定义版本 4 的软分叉提案在BIP65中指定,并于 2015 年 11 月在比特币核心 v0.11.2中引入。版本 4 的区块识别了比特币脚本系统的新操作码,OP_CHECKLOCKTIMEVERIFY该操作码允许 UTXO 在一定时间内无法使用。
虽然 BIP34 中指定的 IsSuperMajority() 信号方法有效,但它也存在一些问题。具体来说,(1) 缺乏超时机制;(2) 使用整数值而非比特位进行信号传递(下文将进一步解释)。BIP9 解决了这两个问题。
BIP9 版本字段改进
BIP9 定义了当前使用的版本号行为。它要求每个软分叉提案包含四个参数:
1. 一个可区别的名称。
2. 版本字段中的某个位,翻转后表示矿工已准备就绪。该位的位置编号用 N 表示。
3. 指定所选位何时获得其意义的开始时间。
4. 超时,如果提案在 X 日期之前尚未锁定,则视为失败。
通过翻转版本字段中的单个位而不是将字段设置为特定的整数(如在 BIP34 中),可以同时激活多个提案。
Rusty Russell 的博客文章“BIP9:Versionbits 简明解读”出色地解释了版本字段的发展和重要性。我们将以此为基础,继续深入探讨版本字段。首先,让我们来详细了解一下 BIP9 中规定的位翻转机制。
典型的大端版本号的完整 32 位二进制0x20000000表示形式为
<span style="background-color:#f2f2f2"><span style="color:#242424">b0010 0000 0000 0000 0000 0000 0000 0000</span></span>
这遵循 BIP9 中设置的规则,即最高位必须等于b001或大于。
在您的收件箱中获取RJ Rybarczyk的故事
免费加入 Medium 以获取该作者的最新消息。
现在,假设有一个名为 BIPN₀ 的新软分叉提案,它将就绪位位置设置为 0(N = 0),要求矿工将 0ᵗʰ 位设置为 1,以表示就绪状态。那么,大端字节序的版本号将是0x20000001,或者
<span style="background-color:#f2f2f2"><span style="color:#242424">b0010 0000 0000 0000 0000 0000 0000 000 <strong>1</strong></span></span>
该矿工现已表示已为 BIPN₀ 做好准备。
现在,假设同时有两个额外的软分叉提案处于活动状态。BIPN₁(N = 1)和 BIPN₂(N = 2)。也许这个矿工只准备好了 BIPN₀ 和 BIPN₂,而不是 BIPN₁。在 BIP9 机制下,这不是问题。矿工会通过将 0ᵗʰ 和 2ⁿᵈ 位设置为 1,并将 1ˢᵗ 位保留为 0,来表示只准备好了 BIPN₀ 和 BIPN₂。那么,大端字节序的版本号将是0x20000005,或者
<span style="background-color:#f2f2f2"><span style="color:#242424">b0010 0000 0000 0000 0000 0000 0000 0 <strong>101</strong></span></span>
能够在任何给定时间激活多个软分叉提案的能力使得该机制优于 BIP34 使用整数值。
矿工可以并且确实会使用版本字段来获得额外的搜索空间。这被称为通过版本滚动进行公开 ASIC 提升。在 BIP9 推出后,矿工最初仍在使用所有版本位来执行公开 ASIC 提升。然而,这导致节点生成警告,因为它们试图将这些位解读为不存在的软分叉提案的信号。BIP320解决了这个问题,它指定 16 位用于公开 ASIC 提升,并留出 13 位用于软分叉提案信号。这为矿工提供了 2¹⁶ 的搜索空间,并为 13 个同时进行的软分叉提案留出了空间。
前一个区块哈希

高度 645,536 的区块的上一个哈希字段
前一个区块哈希字段是一个小端格式的 32 字节值,被解释为char[32]前一个区块的哈希值。该字段提供了网络中当前区块与前一个区块之间的链接。
默克尔根

高度 645,536 的区块的 Merkle Root 字段
Merkle 根字段是一个小端格式的 32 字节值,被解释为 type char[32]。Merkle 树结构在计算机科学领域有着广泛的应用。在比特币中,Merkle 树用于以简洁的 32 字节长度将交易区块中的每笔交易以密码学的方式与区块头绑定。
每笔交易都是 Merkle 树的一片叶子。交易必须按拓扑顺序排列。这意味着,当交易ₙ₊₁ 花费一笔交易ₙ的输出时,交易ₙ₊₁ 必须排在区块中比交易ₙ 更靠后的位置。Merkle 树的第一个叶子,即 tx₀,是为 coinbase 交易保留的。
寻找 Merkle 根
一旦矿工选择了要包含在候选区块中的交易
,就会执行以下步骤来导出 Merkle 根:
1. 将每个交易 ID(交易的 SHA256d 哈希值)以两两为一组的方式连接在一起。
2. 连接后的交易对通过 SHA256d 哈希算法进行哈希处理。该哈希值的摘要将成为树中的新分支。
3. 同样,将两个摘要成对连接在一起,并通过 SHA256d 算法进行散列,从而在树中生成一个新的分支。
重复步骤 3,直到只剩下一个哈希值,即 Merkle 根哈希值,它是存储在区块头中的值。

任意数据集的默克尔化
时间

高度 645,536 的区块时间字段
时间字段是一个小端格式的四字节值,被解释为uint32当前区块的时间戳。时间戳的作用是为网络提供确定区块确认速度的方法,以便每 2,016 个区块(约两周)调整一次难度。共识规则将可接受的时间戳值范围限制在大约三小时的窗口内,从而留下 2¹³ 位可用于额外的搜索空间。
有效时间戳必须大于前 11 个区块的中位时间戳。以每区块 10 分钟的确认率计算,有效时间戳距离候选区块提交时间应为 1 小时。此外,有效时间戳还必须小于网络调整时间加上 2 小时。这个 3 小时的窗口长度为 10,800 秒,从而产生了 2¹³ 位的额外搜索空间,即
<span style="background-color:#f2f2f2"><span style="color:#242424">2ˣ = 10,800x = ln(10,800) / ln(2)x = 13.3987 => 13</span></span>
网络调整时间等于节点本地 UTC 加上所有连接节点的中位偏移量。网络时间与本地系统时间的误差不会超过 70 分钟。
在健康的去中心化网络的区块头中包含时间戳字段的一个意想不到但有用的结果是,比特币区块链可以用作有效的时间戳工具。
位

高度 645,536 处的区块位字段
位字段是一个小端格式的四字节值,被解释为int32一个紧凑的四字节字段,用于编码当前目标阈值。生成的区块哈希值必须低于目标值,才能被网络视为有效解决方案。目标值每 2,016 个区块(大约两周)更新一次,因此在 2,016 个区块周期内提交的每个区块头都将具有相同的目标值。
众所周知,要计算区块哈希值,需要将区块头数据字段(版本、前一个区块哈希、Merkle 根、目标、时间和随机数)全部连接起来,并通过 SHA256d 哈希运算进行哈希运算。生成的哈希值即为候选区块的区块头哈希值,并作为该区块的唯一标识符。为了确保哈希值有效,该哈希值必须小于或等于当前网络目标值,该目标值反映了矿工挖出有效区块的难易程度。如果没有目标值,创建有效区块将变得轻而易举,网络将崩溃。
SHA256d 哈希函数生成的最大目标值为 ,
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF以十进制表示,26,959,946,667,150,639,794,667,015,087,019,630,673,637,144,422,540,572,481,103,610,249,215。这是一个非常大的数字。比特币将目标值存储为浮点类型,因此使用的截断形式为0x00000000FFFF0000000000000000000000000000000000000000000000000000,以十进制表示,26,959,535,291,011,309,493,156,476,344,723,991,336,010,898,738,574,164,086,137,773,096,960。这仍然是一个巨大的数字。
为了将这个大数字放入四字节空间,它采用了一种紧凑的格式。这种格式牺牲了字节空间的粒度。以下步骤详细说明了如何从位值中检索目标。
1. 将区块头中的字节序从小端格式转换为大端格式。0x2F931D1A → 0x1A1D932F最终,只要一切保持一致,使用哪种字节序并不重要。
2. 将第一个字节0x1A和剩余字节分开0x1D932F。第一个字节称为尾数(也称为有效数字)。尾数是浮点数的一部分,表示有效数字的位数。然后将其乘以底数(在本例中为 2),并进行指数运算,得出该数的数值。
因此,通过以下方式从位字段中提取目标阈值:
<span style="background-color:#f2f2f2"><span style="color:#242424">目标 = 尾数 × 基数⁽ᴱˣᵖᵒⁿᵉⁿᵗ ⁻ ᴸᵉⁿᵍᵗʰ ᵒᶠ ᴹᵃⁿᵗᶦˢˢᵃ⁾</span></span>
利用该方程,可以得出该块的目标阈值:
<span style="background-color:#f2f2f2"><span style="color:#242424">目标 = 0x1D932F × 2⁽⁸ˣ⁽⁰ˣ¹ᴬ ⁻ ³⁾⁾= 0x1D932F × 2⁽⁸ ˣ ⁽²⁷ ⁻ ³⁾⁾= 0x1D932F0000000000000000000000000000000000000000000000</span></span>
请注意,在上面的等式中,指数与尾数长度之差乘以了 8。这是一个略微简化的方法,利用了每个字节有 8 位的特性。因此,我们不必将每个参数都以二进制形式写出(那样会更加冗长),而是取每个字节的完整值。
3. 现在可以将步骤 2 的结果与区块头哈希进行比较。如果区块头哈希等于或低于目标阈值,则满足比特币共识规则,可以在链上确认。
<span style="background-color:#f2f2f2"><span style="color:#242424">0x0000000000001D932F0000000000000000000000000000000000000000000000000000000000
0x00000000000016BF116FC90CF45AEC2DA4D13349358159D8B4EDDCB37EAB295B</span></span>
将这些数字以 10 为基数的等价形式写出如下形式:
<span style="background-color:#f2f2f2"><span style="color:#242424">47525089675259291211422247200069659468817014361857087365971968
36551990950853533658225321687497789580066641734434828845787483</span></span>
因此,由于标头哈希值小于目标,所以这是一个有效的标头。
让我们更深入地探讨一下为什么选择这个公式以及它是如何工作的。该格式本身源自IEEE 754浮点运算标准,该标准详细说明了计算机如何存储浮点数。
考虑一个包含数字 11 的 16 位寄存器:
<span style="background-color:#f2f2f2"><span style="color:#242424">b0000 0000 0000 1011</span></span>
16 位寄存器只能容纳 16 位,你猜对了。如果我们将位移动可用位数(16),就会发生溢出,丢失数字 11:
<span style="background-color:#f2f2f2"><span style="color:#242424">丢失的比特 | 剩余的比特 1011 | 0000 0000 0000 0000</span></span>
为了防止这种情况发生,我们规定只能移动可用位数减去我们希望保留的位数。在这种情况下,16 – 4 = 12,这将得到
<span style="background-color:#f2f2f2"><span style="color:#242424">丢失的比特 | 剩余的比特 |1011 0000 0000 0000</span></span>
因此,这就是为什么我们在计算目标时从指数中减去字节数的原因:为了防止指数导致溢出的边缘情况,并且我们会丢失尾数的有效数字。
随机数

高度 645,536 的区块的 Nonce 字段
nonce 字段是一个小端格式的四字节值,被解释为 type int32,该值会递增,用于创建当前区块的新哈希值,以找到符合当前目标的哈希值。它提供 2³² 位的搜索空间。
nonce参数在查找有效区块时起着至关重要的作用。如果没有 nonce,每当矿工构建一个不符合网络难度的区块时,他们都必须修改交易集、重新计算 Merkle 根、重建区块头并重新哈希。这需要大量的计算工作。nonce 使得矿工只需构建一次候选区块头,除 nonce 外,其他所有变量保持不变。矿工将增加 nonce,然后重新哈希区块,直到 (1) 区块头哈希满足难度目标(矿工找到了有效的区块头);(2) 区块变得陈旧(竞争矿工找到了有效的区块头);或者 (3) 用尽
nonce 搜索空间。
Coinbase 交易
Coinbase 交易是每个比特币区块中一种特殊的交易类型——唯一一种不指向现有 UTXO 的交易,而是根据比特币协议货币政策铸造新的比特币。
coinbase 交易之所以重要,主要有三个原因:(1)它
负责铸造新的 UTXO,(2)它为矿工提供额外的搜索空间,(3)它为矿工提供将区块标记为自己的方法。
区块 645,536 的 coinbase 交易如下:

Coinbase 区块高度 645,536 的交易
下表详细说明了每个字段、其数据类型和简要描述。

交易数据字段
就本文的目的而言,脚本签名是重要的领域,因为它是矿工获得额外搜索空间的地方,也是矿工可以输入其标识符的地方。
脚本签名(解锁脚本)

高度 645,536 区块的 Coinbase 交易中的脚本签名
脚本签名,也称为解锁脚本,其字节长度可变,由共识机制设定上限。通常,解锁脚本包含允许消耗前一笔交易的 UTXO 的条件。然而,在 coinbase 交易中,不会消耗任何 UTXO,只会生成新的 UTXO。脚本签名包含区块高度(由 BIP34 指定)以及矿工选择在此处写入的任何其他信息。通常情况下,这些信息包括任何 extranonce 参数以及矿工可能选择添加的任何识别性“签名”。
extranonce 参数并非比特币协议定义的严格字段,而是矿工可选用来增加搜索空间的一些位。许多矿池支持 extranonce 参数,并对其长度进行了限制。通常情况下,extranonce 的长度为 8 字节。
分解脚本签名,前1-9个字节表示解锁脚本的长度,该长度是可变的。在本例中,长度为0x4B(十进制75)字节。
下一个字节表示 coinbase 交易下一部分的长度。在本例中,它是0x03,这表明接下来的三个字节0xA0D909是有意义的。这些字节是区块高度 645,536 的小端十六进制格式,符合 BIP34 标准。接下来的 64 个字节包含 extranonce 参数以及矿工选择放入其中的任何其他信息。extranonce 参数的大小通常因矿池而异。
最后,最后七个字节0x2F736C7573682F是 Slushpool 用于其区块的可选标识符/slush/。通过提供此标识符,Slush 向公众表明该区块来自他们的矿池。
当然,任何实体都可以将相同的文本放入 coinbase 交易中,并冒充 Slushpool(或任何其他矿工)。反过来,Slush(或任何其他矿工)也可以从 coinbase 脚本签名中排除其典型标识符,并匿名挖矿。
任何矿工都可以选择在他们设计的字符中添加此标识符。大多数矿工通常会输入自己的名字来表明他们正在挖矿(从市场营销的角度来看,这很有意义,可以展示你的矿池有多成功),但矿工可以输入任何他们想要的内容,也可以将其留空。为了了解有多少矿工在 Coinbase 交易的脚本签名中包含标识符,我们进行了一项调查,从 2020 年 9 月 25 日到 2020 年 9 月 28 日的四天时间跨度内,77.7% 的区块都包含标识符。
结论
理解区块头对于理解挖矿和比特币整体而言至关重要。区块头在比特币协议中扮演着许多重要的角色,它的六个字段共同构成了网络的骨干。
区块头是区块中所有交易通过 Merkle 根链接在一起的途径,并进一步将该区块与其父区块(通过前一个区块的哈希值)链接起来,从而创建区块链。矿工使用版本号来支持协议升级并发出就绪信号。编码的目标难度让矿工知道网络将接受哪些有效哈希值,而 nonce 则为他们提供了专用的有效哈希搜索空间。
区块头极其简洁,却又蕴含着丰富的应用和用例。虽然其格式已沿用十余年,但它仍然足够灵活,能够适应网络的变化和发展。字段的运作方式可以而且确实在不断改进,例如版本字段定义的软分叉升级机制。字段的使用方式也在发生变化,例如矿工可以使用非传统字段,通过版本、时间戳和coinbase交易来容纳更多搜索空间。比特币开发者和用户在利用区块头及其相关字段实现更多功能和赋能新用例方面所展现出的创造力令人惊叹,我们迫不及待地想看到未来十年的创新将为我们带来什么。但无论如何,我们确信区块头将成为这个美好系统的支柱。

104

被折叠的 条评论
为什么被折叠?



