主页 > www.token.im > 深度剖析挖矿逻辑与技术实现(二)

深度剖析挖矿逻辑与技术实现(二)

www.token.im 2023-07-12 05:16:55

比特币挖矿要输入的数据_比特币挖矿要下载什么_比特币怎么挖矿

getwork的核心设计思想是:

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

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

对于显卡GPU,不用担心nNonce缺少4字节搜索空间,而且挖矿程序从节点客户端拿到一条数据后,不要工作太久,否则就是这个区块很可能已被其他矿工占用。 人挖,继续挖只能做无用功。 对于比特币来说,虽然它被设计为每 10 分钟出一个块,但一个好的策略应该是在几秒钟内重新向节点申请新的挖矿数据。

对于显卡来说,运行SHA256D的算力一般在200M~1G之间。 nNonce提供了4G的搜索空间,也就是说再好的显卡也能支持4秒左右。 调整一次nTime可以再挖4秒。 这一次绰绰有余。

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

不带参数调用getwork,返回数据如下:

{

“中间状态”:“9226a024e0b77f61d49fd5ffdf828c6b5c4330c61ea2778c606a8e49d4ad8bd6”,

“data” :”00000002e9337bac28ee28a949d2140f9fb0a0ab740acfd739d7bcf67ca31c2301db858ad2ca54d92c8c1cded715922c4df2b07d9f10fa1a6cf3db7e949b320615761ed4581c76f21b12d87500000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000″,

“hash1”:“000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

“目标”:“0000000000000000000000000000000000000000000000075d8120000000000”

}

数据字段

一共128字节(80个块头字节+48个完成字节),因为SHA256将输入数据分成固定长度的切片比特币挖矿要输入的数据,每个切片为64字节,输入总长度必须是64字节的整数倍,输入length一般不满足要求,按照一定的规则在metadata末尾完成数据。

其实对于挖矿来说,补全数据是固定的,这里不需要提供。 外部挖矿软件可以自行完成。 连nNonce字段都不需要提供,数据只需要提供至少前76个字节即可。 nTime字段也是必不可少的,外部挖矿程序需要参考节点提供的出块时间来调整nTime。

目标领域

即当前区块难度目标值,采用小端字节序,需要翻转后才能使用。

其实对于外部挖矿程序来说,data和target这两个字段就可以正常挖矿,但是getwork协议充分考虑了各种情况,尽量帮助外部挖矿程序做力所能及的事情,额外提供了两个字段,data字段返回完整补全数据也是基于这个思路。

中州油田

如上所述,SHA256 对输入数据进行拆分。 矿工拿到数据后,第一次分裂(前64字节)是固定的,midstate就是第一次分裂的计算结果。 该节点有助于计算 Out。

因此,借助midstate字段,外部挖矿程序仅用44字节的数据就可以正常挖矿:32字节的midstate + 第一个分片中剩余的12(76-64)字节的数据。

Hash1字段

比特币挖矿每次都需要连续执行两次 SHA256。 第一次执行的结果是32字节,需要补充32字节的数据,组成64字节作为第二次执行SHA256的输入。 hash1为补全数据,同理hash1也是固定的。

外部挖矿程序挖出合格区块后,再次调用getwork接口,将修改后的数据字段提交给节点客户端。 节点客户端返回的数据也必须是128字节。

每次外部调用不带参数的getwork,节点客户端都会构造一个新块。 在返回数据之前,新区块必须完全存储在内存中,并使用 hashMerkleRoot 作为唯一标识符。 节点使用一个Map来存储所有构造的Block,当下一个block已经被别人挖出后,立即清除Map。

getwork接收到一个参数后,首先从参数中提取出hashMerkleRoot,在Map中找到之前保存的区块,然后从参数中提取出nNonce和nTime填充到区块对应的字段中,即可对区块进行验证. 如果难度满足要求,说明已经挖出一个区块,节点向全网广播。

getwork协议是最早版本的挖矿协议,实现了节点与挖矿的分离。 经典的 GPU 挖矿驱动 cgminer、sgminer 和 cpuminer 都使用 getwork 协议进行挖矿。

Getwork + cgminer一直是非常经典的组合。 许多新算法上线后,很快就被移植到cgminer中。 即使是现在,除了 BTC 和 LTC 之外,许多其他山寨币仍在使用 getwork 协议进行挖矿。

矿机出现后,挖矿速度有了很大的提升,目前比特币矿机算力已经达到10T/s的水平。 而getwork只为外部挖矿程序提供了总共4G的32字节的搜索空间。 如果继续使用getwork协议,矿机需要频繁调用RPC接口比特币挖矿要输入的数据,显然是行不通的。

现在BTC和LTC节点都禁用了getwork协议,转而使用更新更高效的getblocktemplate协议。

获取块模板

getblocktemplate协议诞生于2012年年中,当时矿池已经出现。 矿池使用getblocktemplate协议与节点客户端交互,使用stratum协议与矿工交互。 这是最典型的矿池建设模式。

与getwork相比,getblocktemplate协议最大的不同在于getblocktemplate协议允许矿工自行构建区块。 这样,节点和挖矿就完全分离了。

对于getwork来说,区块链是黑暗的,getwork对区块链一无所知,他只知道修改data字段的4个字节。 对于getblocktemplate来说,整个区块链是透明的,getblocktemplate掌握了区块链上所有与挖矿相关的信息,包括需要确认的交易池,getblocktemplate可以选择包含在区块中的交易。

getblocktemplate开发出来之后,就不是一成不变的了。 客户端在后续的每个版本都进行了升级和改动,主要是增加了一些字段,但核心概念和核心字段没有变化。

目前比特币客户端返回的数据如下。 考虑到空间限制,交易字段(transactions)只保留一笔交易数据。 事实上,根据目前的实际情况,交易池中有数万笔交易需要实时确认。 满了(1M容量限制),再加上附加信息,所以每次调用getblocktemplate基本上返回1.5M左右的数据,和getwork的几百字节不一样。

比特币挖矿要输入的数据_比特币怎么挖矿_比特币挖矿要下载什么

以下是矿山大叔的微信二维码,有兴趣的朋友可以加哦~矿山大叔会不定时分享数字货币的消息~

比特币挖矿要输入的数据_比特币挖矿要下载什么_比特币怎么挖矿

比特币挖矿要输入的数据_比特币怎么挖矿_比特币挖矿要下载什么