第 4 讲:BTC 协议(三):PoW 共识、分叉与挖矿奖励

来源依据:课程文字稿《04-BTC-协议3》;笔记结构与写作规范参考《00笔记生成指南》

第 4 讲:BTC 协议(三)——PoW 共识、分叉与挖矿奖励

1. 本节主线

  1. 比特币不是按“账户数量”投票,而是按计算力投票。
  2. 节点通过不断尝试 nonce 来求解 computational puzzle,从而争夺记账权。
  3. 一个区块即使交易和区块头本身都合法,也不一定会被接受;它还必须扩展在最长合法链上。
  4. 分叉可能来自攻击,也可能来自两个矿工几乎同时挖出区块。
  5. 出块奖励和 coinbase transaction 是比特币发行新币的唯一方式,也是矿工参与挖矿的重要激励。
  6. 比特币共识要达成的不是“谁说了算”,而是所有诚实节点对去中心化账本内容达成一致。

2. 核心概念速览

概念 简要理解 在本节中的作用
记账权 向比特币账本写入下一个区块的权利 只有成功挖矿的节点才能发布新区块
nonce 区块头中的随机数字段 矿工不断尝试不同 nonce,寻找满足难度要求的哈希
computational puzzle 需要大量尝试才能解出的计算难题 用来让记账权与算力挂钩
block header 区块头,包含前一区块哈希、Merkle root、noncenBits 等信息 节点验证区块合法性时首先检查它
nBits 目标阈值的压缩编码 表示当前挖矿难度对应的目标范围
最长合法链 被诚实节点接受并继续扩展的最长有效分支 决定哪个分叉成为主链
forking attack 通过在链中间插入分叉来试图回滚已有交易的攻击 说明“区块内容合法”不等于“应该被接受”
临时性分叉 两个矿工几乎同时挖出区块导致的等长分叉 正常情况下可能出现,最终由最长合法链规则解决
implicit consent 隐式认可 节点继续沿某个区块扩展,就表示认可该区块
orphan block 被主链抛弃的分叉区块 其中的出块奖励通常无法真正使用
出块奖励 成功挖出区块后获得的新发行 BTC 激励矿工消耗算力争夺记账权
coinbase transaction 铸币交易 比特币系统中新币发行的唯一方式
hash rate 单位时间内尝试哈希计算的能力 决定节点获得记账权的概率权重
Sybil attack 女巫攻击,即创建大量虚假身份操纵投票 PoW 通过“按算力投票”削弱虚假身份的作用
挖矿(mining 通过求解 PoW 难题争夺记账权 是比特币共识机制的核心过程

3. 知识结构图

这张图说明:比特币共识机制围绕两个问题展开。第一,谁有资格写账本?答案是成功求解 PoW 难题的矿工。第二,写出来的账本如何被全网接受?答案是新区块不仅要内容合法,还要扩展在最长合法链上。

4. 课程内容详解

4.1 比特币不是按账户投票,而是按算力投票

在去中心化系统中,一个核心问题是:如果没有中心服务器,谁来决定账本的下一页写什么?

直观想法是“投票”。但如果按账户数投票,就会遇到 Sybil attack:攻击者可以低成本创建大量账户,让自己看起来拥有很多投票权。

比特币的解决方法是:不按账户数量投票,而按计算力投票。

也就是说,一个节点能获得多少“话语权”,不取决于它创建了多少个账号,而取决于它每秒能尝试多少次哈希计算。这个能力称为 hash rate

如果某个节点的算力是另一个节点的 10 倍,那么它成功获得记账权的概率也大约是后者的 10 倍。

这里的关键思想是:

身份可以低成本复制,但算力不能低成本复制。

所以,PoW 机制用物理计算资源取代了虚拟身份数量,降低了女巫攻击的威胁。

4.2 记账权如何获得:尝试 nonce

每个节点都可以在本地组装一个候选区块,把自己认为合法的交易放入 block body 中,然后构造对应的 block header

block header 中有一个字段叫 nonce。矿工会不断尝试不同的 nonce,计算整个区块头的哈希值,看它是否满足协议规定的目标阈值:

1
Hash(block header) <= target

其中:

  • Hash(block header) 是区块头的哈希结果;
  • target 是当前难度对应的目标阈值;
  • nBits 是这个目标阈值在区块头中的压缩编码。

如果某个节点找到了合适的 nonce,使得区块头哈希小于等于目标阈值,那么它就获得了记账权,可以向网络发布这个新区块。

4.3 其他节点如何验证新区块

矿工发布新区块后,其他节点不会盲目接受,而是要验证它。

验证主要包括三层:

  1. 验证区块头是否符合要求

    • nBits 是否符合当前协议难度;
    • nonce 是否真的让区块头哈希满足目标阈值;
    • 前一区块哈希是否正确指向某个已有区块。
  2. 验证区块体中的交易是否合法

    • 每笔交易是否有合法签名;
    • 输入的币是否以前没有被花过;
    • 是否存在 double spending。
  3. 验证它是否应该被接入主链

    • 即使区块头和交易都合法,也要看它是不是扩展最长合法链。

第三点是本节非常重要的地方:
区块内容合法,不等于这个区块一定会被诚实节点接受。

4.4 为什么“合法区块”也可能不被接受

假设有一个新区块,它的区块头合法,里面的交易也都合法。但是它不是接在当前最长链末尾,而是插入到了链中间的某个位置,形成了一个分叉。

这时它可能试图回滚已经发生的交易。

例如:

  1. 主链上已经记录了 A -> B 的转账;
  2. 攻击者又在较早位置分出一条支链;
  3. 在这条支链上,攻击者把同一笔币转回给自己;
  4. 从这条支链自身来看,这笔交易可能并不构成 double spending;
  5. 但从全局效果看,它试图推翻主链上已经发生的交易。

这就是 forking attack 的基本思想。

所以,比特币节点不仅看交易本身是否合法,还要看新区块是否在扩展当前被认可的最长合法链。

4.5 double spending 的判断依赖所在分支

判断一笔交易是否是 double spending,不是把所有分叉上的所有交易混在一起检查,而是看这笔交易所在的链分支。

具体来说,要检查:

从当前交易所在区块往前追溯,到这笔币的来源之间,这个币有没有在同一条分支上被花过。

如果在当前分支上没有被花过,那么从这个分支内部看,它可以是合法交易。

这就解释了为什么攻击者能构造出一个“局部合法”的分叉:
因为在攻击者自己的分支上,这笔币可能没有被重复花费。

但是,比特币协议不会因为某条分支内部合法就接受它。诚实节点最终接受的是最长合法链。

4.6 正常情况下也会产生分叉

分叉不一定都是攻击。正常情况下,如果两个矿工几乎同时找到合法 nonce,它们都可以发布新区块。

这时网络中会出现两个等长分叉:

  • 一些节点先收到区块 A,于是先接受 A;
  • 另一些节点先收到区块 B,于是先接受 B。

因为网络传播有延迟,不同节点收到消息的顺序可能不同。

在两个分叉等长时,比特币协议默认节点接受自己最早收到的那个区块,并沿着它继续挖矿。

4.7 implicit consent:如何表达“我认可这个区块”

比特币中没有一个中心化投票按钮说“我同意这个区块”。节点对某个区块的认可,是通过行为表达的。

如果一个节点在某个区块后面继续扩展新区块,就表示它认可这个区块。

这叫 implicit consent,即隐式认可。

例如:

1
A -> B -> C

如果矿工在 C 后面继续挖出 D,那么它实际上是在表达:

我认可从 A 到 C 这条链,并愿意在它后面继续写账本。

4.8 临时分叉如何被解决

当两个分叉等长时,它们会暂时并存。之后,哪个分叉先被挖出下一个区块,哪个分叉就变得更长。

例如:

1
2
3
        -> B1
A -----
-> B2 -> C2

B2 分支先得到新区块 C2 后,A -> B2 -> C2 成为最长合法链。诚实节点会切换到这条链上继续扩展。

被抛弃的 B1 就成为 orphan block

这里要注意:
一个分叉能否胜出,与算力有关,也与随机性有关。算力更强的一方更有可能先挖出下一个区块,但不是绝对保证。PoW 本质上仍然有概率性。

4.9 出块奖励:为什么矿工愿意消耗算力

挖矿需要消耗大量计算资源和电力。矿工之所以愿意这样做,是因为成功获得记账权可以获得奖励。

这份奖励主要来自 coinbase transaction

coinbase transaction 是一种特殊交易:

  • 它不需要指明币的来源;
  • 它可以凭空产生一定数量的新 BTC;
  • 它只能由成功挖出区块的矿工写入自己发布的区块中;
  • 它是比特币系统发行新币的唯一方式。

普通交易只是把已有 BTC 从一个账户转移到另一个账户,不会创造新的 BTC。即使用法币购买 BTC,本质上也只是别人把已有 BTC 转给你,并没有产生新币。

4.10 出块奖励减半

课程中提到,比特币刚上线时,每个区块的出块奖励是 50 BTC。协议规定,每经过 210000 个区块,出块奖励减半:

1
50 BTC -> 25 BTC -> 12.5 BTC -> ...

课程这里是在讲比特币协议的发行机制:
随着时间推移,每个区块能新发行的 BTC 数量逐渐减少。

注意:课程中提到的“现在是 12.5 BTC”属于课程录制时的语境。复习本节时,重点不是记某个时间点的当前奖励,而是理解:

比特币通过固定规则控制新币发行,而不是由中心机构临时决定发行多少。

4.11 orphan block 中的奖励为什么通常没用

如果一个矿工在某个分叉上挖出了区块,并在里面写入了 coinbase transaction,但这个分叉最后没有成为最长合法链,那么这个区块就会变成 orphan block

这时,该区块里的出块奖励通常无法真正使用。

原因是:
比特币节点验证交易时,会根据最长合法链来判断账本状态。如果某个奖励只存在于被抛弃的短分叉上,那么大多数诚实节点不会承认这笔奖励。

所以,矿工不只是要挖出合法区块,还希望自己的区块最终留在主链上。

4.12 比特币共识到底在共识什么

比特币共识不是简单地共识“谁是矿工”,也不是共识“谁的账户多”。

它真正要共识的是:

去中心化账本的内容。

换句话说,全网诚实节点最终要对“哪些交易已经发生、哪些 BTC 属于谁”达成一致。

而账本内容由谁写入?

答案是:
成功求解 PoW 难题、获得记账权的节点。

这就是为什么说比特币共识是“按算力投票”:

  • 能否获得记账权,取决于能否找到合法 nonce
  • 找到合法 nonce 的概率,取决于 hash rate
  • hash rate 越高,获得记账权的概率越高;
  • 创建更多账户并不能提高 hash rate

4.13 挖矿的含义

mining 是对比特币争夺记账权过程的形象比喻。

它类似淘金:

  • 搜索空间很大;
  • 找到合法结果的概率很小;
  • 需要不断尝试;
  • 一旦成功,就能获得较高奖励。

在比特币中,矿工不是在物理上挖黄金,而是在哈希空间中寻找满足难度目标的 nonce

所以,“挖到矿”本质上就是:

找到了一个让区块头哈希满足目标阈值的 nonce,从而获得了发布新区块和领取出块奖励的资格。

5. 关键机制图解

5.1 挖矿与区块验证流程

这张图展示了 PoW 共识的完整主干。矿工先通过不断尝试 nonce 来争夺记账权;其他节点收到区块后,要同时验证区块头、交易内容和它是否扩展最长合法链。

5.2 正常分叉与最长合法链选择

这张图说明,正常网络延迟会导致临时性分叉。等长分叉出现后,节点通常先接受自己最早收到的区块。随后,先被继续扩展的分支成为最长合法链,另一条分支被抛弃。

5.3 出块奖励与 coinbase transaction

这张图强调:出块奖励不是只要写进区块就一定有效。只有区块最终处于最长合法链上,其中的 coinbase transaction 才会被诚实节点承认。

6. 易混点与常见误解

易混点 正确理解
“区块里的交易都合法,所以一定会被接受” 不一定。区块还必须扩展最长合法链。插入链中间的合法区块可能是分叉攻击的一部分。
“double spending 是全网所有分叉一起检查” 不是。判断 double spending 时,要看交易所在分支中该币是否被重复花费。
“最长链就是区块数量最多的任意链” 更准确地说,是最长合法链。非法交易、非法区块头的链不会被诚实节点接受。
“分叉一定是攻击” 不一定。两个矿工几乎同时挖出区块,也会导致正常的临时性分叉。
“接受区块就是显式投票同意” 比特币采用 implicit consent。节点继续沿某区块扩展,就表示认可它。
“矿工挖出区块后奖励一定归自己” 不一定。如果区块后来变成 orphan block,其中的奖励通常不会被主链接受。
“创建更多账户可以提高投票权” 在 PoW 中不行。投票权来自 hash rate,不是账户数量。
“挖矿是在挖真实的币” 挖矿是求解哈希难题。新 BTC 通过 coinbase transaction 发行。

7. 课堂外补充理解

7.1 为什么 PoW 可以缓解 Sybil attack

在普通投票系统中,如果没有身份认证,一个人可以创建大量虚假身份,从而操纵投票结果。

但是在 PoW 中,投票权不是身份数量,而是算力。

假设攻击者有一台机器:

  • 创建 1 个账户,机器每秒能算 100 次哈希;
  • 创建 10000 个账户,机器每秒仍然只能算 100 次哈希。

账户数量变多,并不会让它尝试 nonce 的速度变快。

所以,PoW 把“制造身份”的问题转换成“投入计算资源”的问题。攻击者要提高影响力,就必须投入真实算力,而不能只靠复制账号。

7.2 为什么挖矿结果具有概率性

哈希函数的输出看起来近似随机。矿工尝试不同 nonce 时,无法提前知道哪个 nonce 会成功,只能不断试。

因此,挖矿像抽奖:

  • hash rate 越高,单位时间内抽奖次数越多;
  • 抽奖次数越多,中奖概率越高;
  • 但某一次具体是谁先中奖,仍然有随机性。

这就是为什么课程中说,分叉竞争时算力强的一方更有可能胜出,但算力较弱的一方也可能因为运气好先挖出下一个区块。

7.3 为什么“最长合法链”能稳定账本

如果所有诚实节点都遵循最长合法链规则,那么网络会逐渐收敛到同一条链上。

临时分叉刚出现时,不同节点可能选择不同分支;但一旦某个分支先被继续扩展,它就会更长,其他诚实节点会转向这条更长的合法链。

这使得比特币账本不需要中心服务器,也能逐渐形成一致状态。

8. 本节小结

  1. 比特币通过 PoW 机制争夺记账权,本质是按算力投票,而不是按账户数量投票。
  2. 矿工通过不断尝试 nonce,寻找使区块头哈希满足目标阈值的结果。
  3. 其他节点收到新区块后,需要验证区块头、交易合法性,以及它是否扩展最长合法链。
  4. 区块内容合法不代表一定会被接受;如果它试图插入链中间并回滚交易,就可能构成 forking attack
  5. 正常网络延迟也可能导致临时分叉,最终由最长合法链规则解决。
  6. coinbase transaction 是比特币发行新币的唯一方式,出块奖励是矿工参与挖矿的重要激励。
  7. orphan block 中的奖励通常无法使用,因为它不在被大多数诚实节点接受的主链上。
  8. 比特币共识最终要达成一致的是去中心化账本的内容。

9. 自测问题

1. 比特币为什么不采用“一个账户一票”的机制?

参考答案:
因为账户可以低成本大量创建,会导致 Sybil attack。比特币改用按算力投票,账户数量不会直接增加获得记账权的概率。

2. 矿工如何获得记账权?

参考答案:
矿工组装候选区块,然后不断尝试不同 nonce。如果某个 nonce 使 Hash(block header) <= target,矿工就获得记账权,可以发布新区块。

3. 其他节点收到新区块后主要验证什么?

参考答案:
主要验证三类内容:区块头是否合法,交易是否有合法签名且没有 double spending,以及该区块是否扩展最长合法链。

4. 为什么一个交易合法的区块也可能不被接受?

参考答案:
因为它可能没有接在最长合法链后面,而是插入链中间形成分叉,试图回滚已经发生的交易。比特币要求接受扩展最长合法链的区块。

5. 正常情况下为什么也会出现分叉?

参考答案:
两个矿工可能几乎同时找到合法 nonce 并广播区块。由于网络传播延迟,不同节点可能先收到不同区块,于是暂时沿不同分支扩展。

6. 什么是 implicit consent

参考答案:
节点不需要显式投票。如果它沿着某个区块继续挖矿、扩展新区块,就表示它认可该区块。

7. orphan block 中的出块奖励为什么通常不能用?

参考答案:
因为该区块不在最终被接受的最长合法链上。诚实节点不会承认短分叉中的账本状态,所以其中的 coinbase transaction 奖励也通常无效。

8. 比特币共识机制要取得的共识到底是什么?

参考答案:
是去中心化账本的内容,即哪些交易被确认、哪些 BTC 属于谁。PoW 决定谁有机会写入账本,最长合法链规则决定哪些写入最终被接受。