BTC 挖矿细节分析
记录原因
前两天参加了一个区块链的技术分享会,是一个大学的老师讲解区块链,将区块链的前因后果娓娓道来。虽然前面的区块链的数据结构之类的我都听过,但后续讲解了BTC的挖矿细节,这些都是我之前未曾仔细琢磨的,以及及web3、DAO、DeFi等一些新的进展,让我耳目一些。 这里先把BTC的挖矿细节整理下。
BTC 挖矿
随便搜搜,就能发现很多文章介绍BTC挖矿大约10分钟一个块,而ETH大约13秒出一个块。而BTC保持每2016个区块后就会调整一下挖矿的难度系数,折算下( 2016 * 10分钟) / (24 * 60分钟) = 14 天,所以基本是2周左右就要调整一次。
挖矿的过程
挖矿难度是根据 block header 的哈希调整的,如下图所示:
- block header 中包括前一个区块的hash、BTC 的版本信息、时间戳 timestamp、当前的挖矿难度、可随机调整的 Nonce 值、以及当前区块所包含交易的 Merkle root 。
- 将 block header 进行 SHA-256 哈希之后,如果其 hash 的结果满足前面 n 位为0,后续(256-n)位的值小于等于指定的挖矿难度,就确认已经挖到区块了。
- 如果不满足,需要调整 Nonce 值,但 Nonce 值只有 4Bytes (32 bit),调整范围有限,如果不满足,也可以调整调整 CoinBase中的 nonce 以修改 Merkle root
CoinBase 与 Merkle Tree
Merkle Tree 的结构如下:
其中 CoinBase 是作为 Tree 底层的第一个交易:
- CoinBase 的数据长度最小是 2 个byte,最大是 100 bytes;
- 除了最开始的几个字节之外,后续的字节可以随意填充,可以看作是 Nonce 值;
- CoinBase 的 nonce 值的变动,会导致 Merkle root 的变动,进而影响到整个 block header 的哈希值。