区块结构
字段 | 大小 | 格式 | 描述 |
---|---|---|---|
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。