主页 > imtoken下载正版 > 比特币CPU挖矿、GPU挖矿、矿池和矿机挖矿技术原理

比特币CPU挖矿、GPU挖矿、矿池和矿机挖矿技术原理

imtoken下载正版 2023-03-08 07:25:11

# 比特币CPU挖矿、GPU挖矿、矿池和矿机挖矿技术原理

### 比特币挖矿原则

比特币的区块头一共有6个字段,如下:

* int32_t nVersion比特币挖矿在哪里挖,4字节,版本号,一般是固定的,只有在升级的时候才会改变。

* uint256 hashPrevBlock,32字节,上一个区块的区块头hash,由上一个区块决定。

* uint256 hashMerkleRoot,32字节,包含区块中所有交易结构的Merkle根,在调整区块中交易顺序、增删交易、修改Coinbase交易时改变。

* uint32_t nTime,4字节,时间戳。 允许下一个区块的时间略早于上一个区块的时间,但必须在合理的时间间隔内。 一般会直接使用本机的当前时间戳。

* uint32_t nBits,4字节,挖矿难度,由全网决定,每2016个区块根据算法重新调整。

* uint32_t nNonce,4字节,随机数,提供2^32个值。 即 4,294,967,296。

其中,nVersion、hashPrevBlock、nBits是固定的,其他hashMerkleRoot、nTime、nNonce是可变的。

比特币挖矿的原理是不断改变区块头中的变量值,从而对区块头进行双SHA256哈希,结果小于挖矿难度目标值。 这是:

SHA256D(区块头) < F(nBits)

其中,SHA256D(BlockHeader)为区块头的双SHA256哈希,F(nBits)为nBits计算的难度目标值。

###算力的表示

1 H/S = 每秒一次操作

1 KH/S = 1000 H/S,即每秒操作一千次

1 MH/S = 1000 KH/S,即每秒100万次操作

1 GH/S = 1000 MH/S,即每秒10亿次操作

1 TH/S = 1000 GH/S,或每秒 1 万亿次操作

1 PH/S = 1000 TH/S,即每秒1000万亿次运算

1 EH/S = 1000 PH/S,即每秒100万万亿次运算

### CPU挖矿原理

CPU挖矿,即使用RPC接口setgenerate来控制挖矿。

在控制台输入setgenerate true 2开始挖矿。 后面的数字代表挖矿线程数。 当然,首先要完成同步数据。

由于SHA256D在单CPU上的计算能力约为2MH/S,nNonce提供的4字节搜索空间完全足够,即支持4G值。

### GPU挖矿原理

GPU计算 SHA256D计算能力约为200M-1G,nNonce提供4G的搜索空间,如果只调整nNonce的值,可以支持4秒左右。

所以nTime是可以调整的,每调整一次nTime,可以继续挖矿4秒。

GPU挖矿采用GETWORK协议,即挖矿程序与节点分离,即挖矿组件与区块链数据分离。

在GPU挖矿时代,GETWORK协议用于实现挖矿程序与节点的交互。

核心思想是:节点构造区块,将区块头数据交给挖矿程序,挖矿程序遍历nNonce进行挖矿。

验证合格下发给节点,节点提取nNonce和nTime验证块,如果满足要求向全网广播。

遍历结束时,会调用GETWORK,节点构造新区块,然后重复上述过程。

GPU经典挖矿驱动为cgminer,源码为.

GPU挖矿缺陷:GETWORK协议为挖矿程序提供的搜索空间为4G,结束后需要再次调用GETWORK RPC接口。

矿机出现后,矿机算力已经达到10TH/S。 继续使用GETWORK协议来频繁调用RPC接口显然是不合适的。

因此,有必要切换到更高效的getblocktemplate协议。

###矿池挖矿原理

矿工通过getblocktemplate协议与节点交互,或者矿池通过stratum协议与矿工交互,这是两种典型的矿池构建模式。

与getwork相比,getblocktemplate协议允许矿工自行构建区块,从而将节点与挖矿完全分离。

矿工得到一系列数据后,开始挖矿:

1. 建立一个 coinbase 交易。

2.coinbase交易放在交易列表之前,构建hashMerkleRoot。 由于coinbase和交易顺序可以调整,hashMerkleRoot空间可以认为是无限的。

因此比特币挖矿在哪里挖,getblocktemplate 协议也让矿工获得了巨大的搜索空间。

3. 构建区块头。

4. 挖矿,即矿工可以在nNonce、nTime、hashMerkleRoot提供的搜索空间中涉及任何挖矿策略。

5. 提交数据。 如果挖矿成功,则提交给节点,由节点验证并广播。

getblocktemplate 协议的问题: