学习视频来源:https://www.bilibili.com/video/BV1Vt411X7JF/?p=7
本博客除了包含自己的在学习过程中记录的笔记外,还包含少部分自己扩展的内容,如有错误,敬请指正。
文章目录
- [1. 挖矿](#1. 挖矿)
-
- [1.1 挖矿难度的定义与调整](#1.1 挖矿难度的定义与调整)
- [1.2 挖矿难度过低的风险](#1.2 挖矿难度过低的风险)
- [1.3 比特币的难度调整机制](#1.3 比特币的难度调整机制)
- [1.4 设计哲学与保守性](#1.4 设计哲学与保守性)
- [2. 近年趋势图(截至2018)](#2. 近年趋势图(截至2018))
-
- [2.1 算力](#2.1 算力)
- [2.2 挖矿难度(2009-2018)](#2.2 挖矿难度(2009-2018))
- [2.3 挖矿难度(近半年)](#2.3 挖矿难度(近半年))
- [2.4 出块时间(2010-2018)](#2.4 出块时间(2010-2018))
- [2.5 出块时间(2018.2-2018.7)](#2.5 出块时间(2018.2-2018.7))
1. 挖矿
在工作量证明(Proof of Work, PoW)共识机制中,矿工通过不断尝试修改区块头(block header)中的 nonce 字段,使得对整个区块头进行双重 SHA-256 哈希运算后的结果满足特定条件:
block_hash = SHA256 ( SHA256 ( block_header ) ) ≤ target \text{block\_hash} = \text{SHA256}(\text{SHA256}(\text{block\_header})) \leq \text{target} block_hash=SHA256(SHA256(block_header))≤target
其中:
target是一个 256 位的大整数,代表当前网络允许的最大哈希值;bits字段是target的压缩表示形式,存储在区块头中。
只有当计算出的区块哈希值小于或等于该目标阈值时,该区块才被其他节点视为有效,矿工才能获得区块奖励。
1.1 挖矿难度的定义与调整
比特币使用的哈希函数是 SHA-256 ,其输出空间为 2 256 2^{256} 2256 个可能值。挖矿的本质是在这个巨大的空间中寻找一个落在目标区间 [ 0 , target ] [0, \text{target}] [0,target] 内的哈希值。
- 目标空间占比 : target 2 256 \frac{\text{target}}{2^{256}} 2256target
- 挖矿难度(Difficulty) 定义为:
difficulty = difficulty_1_target current_target \text{difficulty} = \frac{\text{difficulty\_1\_target}}{\text{current\_target}} difficulty=current_targetdifficulty_1_target
其中difficulty_1_target是比特币创世块设定的初始目标(对应难度为 1),它是一个很大的值,用10进制表示是2695953529101130949315647634472881282790298058886387306093882117760,约2.69595× 10 72 10^{72} 1072 。
通俗说法"哈希值前导零越多,难度越大"并不严格准确------真正决定难度的是目标阈值
target的大小,而非零的数量。但由于target越小,哈希值越可能以多个零开头,因此这种说法在实践中常被用作直观理解。
关键关系:
target越小 → 难度越大 → 找到有效 nonce 越难target越大 → 难度越小 → 出块越快
1.2 挖矿难度过低的风险
若挖矿难度设置过低(即 target 过大),会导致以下问题:
- 出块速度过快:例如几秒就产生一个区块。
- 高分叉率(High Forking Rate) :
- 不同节点因网络延迟接收到不同区块,各自在其后继续挖矿;
- 导致区块链频繁出现临时分叉(orphan blocks)。
- 算力分散:诚实节点的算力被分散到多个分支上。
- 安全威胁 :
- 恶意攻击者只需较少算力即可在其私有链上持续出块;
- 更容易发动 51% 攻击 或 自私挖矿(Selfish Mining);
- 破坏最长链原则,危及系统一致性与安全性。
虽然比特币设定 平均 10 分钟出一个块 ,但这并非理论最优值。有人认为对支付场景而言 10 分钟太长。
例如,以太坊 将出块时间缩短至约 15 秒(约为比特币的 1/40),显著提升交易确认速度。
但出块速度不能无限加快。为此,以太坊引入了 GHOST 协议(Greedy Heaviest Observed Subtree):
- 不再简单丢弃陈腐区块(stale blocks);
- 将其作为 "叔块(uncle blocks)" 纳入主链并给予部分奖励(uncle reward);
- 同时以太坊同样也需动态调整挖矿难度,以维持出块时间稳定。
1.3 比特币的难度调整机制
比特币采用周期性自动调整 策略,确保长期平均出块时间稳定在 10 分钟。
调整周期
- 每 2016 个区块 调整一次难度;
- 理论周期时长: 2016 × 10 分钟 = 20160 分钟 = 14 天 2016 \times 10\ \text{分钟} = 20160\ \text{分钟} = 14\ \text{天} 2016×10 分钟=20160 分钟=14 天。
调整公式
设:
actual_time:过去 2016 个区块实际耗时(单位:秒);expected_time = 2016 × 600 = 1,209,600 秒(即 14 天);
则新目标为:
new_target = old_target × actual_time expected_time \text{new\_target} = \text{old\_target} \times \frac{\text{actual\_time}}{\text{expected\_time}} new_target=old_target×expected_timeactual_time
- 若
actual_time > expected_time→ 挖得太慢 → 降低难度(增大 target); - 若
actual_time < expected_time→ 挖得太快 → 提高难度(减小 target)。
防波动限制(难度调整边界)
为防止网络算力突变(如矿场宕机、大规模加入)导致难度剧烈震荡,比特币协议规定:
- 每次调整幅度不得超过 4 倍 :
- 最多将 target 增大 4 倍(难度降至 1/4);
- 最多将 target 减小 4 倍(难度升至 4 倍)。
即:
1 4 ≤ actual_time expected_time ≤ 4 \frac{1}{4} \leq \frac{\text{actual\_time}}{\text{expected\_time}} \leq 4 41≤expected_timeactual_time≤4
超出此范围的,按边界值处理。
全网一致性保障
- 难度调整逻辑硬编码在所有合规节点的共识规则中;
- 若某个矿工不按规则调整 ,其生成的区块将包含错误的
bits字段; - 其他诚实节点会拒绝该区块,因其不满足当前难度要求;
- 因此,恶意节点无法单方面维持旧难度------其区块不会被网络接受。
1.4 设计哲学与保守性
比特币的难度调整参数(如 2016 区块周期、4 倍限制、10 分钟目标)并非来自严格的数学最优解,而是经过工程权衡后的保守设计:
- 稳定性优先:避免因短期算力波动导致系统不稳定;
- 抗攻击性:防止攻击者利用难度滞后发起双花或重组攻击;
- 去中心化兼容:适应全球矿工网络的异构性和通信延迟。
尽管这些参数未来可通过软分叉或硬分叉调整,但在比特币当前的治理模型下,任何改动都需广泛社区共识,因此保持高度保守。
总结
| 项目 | 说明 |
|---|---|
| 目标 | 维持平均 10 分钟出块 |
| 调整周期 | 每 2016 个区块(约 2 周) |
| 调整依据 | 实际出块时间 vs 期望时间 |
| 调整方式 | 线性缩放 target,带 ±4 倍限制 |
| 安全机制 | 共识规则强制执行,非合规区块被拒 |
| 设计理念 | 稳定、安全、去中心化优先 |
这一机制是比特币能在十余年中保持稳定运行的关键基石之一。
2. 近年趋势图(截至2018)
2.1 算力
可以看到,全网算力越来越大,最近几年成指数级增长

2.2 挖矿难度(2009-2018)
与算力图增涨趋势基本一致,符合难度调整设计目标,保证出块速度稳定。

2.3 挖矿难度(近半年)
每2周都有一个阶梯变化,反应算力越来越高,人们对比特币的热情越来越高。

2.4 出块时间(2010-2018)
基本稳定在10分钟上下震动,难度调整达到预期。

2.5 出块时间(2018.2-2018.7)
