区块链学习笔记7——比特币挖矿

七、比特币挖矿

前面说过,比特币中有两种节点,一种是全节点,一种是轻节点

全节点的职责

全节点一般是一直在线的,在本地硬盘上维护完整的区块链信息,在内存中要维护UTXO集合,以便快速检验交易的正确性,监听比特币网络上的交易信息,然后验证每个交易的合法性,有没有合法的签名,是不是double spending ,全节点要决定哪些交易会被打包到区块里,那么缺省状况下,只要是合法的交易,并且交易费符合要求,就会被打包进去,同时监听别的矿工挖出来的区块,验证其合法性,那么这个验证从三个方面验证,首先验证每个交易都要合法,包括这个铸币交易,比如说有没有篡改block reward,出块奖励现在是12.5个比特币,是不是发生篡改,发布的区块是不是符合难度要求的,通俗地说,检查一下block header取哈希值之后前面有没有足够多的零,同时也要检查一下block header里面难度目标域值设置是不是正确的,然后,这个全节点每两周还要按照比特币协议的要求,调整挖矿难度,第三点,检查一下,这个区块是在延伸最长合法链。然后就是挖矿,前面这些步骤都是在为挖矿做准备,这一步才是真正带来收益的挖矿,这个要分为两部分,第一个就是决定沿着哪条链挖下去,缺省情况下,应该是沿着最长合法链挖下去。当出现等长的分叉的时候,选择哪一个分叉,缺省情况下,是选择最先听到的那个分叉。

区块链学习笔记7——比特币挖矿_第1张图片

轻节点的职责

轻节点一般来说不是一直在线的,而且轻节点也不用保存整个区块链的信息,只要保存每个区块的header就可以了,这个大小差不多差了1000倍,就是存整个区块,和只存block header,差不多有1000倍的大小,轻节点不用保存全部的交易,只要保存与自己相关的交易就行了,也没有办法验证大多数交易的合法性,因为没有保存完整的交易信息,就没有办法检测double spending ,只能检测与自己相关的交易的合法性, 无法检测网上发布的区块的正确性,因为没法检测区块里所包含的交易是不是合法的,但是可以验证挖矿的难度,就发布的区块是不是符合难度要求,这个轻节点是可以验证的,因为挖矿的时候计算哈希值只用到了块头的信息,而块头的信息轻节点是保留的,所以轻节点虽然没有办法检查网络上发布的这些区块所包含的交易的合法性,但是可以检查发布的区块是符合难度要求的,轻节点假设发布这个区块的全节点

是不会把非法的交易发布出来的,因为发布这样的交易对他没有好处,轻节点只能检测哪个是最长链,不知道哪个是最长合法链,轻节点假设矿工都是有理智的,不会沿着不合法的链挖下去,因为挖出一个区块的代价是很大的,所谓的工作量证明,要做很多的工作,才能把一个区块挖出来,如果发现挖出来的区块包含非法交易的话,那就白挖了,所以轻节点假设全节点,矿工不会干这种事情。
区块链学习笔记7——比特币挖矿_第2张图片

挖矿的注意事项

比特币网络上中,大部分节点都是轻节点,如果只是想进行转账,不需要挖矿的,那么 没必要运行一个全节点,就用一个轻节点就可以了。在挖矿过程中,如果监听到别人发布了一个区块,这个区块是合法的,也是在延伸最长合法链,这个时候应该停止已有的挖矿,然后在本地重新组装一个候选区块,然后重新进行挖矿,因为要沿着这个新发布的区块往下挖的话,那么本地组装的区块中,包含的交易就会发生变化,有些交易可能包含到被发布的新的区块里面了,另外这个block header里面的内容也会变化,像这个Block header里有交易所组成的Merkcle tree的根哈希值,还有指向前一个区块的指针,这些也都会发生变化,所以要停止已有的挖矿,重新组装一个候选区块,然后从头开始挖,那这样做是不是有些可惜,就我费了半天劲,已经挖了很长时间了,现在呢,别人发布一个新的区块,我前面都白挖了,我得重新组装一个区块,然后再继续挖,这个是不是比较可惜,其实不可惜的,因为前面讲过,挖矿的一个性质,无记忆性memoryless,也可以叫progress free,所以呢,无论是继续挖原来的区块,还是停下来,改成挖一个新组装的区块,成功的概率是一样的,只要当前没有挖到符合要求的nonce值,前面已经挖了多长时间其实是没有关系的,对最后的结果没有影响,所以这个是并不可惜的,即使挖到了合法的区块,发布出去,到区块链上,也不是说就胜利了,也许发布的这个区块最终没有成为最长合法链,可能存在一些别人同时发布了一个区块,或者存在一些不知道的double spending,使得区块中某些交易最终变得是有冲突的

比特币的安全性

比特币的安全性是从两方面来保证的。

一方面是密码学上面的保证,另一方面是共识机制。

密码学上的保证是别人没有你的私钥,就没有办法伪造你的签名,所以就不能够把你账上的钱转走,前提是,系统中拥有大多数算力的矿工是好的,是遵守协议的,不会接受那些没有合法签名的交易,如果没有这一点的话,密码学上的保证也就没有用武之地,就好比去银行里取钱,取钱的话得出示合法的证件,然后银行的工作人员才能把钱给你,那么这个合法得证件就相当于密码学上的签名,密码学上的性质保证了别人没有办法伪造你的签名,也就没有办法伪造你的身份,同时银行里的工作人员也要遵守规定,不会把钱交给没有合法证件的人,只有这两条合在一起,才能保证别人没有办法把你帐上的钱取走

挖矿的设备

挖矿设备的演化趋势越来越趋于专业化,最早大家使用普通的cpu去挖矿,向家里的计算机,笔记本电脑,都可以用来挖矿,但仔细想想,如果买一台计算机,专门是用来挖矿的话,其实是非常不划算的,计算机当中的大部分内存都是闲置的,挖矿只用到其中很少一部分内存,cpu当中的大部分部件也是闲置的,因为挖矿中计算哈希值的操作只用到了通用cpu当中的很少一部分指令,硬盘和其他很多资源也都是闲置的,所以呢,随着比特币挖矿难度的提高,用cpu挖矿,用通用计算机挖矿,很快就变得是无利可图了,因为性价比太低,所以呢,这个挖矿设备就转入第二代设备GPU,第一代是CPU,GPU挖矿比CPU挖矿已经是提高很多了,GPU只要适用于大规模的并行计算,像深度学习里面,用GPU用的很多,他有大量的矩阵乘法,但是GPU用来挖矿其实还是用点浪费的,GPU是为了通用并行计算而设计的,用来挖矿的话,里面仍然有很多部件是处于闲置状态

比如说用于浮点数运算的部件,这些部件对于深度学习来说是很重要的,深度学习计算梯度需要用到浮点运算,但是比特币的挖矿是用到整数操作,所以GPU对CPU是有很大程度的提高,但还是有不少浪费的,顺便说一下,最近几年,GPU的价格涨得很快,有些人就把他归结于深度学习的火热,其实有很多GPU是用来挖矿的,现在有个好消息,现在这个比特币挖矿难度的提升,用GPU挖矿已经是划不来了,已经超过了GPU的算力范围,所以的话,就没有那么多人因为竞争挖矿去买那么多GPU了,剩下这些CPU给深度学习,给打游戏之类的应用来服务,有一些新开发的加密货币有的还用GPU挖矿,现在用ASIC芯片挖矿,ASIC,Application Specific Integrated Circa,这是为了挖矿专门设计的芯片,上面没有多余的电路逻辑,整个就是为了比特币挖矿,计算哈希值的操作而设立的,

他的性价比是最高的,这个芯片也干不了别的,除了挖矿之外,别的什么也干不了,而且为了某一种这个加密货币设置的ASIC芯片是只能挖这种货币,挖别的就不行,除非两个加密货币用同一种mining puzzle,挖矿的时候求解的puzzle叫mining puzzle,有些加密货币新发行的时候为了解决能启动问题故意用一个已有的加密货币的mining puzzle,比如说跟比特币一样的mining puzzle,这样可以吸引更多的人来挖矿,这种情况叫做merge mining ,就除了这种情况之外,其他的就只能一个芯片只能为一个加密货币挖矿。ASIC这个芯片研发周期是很长的,一款芯片从设计,流片,到最后生产出来需要很长的周期。像比特币的ASIC芯片可能需要一年的时间,而这个已经算是非常快的,就是跟通用的芯片相比,这样的研发速度基本上是创造了芯片史上的奇迹,如果在这么长的周期里面,比特币的价格出现剧烈的变化的话,前期投入的研发费用有可能就打水漂了,从历史上看,比特币的价格变化是比较剧烈的,曾经发生了好几次,比特币的价格在几个月的时间内下跌了80%,然后又慢慢恢复到,这个放到股票市场上,基本上是不可以想象的,如果比特币价格大幅度下降的话,那么挖矿可能是赔本的。可能还抵不上电费,这就是用ASIC芯片挖矿的情况。即使是在比特币发展的黄金时期,价格不断上涨,这个时候挖矿是有利可图的,但是竞争也是越来越激烈的,定制的ASIC芯片可能用不了几个月就过时了,又得买新的更强大的芯片,就相当于军备竞赛,有研究表明,一款ASIC的矿机刚刚上市的时候,大部分的利润是在它上市的前两个月获得的,因为这个时候他的算力是在同类产品当中最强的,基本上头两个月,就能获得整个生命周期当中一半的利润,再往后,可能就会被淘汰掉了,后面会有更强的矿机出来,所以呢,该买ASIC矿机的时候,时机很重要,现在一般来说,都是需要提前预定的,就是要买ASIC矿机,要先交钱,然后过很长一段时间,厂商才能把矿机发给你,如果厂商不能够及时交货的话,那么对矿工是个很大的伤害,有些不良的厂商把ASIC矿机生产出来之后,不是马上提供给用户,而是自己用这个矿机先挖矿,挖一段时间,赚取比特币,等到赚取比特币的黄金时间,头两个月过去之后,才把这个矿机发给用户,他跟找一些借口,说我这个矿机还在生产测试当中,其实,真实生活中,也看得出来的,比特币的算力有了明显的提高,一般是某个大的厂商,他的新的矿机生产出来了,所以在比特币浪潮中,真正赚大钱的,不一定是那些挖矿,而是卖矿机的。

总结一下,挖矿趋势,是从通用变得越来越专用。

CPU是通用计算,GPU是通用并行计算,ASIC变成了挖矿专用,现在基本上都用ASIC挖矿,他除了挖矿也啥也干不了,他过时之后基本上就作废了,不想CPU和GPU还能用来干点别的,也有很多人认为这个情况是不好的,这跟当初说的去中心化的理念是不相符的,也违背了比特币设计的初衷,最民主的情况是大家都用CPU去挖矿,就用普通家里的计算机,就不论你是不是搞IT的,家里都有计算机,都可以用来挖矿。

进入GPU时代之后,用普通家里的计算机挖矿就很困难了,而且GPU的噪音特别大,如果一台计算机配上四块GPU的话,跑起来之后,这个噪音是很大的,基本上人在房间里,就没法呆下去,后面会讲到有些新的加密货币,叫做Alternative mining puzzle,设计这个的出发点叫ASIC resistance,能够抗ASIC芯片化,目的是为了让通用的计算机也能参与挖矿的过程。

挖矿的另一个趋势是大型矿池的出现,单个矿工,用ASIC芯片从平均收益上看,是有利可图的,但是他的收益是不稳定的,就比如说,比特币系统当中是平均每十分钟出一个区块,这是所有的矿工作为一个整体来看,平均十分钟会产生一个区块,但如果就某一个矿工来说,他可能要挖很长的时间才能够挖到一个区块,就用一台ASIC矿机,可能要用一到两年才能挖到一个区块,而现在的奖励是12.5BTC,这个还是值很多钱的,有好几万美元,这样一搞,就像买彩票,中奖的概率是很小的,但是你挖到了就等于中了一个大奖,挖不到,那些电费就白白交上去了。单个矿工还有其他问题,除了挖矿之外,还要承担全节点的其他责任,就是这篇文章开始讲的全节点的职责,全节点还是有很多事情要做的,他的任务还是挺重的,那怎么办呢,这就要引入矿池的概念,所谓矿石就是把矿工都组织起来作为一个整体,矿池的架构是,一个全节点会驱动很多矿机,一个矿池一般有一个矿主pool manager,下面连着很多矿工,这个矿工只负责计算哈希值,全节点的其他职责都由矿主承担,ASIC芯片只能负责计算哈希值,不能干全节点的其他功能,矿池的出现,另外一个目的,就是为了解决收益不稳定的问题,单个矿工的收益是不稳定的,所以大家都一起干,有了收益之后呢,大家一起分配一下,这就牵扯到如何分配的问题,矿池一般有两种组织形式,一种就是 像大型数据中心那样,就是有些互联网公司,他有成千上万的服务器,那么大的矿池里面也有成千上万的矿机,如果这些矿机是属于同一个 机构的话,收益的分配也就无所谓,也有的时候,矿机是来自不同机构的,第二种组织方式就是分布式的,这个矿工和矿主不在同一个地方,可能分布在世界各地,那么矿工要加入一个矿池,矿工要加入一个矿池,就是按照跟矿池的通讯协议,跟矿主进行联系,然后矿主把要计算哈希值的任务分配给它,矿工计算完之后,把结果返回给矿主,然后将来有出块奖励的时候,一起参与分红。那么如果矿工是来自于五湖四海的,不是属于同一个机构的,那么利益该怎么分配呢,平均分配行不行,比如说某个矿工挖到出块奖励,然后就平分给其他矿工,这样的话,干好干坏都一样,有的矿工可能就不干活了,因为你要挖矿,还要交电费,所以就尽量少挖,因为分配收益要按每个矿工的贡献大小进行分配,也就是说,这个地方也需要工作量证明,证明每个矿工所做的工作,那怎么证明每个矿工做了多少工作,其实这个很简单,为什么矿工的收益不稳定,因为挖矿太难了,如果把挖矿的难度降低之后,矿工的收益就会变得稳定了,怎么降低难度呢,比如说,原来矿工要找到一个nonce,用这个nonce计算block header的哈希值,前面至少有70个零才是合法的区块,这是原来的要求,现在我们降低挖矿难度后,比如说前面只要有60个零就行了,这样挖到的叫做一个share,这个share叫做almost valid block,挖到之后,提交给矿主,矿主拿到这个没有用处,这个除了证明矿工做的工作量,没有其他用处,这个矿主不可能把区块发布出去,得到别的什么奖励,因为这个区块不是合法的,所以矿主就记录一下,每个矿工,提交了多少了share,将来等到某个矿工真正挖到合法的区块之后,这个出块奖励再按照每个矿工提交的工作量,这个share的数目进行分配,这个方发是可行的。

每个矿工挖到矿的概率取决于他尝试的nonce数目,尝试的nonce越多,能够找到的share就越多,所以可以用这个矿工提交的share的数目作为他做了多少工作的衡量。

有可能有的矿工矿工会捣乱,比如说,他挖到一个合法的区块,但是不提交给矿主,这是可以的,这样对于他来说,并没有经济上的好处,但是矿池之间是存在竞争关系的,有可能为了打击竞争对手,故意派些矿工加入到竞争对手的矿池里挖矿,通过这种方法,起到一个搞破坏的作用,等于这些矿工还是参加了分红,分到的是别的矿工挖的出块奖励,他自己挖的就丢掉,这种搞破坏的方法。

下面是矿池的统计数据。

下面显示的是矿池在各个国家的分布比例,

区块链学习笔记7——比特币挖矿_第3张图片

中国的矿池的算力占了81%,远远超过别的国家,所以把中国的矿池的算力作为一个整体来看的话,在比特币系统中是占有绝对优势的。

区块链学习笔记7——比特币挖矿_第4张图片

如果看单个矿池的话,2014年的时候,曾经有个叫做GHash.IO的矿池,这个矿池的算力占了全球算力的一半以上,这在当时引起了恐慌,这51%的算力,足够发动攻击了,这个事情公布出来之后,GHash.IO这个矿池主动把算力占比大幅度的减少,以免动摇大家对比特币的信心。

区块链学习笔记7——比特币挖矿_第5张图片

这是目前的算力分布,看上去没有那么集中了,前面说的GHash矿池已经不存在了,早就停止运营了,当然,挖矿集中化的程度仍然是比较大的,几个大型矿池占了相当大的比重,但是没有哪个矿池占到一半以上的,这样看好像比较安全了,

但可能只是一个表面现象,假设某个机构有半数以上的算力,他不一定要把所有的算力都放在一个矿池里,而是可以把这些算力分散隐藏在很多个矿石里面,平时的时候,是分散隐藏的,要发动攻击的时候,再集中起来发动攻击,矿工转换矿池是很容易的,这也是矿池带来的一个危害,如果没有矿池的话,一个矿工自己要投入大量的硬件成本,来购买足够的矿机,来达到系统中半成以上的算力。

有了矿池之后,他自己可能只占很少比重的算力,只要能够吸引到足够多的矿工,就是不明真相的群众,加入到足够矿池里面来,就行了。一般来说,矿池的矿主要收取一定比例的出块奖励作为管理费,他要管理,经营这个矿石,他也是要有一定的收益的,按照一定的比例抽取管理费,也有的是按照出块奖励的比例抽取交易费,一些有恶意的矿池,在发动攻击之前,可能故意把管理费降的特别的低,甚至是赔本赚吆喝,吸引到足够多的矿工加入之后,然后发动攻击,这其实是大型矿池的一个弊病,使得51%的攻击更加容易了,那么假设有某个矿池占到了半数以上的算力,具体能够发动分叉攻击,Boycott。

A->B,(A转给B大量的比特币),经过六个确认之后,认为比特币已经安全了,然后呢,A在前面发动一个分叉攻击,把钱转给他自己,分叉攻击,要让下面那条链成为最长合法链,这个看上去追赶的道路是很漫长的,要比上面的要长,如果攻击者有51%的算力的话,下面那条链的增长速度是比上面那条链要快的,最终还是会成为最长合法链,到那个时候,A->B这个转账交易就回滚了。

区块链学习笔记7——比特币挖矿_第6张图片

为什么说攻击者里面的矿工是不明真相的群众,因为这个矿工只是计算哈希值,并不知道网上有什么样的交易,发布了什么样的区块,并不知道double spending的出现,根本就不知道有这种分叉攻击的存在,另外呢,不要把51%的域值当作是一个绝对的门槛,达到51%就可以发动攻击,不到51%就不能发动攻击,这个其实都是概率,而且每个矿池所占的算力比重本身也是一个估计而已,而且是在不断变化的,这是第一种分叉攻击。

Boycott,封锁,禁运。

比如某个攻击者不喜欢某个账户,比如说A这个账户,他怀疑这个账户,参与一些非法交易,想把这个账户封锁掉,所有跟A相关的交易都不让上链,那怎么办呢,如果有人把A->B的交易发布到区块链上,就会马上分叉,产生一个不包含这个交易的区块,就所有跟A有关的交易都不让进去,这种方法跟前面讲的回滚,double spending 的区别是,没有必要等后面六个确认区块,

区块链学习笔记7——比特币挖矿_第7张图片

这个区块一上链,就马上进行分叉,越早越好,因为是希望别人沿着你这个交易往下挖的。

总结一下

大型矿池有一定的好处,给矿工减轻了负担,矿工就只负责挖矿计算哈希值就行了,别的事情都可以由这个矿主完成,收入分配也就更加稳定。

也有一定的危害,就是发动51%的攻击变得更容易了,不一定自己有这么多算力,只要他能够动员召集起来这些算力就可以了。

你可能感兴趣的:(区块链,芯片,区块链,比特币)