区块结构
| 字段 | 大小 | 格式 | 描述 |
|---|---|---|---|
| Version | 4 字节 | 小端序 | 区块版本号 |
| Previous Block | 32 字节 | 自然字节序 | 前一个区块的区块哈希 |
| Merkle Root | 32 字节 | 自然字节序 | 区块中包含的所有交易ID的默克尔根 |
| Time | 4 字节 | 小端序 | 当前时间的 Unix 时间戳 |
| Bits | 4 字节 | 小端序 | 目标值的紧凑表示 |
| Nonce | 4 字节 | 小端序 | 随机数,用于尝试找到有效哈希 |
| Transaction Count | 动态 | compact size | 区块中包含的交易数量 |
| Transactions | 动态 | 交易数据 | 区块中包含的所有原始交易数据 |
区块头中 nonce 字段用于挖矿。通过不断改变其值(通常是递增)来计算区块头的哈希值, 直至找到一个小于当前目标值的哈希值, 即算挖矿成功。
nonce 字段大小为4个字节, 可表达 0x0 到 0xffffffff 之间的数, 转换为 10 进制就是 0 - 4294967295。
查询全网算力后可以看出, 可以看出算尽不同的 nonce 值甚至不需要 1 秒。
理论上, 确实有可能只通过改变 nonce 值就挖到一个区块。但实际上, 只通过改变 nonce 值挖到区块的概率非常低。
其他可能的尝试是:
- 改变区块时间戳(例如相比于上一次尝试增加一秒), 只要满足关于区块时间的限制即可。然后再重新尝试所有的
nonce值。 - 改变区块头中
version字段, 只要保证前3个比特币是001, 后面29个比特位可以随意组合, 此时就有非常多种的可能, 每一种组合又可以和不同的nonce值组合。 - 修改
coinbase交易输入中的scriptSig字段, 因为coinbase交易本身就是凭空产生比特币, 并没有花费UTXO, 也就不需要用scriptSig去解锁UTXO, 因此scriptSig字段在规则内可以随便修改。修改scriptSig也将导致交易 ID 的变化, 进而导致区块头中Merkle Root字段的变化。区块头数据的变化最终会影响哈希结果。
BIP 34 升级后, 要求在 coinbase 交易输入中的 scriptSig 字段必须以区块高度开头, 以避免生成相同的交易ID。