比特币矿工计算hash hash值怎么计算

发布时间:2026-01-18 10:02:02 浏览:3 分类:比特币资讯
大小:509.7 MB 版本:v6.141.0
欧易官网正版APP,返佣推荐码:61662149

一、一个比特币要挖多久

我是12年开始挖比特币的,当时用的台式机挖了一上午,有0.002个比特币,一天24小时可以挖0.008个比特币,挖一个得125天,当时的比特币价格是500人民币,也就是一上午挖1块钱的比特币,挖一天应该有5块钱,但是一天的电费要4块8,所以一个电脑挖一天赚2毛,所以要赚钱得规模化,但是还要考虑到投资的电脑成本

目前基本都是矿机,一个蚂蚁矿机是800美元一台,5500人民币的成本,功率1350w,每天24小时挖矿一个月可以挖到0.02个,按照目前比特币8000美金来算,一个月可以赚160美金,也就是1104人民币,电费是777.6人民币,每月可以赚326块,得16个月才能收回矿机的成本,到时候矿机都废掉了

而且5月份比特币第三次奖励减半,得32个月回本

所以挖币最终还是拼电力成本,普通家庭还是老老实实买币吧

现在都是在交易所买

去上火币看看吧

火币全球站

二、比特币如何算出来的

从比特币的本质说起,比特币的本质其实就是一堆复杂算法所生成的特解。特解是指方程组所能得到有限个解中的一组。而每一个特解都能解开方程并且是唯一的。

以钞票来比喻的话,比特币就是钞票的冠字号码,知道了某张钞票上的冠字号码,就拥有了这张钞票。而挖矿的过程就是通过庞大的计算量不断的去寻求这个方程组的特解,这个方程组被设计成了只有 2100万个特解,所以比特币的上限就是 2100万个。

要挖掘比特币可以下载专用的比特币运算工具,然后注册各种合作网站,把注册来的用户名和密码填入计算程序中,再点击运算就正式开始。完成Bitcoin客户端安装后,可以直接获得一个Bitcoin地址,当别人付钱的时候,只需要自己把地址贴给别人,就能通过同样的客户端进行付款。

在安装好比特币客户端后,它将会分配一个私钥和一个公钥。需要备份你包含私钥的钱包数据,才能保证财产不丢失。如果不幸完全格式化硬盘,个人的比特币将会完全丢失。

钱包

比特币钱包使用户可以检查、存储、花费其持有的比特币,其形式多种多样,功能可繁可简,它可以是遵守比特币协议运行的各种工具,如电脑客户端、手机客户端、网站服务、专用设备;

也可以只是存储著比特币私密密钥的介质,如一张纸、一段暗号、一个快闪U盘、一个文本文档,因为只要掌握比特币的私密密钥,就可以处置其对应地址中包含的比特币。比特币无法存入一般的银行账户,交易只能在比特币网络上进行,使用前需下载客户端或接入线上网络。

三、挖矿到底在计算什么

比特币挖矿到底在计算什么?如何看待比特币挖矿,比特币的挖矿对于不同的矿工而言是一种竞争记账权的合作记账行为,在合作的大框架下有序地竞争。也就是利用电脑硬件计算出比特币的位置并获取的过程称之为挖矿。挖矿既能生产比特币,又能保障交易信息,下面来具体解释挖矿。

比特币在2017年底暴涨至将近20万人民币一枚,不仅火了数字货币行业,更是火爆了区块链行业,正因为如此,很多人想方设法去挖矿,获取比特币来实现自己的财富自己,首先,”比特币“挖矿是怎挖的,比特币是一中虚拟货币,基于区块链技术。如果我们简单地把区块链的区块比作一个个的账本,那么”挖矿“就是“打包”过去十分钟整个区块链网络的交易,把这些交易写入新的区块,那么就“打包”完成,那就是完成了“挖矿”。完成了挖矿之后就获得了系统分发给你的比特币。这就是比特币“挖矿”比较简化的说法,当中的原理和运行还是相当复杂的。

如何分配“打包权”

比特币的价格超过2w元一个,每一次获得“打包权”,完成工作就会获得12.5个比特币(会随时间递减),获利可谓相当丰厚。

天下熙熙皆为利来天下攘攘皆为利往,只要有利润的地方就有人。网络上矿工众多,那么如何确定应该分配给哪个矿工去做这事呢?

比特币的创始人中本聪采用这种方法:采用一种叫“工作证明(Proof Of Work,简称POW)机制,即工作量的证明。

这种方法通常来说只能从结果证明,因为监测工作过程通常是繁琐与低效的。这是用来确认你做过一定量的工作,但是监测工作的整个过程极为低效,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。

我们可以比喻成,要证明您会开车技术好,企业不可能给您几天时间,跟着您在市区上走。但是,你可以提供驾驶证和之前在公交车公司当公交车司机的工作证明,来说明您得能力。你要获得这个能力需要付出大量的时间和精力,但是企业验证却非常简单。

比特币这种加密系统所使用工作量证明机制的证明是哈希现金,需要算出对应的哈希函数。哈希现金是一种工作量证明机制,它是亚当·贝克在1997年发明的,主要用于抵抗邮件的拒绝服务攻击及垃圾邮件网关滥用。在比特币之前,哈希现金被用于垃圾邮件的过滤,也被微软用于hotmail等产品中。

对于比特币这种加密系统所使用的哈希函数,它需要具备以下的性质:

1.免碰撞,即不会出现输入x≠y,但是H(x)=H(y)

2.隐匿性,也就是说,对于一个给定的输出结果H(x),想要逆推出输入x,在计算上是不可能的。

3.不存在比穷举更好的方法,可以使哈希结果H(x)落在特定的范围。

比特币在区块链的生成过程中使用了POW机制,一个符合要求的区块哈希函数由N个前导零构成,零的个数取决于网络的难度值。

要得到合理的区块哈希码需要经过大量尝试计算。当某个节点提供出一个合理的区块哈希值,那就是说明该节点确实经过了大量的尝试计算,那么系统就把”打包权“分配给该节点(矿工)

当然这不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件,所以当节点(矿工)拥有占全网n%的算力时,该节点基本上就是有n/100的概率找到区块哈希。那就是意思上说比拼算力。

当能不能记住前面几个0,然后可以使用呢?不能的,因为难度值不一样, 0的数量就不一样。而且要证明的数是一个哈希码,而且需要验证的工作量证明非常庞大,基本上无法造假。只存在一个方法:穷举!

那么意味着,你不仅要算出你的哈希值,还需要对比对不对,如果不对的话继续算。

所以需要大量的显卡进行大量的并行运算,获取哈希值。让我们来看看,矿场是一个怎么样的存在:

这些矿场都是用很贵的显卡来算,他们的算里是人工的N倍。如果单靠人力,算十年都没有它们工作一小时的工作量大。

比特币和传统货币不同,美元和英镑这种法币由央行和金融机构管理,进行转账交易时这些机构也同时参与,而比特币只在分布式账本中进行交易,每一项交易就储存在比特币的全球网络节点中,不可复制,不可篡改。所以每个储存数据的节点都会有相应的奖励,目前已经开采的节点有1700万个,比特币总量只有2100万个,意味着还有400万个比特币待开采。

四、比特币矿池的协议stratum

转自:

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

与getwork相比,getblocktemplate协议最大的不同点是:getblocktemplate协议让矿工自行构造区块。如此一来,节点和挖矿完全分离。对于getwork来说,区块链是黑暗的,getwork对区块链一无所知,他只知道修改data字段的4个字节。对于getblocktemplate来说,整个区块链是透明的,getblocktemplate掌握区块链上与挖矿有关的所有信息,包括待确认交易池,getblocktemplate可以自己选择包含进区块的交易。

挖矿有两种方式,一种叫SOLO挖矿,另一种是去矿池挖矿。前文所述的在节点客户端直接启动CPU挖矿,以及依靠getwork+cgminer驱动显卡直接连接节点客户端挖矿,都是SOLO挖矿,SOLO好比自己独资买彩票,不轻易中奖,中奖则收益全部归自己所有。去矿池挖矿好比合买彩票,大家一起出钱,能买一堆彩票,中奖后按出资比率分配收益。理论上,矿机可以借助getblocktemplate协议链接节点客户端SOLO挖矿,但其实早已没有矿工会那么做,在写这篇文章时,比特币全网算力1600P+,而当前最先进的矿机算力10T左右,如此算来,单台矿机SOLO挖到一个块的概率不到16万分之一,矿工(人)投入真金白银购买矿机、交付电费,不会做风险那么高的投资,显然投入矿池抱团挖矿以降低风险,获得稳定收益更加适合。因此矿池的出现是必然,也不可消除,无论是否破坏系统的去中心化原则。

矿池的核心工作是给矿工分配任务,统计工作量并分发收益。矿池将区块难度分成很多难度更小的任务下发给矿工计算,矿工完成一个任务后将工作量提交给矿池,叫提交一个share。假如全网区块难度要求Hash运算结果的前70个比特位都是0,那么矿池给矿工分配的任务可能只要求前30位是0(根据矿工算力调节),矿工完成指定难度任务后上交share,矿池再检测在满足前30位为0的基础上,看看是否碰巧前70位都是0。

矿池会根据每个矿工的算力情况分配不同难度的任务,矿池是如何判断矿工算力大小以分配合适的任务难度呢?调节思路和比特币区块难度一样,矿池需要借助矿工的share率,矿池希望给每个矿工分配的任务都足够让矿工运算一定时间,比如说1秒,如果矿工在一秒之内完成了几次任务,说明矿池当前给到的难度低了,需要调高,反之。如此下来,经过一段时间调节,矿池能给矿工分配合理难度,并计算出矿工的算力。

矿池通过getblocktemplate协议与网络节点交互,以获得区块链的最新信息,通过stratum协议与矿工交互。此外,为了让之前用getwork协议挖矿的软件也可以连接到矿池挖矿,矿池一般也支持getwork协议,通过阶层挖矿代理机制实现(Stratum mining proxy)。须知在矿池刚出现时,显卡挖矿还是主力,getwork用起来非常方便,另外早期的FPGA矿机有些是用getwork实现的,stratum与矿池采用TCP方式通信,数据使用JSON封装格式。

先来说一下getblocktemplate遗留下来的几个问题:

矿工驱动:在getblocktemplate协议里,依然是由矿工主动通过HTTP方式调用RPC接口向节点申请挖矿数据,这就意味着,网络最新区块的变动无法及时告知矿工,造成算力损失。

数据负载:如上所述,如今正常的一次getblocktemplate调用节点都会反馈回1.5M左右的数据,其中主要数据是交易列表,矿工与矿池需频繁交互数据,显然不能每次分配工作都要给矿工附带那么多信息。再者巨大的内存需求将大大影响矿机性能,增加成本。

Stratum协议彻底解决了以上问题。

Stratum协议采用主动分配任务的方式,也就是说,矿池任何时候都可以给矿工指派新任务,对于矿工来说,如果收到矿池指派的新任务,应立即无条件转向新任务;矿工也可以主动跟矿池申请新任务。

现在最核心的问题是如何让矿工获得更大的搜索空间,如果参照getwork协议,仅仅给矿工可以改变nNonce和nTime字段,则交互的数据量很少,但这点搜索空间肯定是不够的。想增加搜索空间,只能在hashMerkleroot下功夫,如果让矿工自己构造coinbase,那么搜索空间的问题将迎刃而解,但代价是必要要把区块包含的所有交易都交给矿工,矿工才能构造交易列表的Merkleroot,这对于矿工来说压力更大,对于矿池带宽要求也更高。

Stratum协议巧妙解决了这个问题,成功实现既可以给矿工增加足够的搜索空间,又只需要交互很少的数据量,这也是Stratum协议最具创新的地方。

再来回顾一下区块头的6个字段80字节,这个很关键,nVersion,nBits,hashPrevBlock这3个字段是固定的,nNonce,nTime这两个字段是矿工现在就可以改变的。增加搜索空间只能从hashMerkleroot下手,这个绕不过去。Stratum协议让矿工自己构造coinbase交易,coinbase的scriptSig字段有很多字节可以让矿工自由填充,而coinbase的改动意味着hashMerkleroot的改变。从coinbase构造hashMerkleroot无需全部交易,

如上图所示,假如区块将包含13笔交易,矿池先对这13笔交易进行处理,最后只要把图中的4个黑点(Hash值)交付给矿工,同时将构造coinbase需要的信息交付给矿工,矿工就可以自己构造hashMerkleroot(图中的绿点都是矿工自行计算获得,两两合并Hash时,规定下一个黑点代表的hash值总是放在右边)

。按照这种方式,假如区块包含N笔交易,矿池可以浓缩成log2(N)个hash值交付给矿工,这大大降低了矿池和矿工交互的数据量。

Stratum协议严格规定了矿工和矿池交互的接口数据结构和交互逻辑,具体如下:

1.矿工订阅任务

启动挖矿机器,使用mining.subscribe方法链接矿池

返回数据很重要,矿工需本地记录,在整个挖矿过程中都用到,其中:

Extranonce1,和 Extranonce2对于挖矿很重要,增加的搜索空间就在这里,现在,我们至少有了8个字节的搜索空间,即nNonce的4个字节,以及 Extranonce2的4个字节。

2.矿池授权

在矿池注册一个账号,添加矿工,矿池允许每个账号任意添加矿工数,并取不同名字以区分。矿工使用mining.authorize方法申请授权,只有被矿池授权的矿工才能收到矿池指派任务。

3.矿池分配任务

以上每个字段信息都是必不可少,其中:

有了以上信息,再加上之前拿到的Extranonce1和Extranonce2_size,就可以挖矿了。

4.挖矿

1)构造coinbase交易

用到的信息包括Coinb1, Extranonce1, Extranonce2_size以及Coinb2,构造很简单:

为啥可以这样,因为矿池帮矿工做了很多工作,矿池已经构建了coinbase交易,系列化后在指定位置分割成coinb1和coinb2,coinb1和coinb2包含指定信息,比如coinb1包含区块高度,coinb2包含了矿工的收益地址和收益额等信息,但是这些信息对于矿工来说无关紧要,矿工挖矿的地方只是Extranonce2的4个字节。另外Extranonce1是矿池写入区块的指定信息,一般来说,每个矿池会写入自己矿池的信息,比如矿池名字或者域名,我们就是根据这个信息统计每个矿池在全网的算力比重。

2)构建Merkleroot

利用coinbase和merkle_branch,按照上图方式构造hashMerkleroot字段。

3)构建区块头

填充余下的5个字段,现在,矿池可以在nNonce和Extranonce2里搜索进行挖矿,如果嫌搜索空间还不够,只要增加Extranonce2_size为多几个字节就可轻而易举解决。

5.矿工提交工作量

当矿工找到一个符合难度的shares时,提交给矿池,提交的信息量很少,都是必不可少的字段:

矿池拿到以上5个字段后,首先根据任务号ID找出之前分配任务前存储的信息(主要是构建的coinbase交易以及包含的交易列表等),然后重构区块,再验证shares难度,对于符合难度要求的shares,再检测是否符合全网难度。

6.矿池给矿工调节难度

矿池记录每个矿工的难度,并根据shares率不断调节以指定合适难度。矿池可以随时通过mining.set_difficulty方法给矿工发消息另其改变难度。

如上,Stratum协议核心理念基本解析清楚,在getblocktemplate协议和Stratum协议的配合下,矿池终于可以大声的对矿工说,让算力来的更猛烈些吧。