主页 > imtoken官网下载2.0国际版 > CPU挖矿算法,深度解析挖矿的逻辑和技术实现

CPU挖矿算法,深度解析挖矿的逻辑和技术实现

imtoken官网下载2.0国际版 2023-01-18 13:01:26

现在挖矿已经成为主流,很多人为了从虚拟数字货币中获利而开始了挖矿项目。挖矿算法也为挖矿币带来了一些辅助能力。 cpu挖矿的算法你知道吗?接下来小编就给大家深入剖析一下挖矿技术的实现过程。

挖掘是执行算法操作的过程。从计算机和代码的角度来看,就是反复执行Hash函数并检测执行结果的具体过程。和讨论算法一样,挖矿也是在采用POW共识机制的前提下讨论的。

大家都非常清楚,挖矿从CPU挖矿开始,过渡到GPU挖矿,最后演变到现在的ASIC(专业矿机)挖矿时代。本文分析了逻辑设计和技术实现。挖矿的演进是硬件的演进,也是软件的演进,尤其是软硬件对接协议的改进。因此,本文直接讨论了与字幕挖掘相关的几个核心协议,并逐步展开讨论。

当我查看这篇文章时,我发现“矿工”这个词用得很模糊。这种情况在英国文学中也是类似的。在日常交流中,一般指的是有矿机的人。本文重点介绍区块链,挖矿程序或机器统称为矿工。

采矿

本节讨论挖矿的原理。首先,分析比特币区块头的结构。我们说挖矿的本质是执行Hash函数的过程,而Hash函数是单入单出的函数,输入的数据就是区块头。 比特币区块头有6个字段:

int32_t nVersion; //版本号,4字节

uint256 hashPrevBlock; //前一个区块的区块头的哈希值,32字节

uint256 hashMerkleRoot; //该区块包含的所有交易构造的Merkle树根,32字节

uint32_t nTime; //Unix时间戳,4字节

CPU挖矿软件

uint32_t nBits; //记录这个区块的难度,4字节

uint32_t nNonce; //随机数CPU挖矿软件,4字节

如上,比特币每挖一次,都会对这80个字节进行两次连续的SHA256运算(SHA256D),运算结果是固定的32个字节(256个二进制位)。

以上6个字段不同,

nVersion,块版本号,只会在升级过程中改变。

hashPrevBlock,由上一个区块决定。

nBits,全网确定,每2016个区块重新调整一次,调整算法固定。

所以上面3个字段可以理解为固定的,对于每个矿工来说都是一样的。矿工可以自由调整的地方是剩下的3个字段,

CPU挖矿软件

nNonce,提供 2^32 个可能的值

nTime,其实这个字段能提供的值空间是很有限的,因为合理的出块时间是有一个范围的,这个范围是根据上一个出块时间来确定的,比上一个出块时间过早或者过早时间。被其他节点拒绝。值得一提的是,后一个区块的出块时间略早于前一个区块的时间,这是允许的。一般来说,矿工会直接使用机器当前的时间戳。

hashMerkleRoot,理论上提供了 2^256 种可能性。该字段的变化来自于添加或删除块中包含的交易,或者改变顺序,或者修改Co​​inbase交易的输入字段。

根据Hash函数的特点,即使三个字段中的任何一个发生变化,Hash运算的结果也会发生很大的变化。在 CPU 挖矿时代,搜索空间主要由 nNonce 提供。在矿机时代,nNonce 提供的 4 个字节远远不够,搜索空间转向 hashMerkleRoot。

比特币挖矿的逻辑流程如下:

1. 打包交易,取回待处理的交易内存池,选择要包含在区块中的交易。矿工可以任意选择,甚至不选择(钻区块),因为每个区块都有容量限制(目前是1M),所以矿工不能无限选择。对于矿工来说,最合理的策略是先将待确认的交易集按照手续费进行排序,然后尝试从高到低包含最多的交易。

2. 构建Coinbase,确定该区块包含的交易集后,即可统计该区块的总交易费用。结合输出规则,矿工可以在这个区块中计算自己的收益。

3. 构造 hashMerkleRoot 并为所有交易构造 Merkle 数。

CPU挖矿软件

4. 填写其他字段以获得完整的区块头。

5.哈希运算,对区块头进行SHA256D运算。

6. 验证结果,如果满足难度,向全网广播,挖掘下一个区块;如果不满足难度,则按照一定的策略改变上述字段之一,然后进行Hash运算和验证。

符合条件的区块条件如下:

SHA256D(Blockherder)

其中SHA256D(Blockherder)为挖矿结果,F(nBits)为难度对应的目标值,均为256位,均视为大整数,直接比较大小确定是否满足难度要求。

为了节省区块链的存储空间,将256位的目标值通过一定的变换和无损压缩存储在32位的nBits字段中。具体变换方法是拆分使用4个字节的nBits,第一个字节代表右移的位数,用V1表示,后3个字节记录值,用V3表示,有:

另外,难度有一个下限,也就是有一个最大值。比特币难度最小值为nBits=0x1d00ffff,对应的最大目标值为:0x00000000FFFF000000000000000000000000000000000000000000000000000

CPU挖矿软件

因此,挖矿可以形象地比喻为抛硬币,比如有256个硬币,给定数字1、2、3……256,每进行一次Hash运算,就像抛硬币一样, 256枚硬币同时抛,落地后要求该号码前n位的所有硬币都正面朝上。

设置生成

Setgenerate协议接口代表着CPU挖矿时代。

中本聪在他的论文中描述了“1 CPU 1 Vote”的理想数字民主概念。在客户端的初始版本中,附加了挖矿功能。客户端挖矿非常简单。当然,需要在数据挖掘结束后进行同步。有很多算力非常低的山寨币,仍然使用客户端直接挖矿。有两种方式开始挖矿:

1)在配置文件中设置gen=1,然后启动客户端,节点会自行开始挖矿。

2)客户端启动后,使用RPC接口setgenerate控制挖矿。

如果你使用经典的QT客户端,点击“帮助”菜单,打开“调试窗口”,在“控制台”输入如下命令:setgenerate true 2,然后回车,客户端开始挖矿,后面的数字代表挖矿线程数。如果要关闭挖矿,在控制台使用如下命令:setgenerate false,可以使用getmininginfo命令查看挖矿状态。

节点挖矿过程也很简单:

CPU挖矿软件

构造区块,初始化区块头字段,计算Hash并验证区块,如果不合格,nNonce会自动递增,然后计算验证,以此类推。在 CPU 挖矿时代,nNonce 提供的 4 字节搜索空间是完全足够的(4 字节是 4G 的可能,单核 CPU 对 SHA256D 的计算能力一般在 2M 左右)。实际上,nNonce 只是遍历了两个字节,返回来重构块。

开始工作

getwork 协议代表了 GPU 挖矿的时代。需求主要是由于挖矿程序和节点客户端的分离,以及区块链数据和挖矿组件的分离。

使用客户端节点直接挖矿,需要同步完整的区块链,数据与程序紧密结合。也就是说,如果有多台计算机进行挖矿,每台计算机都需要同步一份单独的区块链数据副本。 这实际上是没有必要的。对于矿工,至少需要一个完整节点。同时,GPU挖矿时代的到来也需要一个协议来与客户端节点进行交互。

780b2009d3cb4561a8cc6120d5d95e72_th

getwork的核心设计思想是:

由节点客户端构建区块,然后将区块头数据交给外部挖矿程序。挖矿程序遍历nNonce进行挖矿。验证通过后,交付给节点客户端。节点客户端验证通过后CPU挖矿软件,向全网广播。

如上所述,块头一共是 80 个字节。由于没有待确认的区块链数据和交易池,nVersion、hashPrevBlock、nBits和hashMerkleRoot 4个字段总共72字节必须由节点客户端提供。挖矿程序主要是增量遍历nNonce,必要时可以微调nTime字段。

对于显卡GPU,不用担心nNonce的4字节搜索空间不足,而且挖矿程序从节点客户端拿到一条数据后,应该不会工作太久,否则很有可能这个区块已经被别人挖了,继续挖也只能没用。对于比特币来说,虽然它被设计成每 10 分钟出块一次,但好的策略也应该是在几秒钟内重新向节点申请新的挖矿数据。对于显卡来说,运行SHA256D的算力一般在200M~1G之间,nNonce提供4G的搜索空间,也就是说再好的显卡也能支持4秒左右。调整一次nTime后,可以再挖4秒,时间绰绰有余。 .

节点提供RPC接口getwork,有一个可选参数。如果没有参数,则申请挖掘数据。如果有参数,就是提交挖出的区块数据。

挖矿从cpu挖矿开始。因此,要想了解挖掘算法,就必须从cpu挖掘算法开始探索。你知道多少?以上就是小编为大家整理的挖矿技术的实现过程逻辑,供大家深入分析。如果您想了解更多关于比特币的信息,请跟随微风。