0%

BTC七---挖矿

挖矿

回顾

比特币网络中大部分节点是轻结点,如果只需要转账,不需要挖矿的话,没必要运行一个全节点。

在挖矿过程中,如果你监听到别人发布了一个区块,这个区块是合法的,也是在延伸最长合法连,这个时候你应该停止已有的挖矿,然后重新在本地组装一个侯选区块,重新挖矿,因为你要沿着这个新发布的区块向下挖的话,那么你本地所组装的这个区块中,包含的交易就会发生变化,有些交易可能已经包含到已经被发布的这个区块里了,block header的内容也会发生变化,Merkle tree的根哈希值,以及指向前一个区块的指针,这样做是不是有些可惜?

其实是不可惜的,因为前面我们提到一个挖矿的性质:无记忆性memory less(process free),所以你是坚持挖原来的区块,还是改成挖一个新组装的区块,成功的机率是一样的。

即时挖到了合法的区块,发布到区块链上,也不是说就是胜利了,有可能你发布的这个区块,最终没有成为最长合法链,

可能存在一些risk condition,别人同时发布了一个合法的区块,或者是存在一些你不知道的double spending,使得你这个区块中某些交易最后是有冲突的。

比特币是怎么保证安全性的?两方面

一方面:密码学上的保证:别人没有你的私钥,就不能伪造你的签名,这个的前提是,系统中拥有大多数算力的矿工是好的,是遵守协议的;

另一方面:共识机制。

挖矿相关

挖矿的设备:越来越趋向于专业化,最早的时候大家都是用普通的cpu去挖矿。

如果现在,你专门买一台计算机用来挖矿,其实是不划算的,因为计算机中的大部分内存都是闲置的,挖矿只用到其中很小一部分内存,cpu中的大部分部件也是闲置的,因为挖矿的操作只用到了通用cpu中的很少的一部分指令,硬盘和其他很多资源也用不到。

第二代:GPU–>比cpu挖矿的效率高得多,GPU用于大规模的并行计算(像深度学习就用到了GPU,其中有很多矩阵的乘法),但是GPU用来挖矿,其实还是有点浪费的,里面有很多部件仍然处于闲置状态,比如用于浮点数计算的部件(比特币的挖矿只用到了整数计算)

最近几年,GPU价格上涨的很快,有些人把它归于深度学习的火热,其实有很多GPU是用来挖矿的,不过有个好消息,现在比特币挖矿难度的提升,用GPU挖矿已经划不来了,所以都不竞争去买GPU用于挖矿了。

现在用什么挖矿?用ASIC(Application Specific Integrated Circuit)芯片,它上面没有多余的电路逻辑,整个芯片就是为了比特币挖矿计算哈希值的操作而设计的,性价比最高,而且,为某一种加密货币设计的ASIC芯片,只能用来挖这一种加密货币,除非这两个加密货币使用同一个mining puzzle,有些加密货币新发行的时候,为了解决能源启动问题,他故意用一个已有的加密货币的mining puzzle,可以吸引更多的人来挖矿,这样的mining puzzle叫做merge mining。

ASIC芯片的研发周期是很长的,比特币的ASIC的芯片需要使用一年的时间,已经算是很快了,创造了ASIC芯片史上的奇迹,在这么长的时间里面,如果比特币的价格发生了很大的变化的话,前期投入的研发费用有可能就打水漂了。

即时在比特币发展的黄金时期,比特币价格上涨,挖矿是有利可图的,但是竞争也是越来越激烈的,定制的ASIC芯片可能用不了几个月就过时了,相当于一个军备竞赛。

有研究表明,大部分的ASIC矿机,利润是在他上市的前两个月获得的,这个时候的算力在同类产品中最强,所以购买ASIC矿机的时机很重要,现在一般都是提前预定,如果不能及时发货,对矿工就有损利益,有些不良厂商,生产出了矿机,不立即发售,而是自己先用他挖矿

有些新的加密货币设计的是Alternative mining puzzle 设计的初衷是:ASIC resistance(能够抗ASIC芯片化,目的是为了让通用的计算机也能参与挖矿)

挖矿的另一个趋势是:大量矿池的出现,单个矿工,即使用了ASIC芯片,挖矿从平均收益上看,是有利可图的,但是收入是十分不稳定的:比特币的平均出块时间是10分钟,但是这是总的矿工的平均,从单个矿工来看,可能他要挖一两年才出一个区块,就有点买彩票的意味了;单矿工还要面临一个困难:他除了挖矿之外,还要承担全节点的责任。


矿池:就是把矿工组织起来,作为一个整体,矿池的架构是:一个全节点,会驱动很多的矿机

miner只负责计算哈希值,pool manager承担全节点的其他职责,pool manager负责监听网上的交易,把这些交易组织打包成一个候选区块,同时看有没有其他的节点抢先发布区块。

矿池还能解决矿工收入不稳定的问题,有了收入,一起分配。分配的问题:如果矿机和矿池是分布式的(不在同一个机构),矿工和矿主不在同一个地方,矿工要加入一个矿池,就是按照这个矿池规定的通信协议,跟矿主练习,矿主把要计算的哈希值的任务分配给他,矿工计算完之后,把结果返回,有出矿奖励大家一起分配,如何分配?

平均分配?明显的问题是吃“大锅饭”,干好干坏一个样;因此要按照每个矿工的贡献大小进行分配:这个地方同时需要工作量证明,如何证明?

矿工的收入不稳定是因为挖矿太难了,如果降低难度,收入就能稳定,怎么降低难度?原来的要求,找到nonce,匹配target,和block header算哈希前面至少70个零,现在降低难度,前面只要有60个零就行,这样挖到的叫做一个

sharealmost valid block,矿工挖到这样一个share之后,把他提交给矿主。

矿主拿到share有什么用?这个除了证明矿工的工作量之外,没有其他的用处,不可能发不出去,因为这个区块不是合法的,所以矿主就记录每个矿工提交了多少个share,将来等到某个矿工真的挖到了某个区块之后,再把这个出块奖励,按照每个矿工提交的share的数目分配。

每个矿工挖到矿的概率取决于他尝试的nonce的数目,尝试的nonce越多,share就越多,所以可以把share作为工作量的衡量。

有没有可能矿工挖到了区块之后,不把他提交给矿主,自己独享?

每个矿工的任务是由矿主来决定的,矿主负责组装好区块,然后让矿工尝试nonce,而且,光是调整nonce是不够的,还要调整coinBase parameter,所以矿主可能就是把不同的coinbase parameter对应的nonce的范围交给不同的矿工去尝试,那么这个区块里面包含了什么?

coinbase transaction里面有个收款人的地址,这个地址填的是矿主的地主,如果矿工不提交给矿主,他是收不到钱的。

他不可能偷出块奖励,但是她有没有可能捣乱?(平时挖到一个share,作为工作量证明,但是等他真正挖到一个合法的区块的之后,他把它扔掉)

但是这样做对他来说并没有什么经济上的好处,矿池之间是存在竞争关系的,有可能为了打击竞争对手,故意派一些矿工到对手的矿池里挖矿,“卧底”!

​ 矿池在各个国家的分配比例

​ 2014年 GHash.IO矿池总算力占到了全球的51%以上

已经可以发动51攻击了!(当时引起了恐慌)

GHash主动降低总算力,以免动摇大家对比特币的信心

​ 2018年算力分布

假设一个机构有了一半以上的算力,他不一定要把算力都集中在一个矿池里,它可以把算力分不到不同的矿池里,平时是隐藏的,真正需要发动攻击的时候就结合起来。

矿工转换矿池是很容易的,所以这就是矿池带来的一个危害,如果没有矿池要发动51攻击的话,攻击者要投入大量的硬件成本来购买到足够的矿机,能够达到系统中半数以上的算力。

一般来说,pool manager也要收取一部分的出块奖励作为管理费,有的有恶意的矿池在发动攻击前,故意把矿池的管理费降得特别低,甚至是赔本,吸引到足够多的矿工之后,就可以发动攻击了。


假设有矿池达到了51%的算力,他具体能发动什么攻击呢?

分叉攻击

Boycott:封锁禁域。所有有关某个节点的交易,他都不包含进去,而且这个攻击也不需要等待6个确认,仗着自己的算力强,公开抵制有关某个结点的交易。

攻击者的矿池中事不明真相的矿工群众,因为每个矿工只是计算哈希值,他并不知道网上有什么样的交易,发布了什么区块,并不知道double spending的存在。

另外,不要把51%的阈值,当成一个门槛,这个其实都是概率,而且,每个矿池所占的算力比重,本身也是一种估计而已,而且实时变化

总结

大型矿池的出现,有一定的好处:给矿工减轻了负担,收入分配也更加稳定。

也有一定的危害:发动51攻击更容易了 on demand mining