比特币作为第一个去中心化数字货币,其核心机制之一便是“挖矿”,挖矿不仅是比特币发行的方式,更是维护区块链网络安全的基石,而挖矿的核心,正是其独特的工作量证明(Proof of Work, PoW)算法——SHA-256哈希算法,本文将从算法原理出发,结合具体实例,详细拆解比特币挖矿的全流程,帮助读者理解“矿工如何通过计算竞争记账权”的核心逻辑。

SHA-256(Secure Hash Algorithm 256-bit)是由美国国家安全局(NSA)设计、美国国家标准与技术研究院(NIST)发布的密码哈希函数,属于SHA-2家族,其核心功能是将任意长度的输入数据(消息)生成一个固定长度(256位,即32字节)的哈希值(通常表示为64个十六进制字符)。
这些特性确保了比特币挖矿的“不可预测性”和“安全性”——矿工无法通过“作弊”快速找到目标哈希值,只能通过暴力计算尝试。
比特币挖矿的本质是“通过计算找到一个符合网络要求的区块哈希值”,具体步骤如下:
矿工在竞争记账权时,需要构造一个“候选区块”,包含以下核心数据:
矿工将区块头的80字节数据作为输入,经过两次SHA-256哈希计算(即“双SHA-256”),得到一个256位的哈希值(64个十六进制字符)。
注意:比特币挖矿使用的是“双SHA-256”,即对输入数据先计算一次SHA-256,再对结果计算一次SHA-256,这是为了增强安全性,防止“长度扩展攻击”等密码学漏洞。

网络会设定一个“难度目标”(Target),要求计算出的哈希值小于或等于该目标值,若目标值为0000000000000000050d1f7a...(前16位为0),则哈希值的前16个十六进制字符必须为0000或更小。
难度与目标值的关系:难度越高,目标值越小(即哈希值需要满足的前导零越多),计算难度呈指数级增长,难度增加1倍,目标值减半,平均需要计算的哈希次数也增加1倍。
如果计算出的哈希值不满足目标值,矿工需要修改区块头中的随机数(Nonce)(从0开始递增),然后重新计算区块头的哈希值,直到找到满足条件的哈希值,或收到“新区块已生成”的消息(此时停止当前计算,转向新区块)。
若矿工率先找到满足条件的哈希值,即可将该广播到全网,其他节点验证通过后,会将该区块添加到自己的区块链末端,矿工获得两部分奖励:
为了更直观理解,我们用一个简化的区块头(仅包含关键字段)和低难度目标,模拟一次挖矿过程。
假设当前矿工构造的候选区块头如下(十六进制表示):

00000001 0000000000000000000a8f0a3c...(省略部分字符,实际32字节) a3b2c1d0e9f8...(省略部分字符,实际32字节) 60a5a2e0(UNIX时间戳:2023-01-01 00:00:00) 00000000ffff0000000000000000000000000000000000000000000000000000(简化目标,要求哈希值前16位为0000) 00000000 区块头的完整数据(80字节)为:
00000001 0000000000000000000a8f0a3c... a3b2c1d0e9f8... 60a5a2e0 00000000ffff0000000000000000000000000000000000000000000000000000 00000000
第一步:计算第一次SHA-256
将上述80字节数据作为输入,通过SHA-256算法计算哈希值(此处用在线工具或代码计算,假设第一次计算结果为):
Hash1 = 5a8b4f3e2c1d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4
第二步:计算第二次SHA-256(双SHA-256)
将Hash1作为输入,再次计算SHA-256,得到最终哈希值:
Final Hash = 2f4a1c3b0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4a3
目标值要求:前16位为0000(即哈希值的前16个字符≤0000)。
计算得到的Final Hash前16位为2f4a1c3b...,远大于0000,不满足条件。
矿工将随机数(Nonce)从00000000递增到00000001,重新构造区块头,重复上述步骤:
00000001 Hash1' = ... Final Hash' = 1a3b2c0d... 1a3b,仍不满足。 继续递增Nonce,直到Nonce=00000015时,计算得到:
Final Hash = 00000a1b2c3d4e5f...
哈希值前16位为00000,满足目标值(≤0000)。