挖矿过程
目录
挖矿概述
挖矿的作用
1. 创建新比特币(区块奖励)
2. 验证交易
3. 保护网络
4. 维持出块时间(约 10 分钟)
挖矿奖励:
区块奖励(Coinbase):
初始 50 BTC
每 210,000 块减半
目前 (2024):3.125 BTC
交易费用:
区块中所有交易的费用总和矿工类型
1. 个人矿工
使用 ASIC 矿机独立挖矿
收益不稳定但独立
2. 矿池矿工
贡献算力到矿池
获得稳定的小额收益
3. 矿场
大规模部署矿机
追求最低电费区块构造
区块模板
Coinbase 交易:
创建新比特币的特殊交易
输入:无(新生成)
输出:奖励 + 费用
Coinbase 脚本:
包含区块高度(BIP 34)
矿池可包含额外数据
交易选择:
按费率从高到低
填满区块大小限制区块头构造
80 字节区块头:
版本号(4 字节):
协议版本
前一区块哈希(32 字节):
链接到前一个区块
保持链的连续性
Merkle 根(32 字节):
所有交易的汇总哈希
时间戳(4 字节):
Unix 时间戳
需要 >= 中位数时间
难度目标(4 字节):
编码的 PoW 难度
Nonce(4 字节):
"只用一次"的数字
矿工不断改变以找到有效区块工作量证明
PoW 计算
核心方程:
SHA256(SHA256(block_header)) < target
过程:
1. 构造区块头(80 字节)
2. 计算哈希 = SHA256(SHA256(header))
3. 检查 hash < target
4. 如果不满足,改变 nonce,重复
目标值:
从难度转换而来
目标越小,难度越大挖矿的本质
粗暴算法:
for nonce = 0 to 2^32 - 1:
header = make_header(transactions, nonce)
hash = SHA256(SHA256(header))
if hash < target:
return block // 找到有效区块!
if has_new_transactions:
recalculate_merkle_root()
nonce = 0 // 重置 nonce
预期工作量:
平均需要 2^32 / 2 ≈ 21 亿次哈希
现代 ASIC:秒级完成难度调整
难度调整机制
目标:维持 10 分钟的平均出块时间
调整周期:
每 2,016 个区块(约 2 周)调整一次
公式:
新难度 = 旧难度 × (实际时间 / 目标时间)
实际时间 = 最后 2,016 个区块的时间
目标时间 = 2,016 × 10 分钟 = 20,160 分钟
限制(BIP 307):
调整最多 4 倍(上下)
防止极端波动难度历史
初期(2009-2012):
10 分钟左右一个区块
GPU 时代(2012-2013):
难度迅速增加
ASIC 时代(2013-现在):
难度呈指数增长
当前难度 ≈ 最高点
未来趋势:
取决于比特币价格
价格高 → 更多矿工 → 难度上升矿池挖矿
矿池工作机制
流程:
1. 矿工连接矿池
提供工作地址
2. 矿池分配工作
发送区块模板
包含相对较低的难度(Share difficulty)
3. 矿工进行计算
尝试找到满足共享难度的哈希
4. 提交工作证明
矿工提交找到的哈希
5. 矿池汇聚
收集所有矿工的工作
组合成真正满足网络难度的区块
6. 矿池奖励
按贡献度分配奖励
考虑难度和提交量矿池收益分配
PPLNS (Pay Per Last N Shares):
基于最近提交的 N 个工作
浮动收益
PPS (Pay Per Share):
每个提交的工作都有固定收益
矿池承担方差风险
FPPS (Full Pay Per Share):
PPS + 交易费用分享常见问题
Q1: 挖矿还赚钱吗?
A:
- 取决于电费成本
- 当前中国:可能亏损
- 冰岛、伊朗:电费便宜,可赚钱
- 个人挖矿:几乎不可能,应加入矿池
Q2: 为什么难度这么高?
A:
- 比特币价格高
- 更多矿工进入
- 更多算力投入
- 难度自动调整
Q3: 能否修改难度算法?
A:
- 可以,通过软/硬分叉
- 但会改变经济激励
- 不太可能发生
Q4: GPU 还能挖比特币吗?
A:
- 不能,ASIC 太强大了
- 可以挖其他币(ETH、XMR)
- GPU 没有竞争力
Q5: 矿池会偷走我的比特币吗?
A:
- 可以设置提取地址
- 矿池无法强制转向
- 信誉好的矿池通常可信
