07-BTC-挖矿难度

学习视频来源:https://www.bilibili.com/video/BV1Vt411X7JF/?p=7
本博客除了包含自己的在学习过程中记录的笔记外,还包含少部分自己扩展的内容,如有错误,敬请指正。

文章目录

  • [1. 挖矿](#1. 挖矿)
  • [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 过大),会导致以下问题:

  1. 出块速度过快:例如几秒就产生一个区块。
  2. 高分叉率(High Forking Rate)
    • 不同节点因网络延迟接收到不同区块,各自在其后继续挖矿;
    • 导致区块链频繁出现临时分叉(orphan blocks)。
  3. 算力分散:诚实节点的算力被分散到多个分支上。
  4. 安全威胁
    • 恶意攻击者只需较少算力即可在其私有链上持续出块;
    • 更容易发动 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)

相关推荐
电报号dapp1194 小时前
质押挖矿DAPP与Swap交易所开发:构建DeFi新基建的全景指南
web3·去中心化·区块链·智能合约
区块链小八歌4 小时前
从流动性枢纽到衍生品引擎:2026 新年伊始,Kodiak 的进化之路
区块链
草原猫14 小时前
DAPP开发应用场景解析:DAPP开发可以用在哪些业务中?
区块链·dapp开发
商业讯网116 小时前
国家电投海外项目运营经验丰富
大数据·人工智能·区块链
老蒋每日coding17 小时前
Solidity入门(2):Foundry框架开发指南
区块链
DICOM医学影像1 天前
8. go语言从零实现以太坊响应端 - 查询区块链账户余额
golang·区块链·以太坊·web3.0·响应端·从零实现
TechubNews1 天前
当跨链协议开始将业务从「搭桥」拓展至「swap」
区块链
oMcLin1 天前
如何在 SUSE Linux Enterprise Server 15 上通过配置 Nginx 与 PHP‑FPM 提升大流量电商平台的服务器响应能力
centos·去中心化·区块链
oMcLin1 天前
如何在 CentOS 7.9 上部署基于区块链的数字资产交易平台,确保交易透明度与去中心化安全性
centos·去中心化·区块链