《区块链技术与应用》——比特币挖矿笔记

发布于:2022-07-26 ⋅ 阅读:(2528) ⋅ 点赞:(2)

因某些原因,完整笔记详见挖矿完整笔记

  • 全节点

  • 轻节点 

比特币网络中大部分节点都是轻节点,如果只是转账而不是挖矿的话,没必要用全节点。

  • 挖矿过程中,如果你听到别人发布了一个区块,该区块是合法的,并且在延长最长合法链,该怎么办?

应该停止挖矿,然后重新在本地组装一个候选区块,从头开始挖矿。

  • 为什么要停止挖矿?

挖矿的一个性质是无记忆性,无论是继续挖原来的区块,还是停下来挖一个新组装出来的区块,成功概率相等。只要还没有挖到符合要求的nonce值,前面无论挖了多长时间都是无用功。
即使挖到了合法的区块,发布到区块链上,也不能保证胜利了。有可能你发布的区块最终没有成为最长合法链,可能存在一些冲突情况,别人可能同时发布一些合法的区块,或者存在一些你不知道的double spending,使得你的区块中的某些交易变成冲突的。

  • 为什么重新组装一个候选区块?

如果沿着新发布的交易往下挖,本地组装的区块中包含的交易就会发生变化,有些交易可能已经被包含到新发布的区块里。另外block header的内容也会发生变化,即block header里有交易所组成的merkle tree的根哈希值,还有指向前一个区块的指针。

  • 比特币是怎么保证安全的?

1.密码学

别人没有你的私钥,就没有办法伪造你的签名,所以不能把你账上的钱转走。(前提是系统中拥有大多数算力的矿工是好的并且遵守协议,不会接受那些没有合法签名的交易。如果没有,密码学保证也就没有用武之地)

2.共识机制

  • 挖矿的设备

挖矿设备演化趋势是越来越趋于专业化。

三个阶段:普通CPU -> GPU ->ASIC芯片

挖矿机的变化趋势,是从通用变得越来越专用,CPU是通用计算,GPU是通用并行计算,ASIC是专用计算。

  • 最早用CPU挖矿,像计算机、笔记本电脑。

一台计算机专门用来挖矿是非常不划算的,挖矿只用到其中很小一部分内存,导致大部分内存都是闲置的,挖矿计算哈希值的操作只用到了CPU当中的很少一部分指令,导致CPU当中的大部分部件也是闲置的。并且硬盘和其他很多资源也都是闲置的。所以随着比特币挖矿难度的提高,用CPU挖矿,显得性价比太低。

  • 第二代设备:GPU。

GPU主要用于大规模的并行计算,用来挖矿的话有很多部件仍然是出于闲置状态,比如说用于浮点数计算的部件。这些部件对于深度学习来说是很重要的,但比特币的操作只用到了整数挖矿。所以GPU虽然效率提高了很多但仍然有不小的浪费。不过有一些新开发的加密货币有的还在用GPU挖矿。

  • 现在更多用ASIC芯片(application-specific integrated circuit)挖矿

  • 相关介绍

这是专门为了挖矿而设计的芯片,上面没有多余的电动逻辑,整个芯片就是为了比特币挖矿、计算哈希值的操作而设计。它这个芯片除了挖矿什么事都干不了,而且为某一种加密货币设计的ASIC芯片,只能挖这一种加密货币。除非这两个加密货币用同一个mining puzzle。

  • 不利之处

ASIC一旦过时就作废了,不像CPU和GPU还能做其他工作。很多人觉得这是不好的,是跟去中心化的理念是不相符的,也违背了比特币设计的初衷。

有些新的加密货币设计的是Alternative mining puzzle。而设计它的出发点是asic resistance(抗ASIC芯片化),目的是让通用的计算机也能参与挖矿的过程。

  • 矿池

  • 矿池出现原因

单个矿工即使使用ASIC芯片,挖矿从平均收益上虽有利可图,但收入并不稳定。

比特币系统中平均每10分钟出一个区块,是将比特币系统中所有的矿工看作一个整体来看,平均10min会产生一个区块。但如果具体到某一个矿工来说,是概率问题,他可能要挖很长时间,这样就好像是买彩票,挖到了就是中了一个大奖。并且矿工除了挖矿之外还要承担全节点的其他责任。

  • 矿池概念解释

所谓的矿池,就是把矿工组织起来,作为一个整体,矿池的架构一般是一个全节点会驱动很多矿机,一个矿池有一个矿主,叫pool manager。下面连了很多矿工,这些矿工只负责计算哈希值,全节点的其他职责都由矿主来承担。他负责监听网上的交易,把这些交易组织打包成区块,同时要看一看监听其他节点是否抢先发布区块,如果有,考虑怎样进行调整。

  • 矿池组织形式

矿池一般有两种组织形式,集中式和分布式。

  • 集中式

像大型数据中心那样,比如有的互联网公司有成千上万个服务器,大的矿池里面也有成千上万的矿机,这些矿机如果是属于同一个机构的。

  • 分布式

矿工和矿主不在同一个地方,可能分散在世界各地。如果矿工要加入一个矿池,就是按照矿池规定的通讯协议跟矿主进行联系。矿主把计算哈希值的任务分配给他,矿工计算完之后,把结果反馈给矿主,将来获得出块奖励时一起分配。

  • 矿池收益分配

如果矿工是来自五湖四海的,不是属于同一个机构的,那么利益该怎么分配?

  • 平均分配

每个矿工挖到一个区块,得到了出块奖励,然后平分给其他矿工。但是这不可行,因为会有矿工偷懒。

  • 按劳分配

也就是这里需要工作量证明。

如果工作量证明是矿工找到的nonce个数,且使H(block header)<=target,这是很难的。因此,可以降低挖矿难度,矿工要找到一个nonce,用nonce计算block header 的哈希值,前面至少有70个0才是合法的区块,降低挖矿难度之后,比如说前面只要有60个0就行了,这样挖到的叫作一个share。这个share也可以称为almost valid block

矿工挖到share或almost valid block之后,把它提交给矿主。矿主只用其证明矿工所做的工作量,无法得到出块奖励以及任何好处。矿主统计每个矿工提交了多少share,将来等到某个矿工真正挖到了合法的区块之后,再将出块奖励按照每个矿工所做的工作量,提交的share数目进行分配。

每个矿工挖到矿的概率取决于他尝试的nonce数目,尝试的nonce越多,能找到的share就越多,因此这样的按劳分配是可行的。

  • 矿池其他问题

  • 有没有可能一个矿工挖到一个合法的区块之后,不把它提交给矿主,而是自己偷偷摸摸发布出去,得到出块奖励?即平时挖到的share提交,但挖到了合法区块就不提交?

不可能,因为每个矿工的任务是由矿主分配的,矿主负责组装好一个区块,然后交给矿工去尝试各种nonce,而且挖矿仅仅调nonce是不够的,还需要调整coinbase parameter。所以矿主会把不同的coinbase parameter所对应的nonce值的范围交给不同的矿工去尝试。coinbase transaction里面有收款人的地址,这个地址填的是矿主的地址,即pool manager的地址,所以矿工挖到区块之后,如果他不提交给矿主自己发不出去是没有用的。里面的收款地址是矿主的。

  • 如果矿工一开始就不管矿主的任务,自己组装一个区块,偷偷把收款地址改成自己地址,可行吗?

这种情况,矿工提交share给矿主,矿主是不承认的,因为里面交易列表被改过了,coinbase transaction里面的内容发生了变化,得出的merkle tree 的根哈希值也相应改变。这种情况下矿主不会给工作量证明,相当于矿工一开始就单干,跟矿池没有任何关系。

虽然不可能偷出块奖励,但会不会有人捣乱,比如平时挖到一个share,提交给矿主,作为工作量证明。等他挖到一个真正合法的区块之后,把它扔掉。这是有可能的,虽然没有经济好处,但有可能是别的矿池派来的卧底,不想让这个矿池得到区块奖励。这些矿工还是会分红,分的是别的矿工挖出来的出块奖励。

  • 矿池的不良影响

  • 矿池的一个弊端,使得51%的攻击更加容易了。

矿工转换矿池是很容易的,加入一个矿池就是按照这个矿池的协议跟这个矿主联系,矿池把组装好的区块信息发给矿工,矿工来尝试各种nonce值就可以了。

假如一个机构有一半以上的算力,他不一定要把算力集中在一个矿池里,而可以把算力分散隐藏在很多矿池里,真正需要发动攻击的时候再集中起来发动攻击。所以这就是矿池带来的危害,如果没有矿池,想要发动51%的攻击,攻击者要投入大量的成本来购买到足够的矿机,达到系统半数以上的算力。有了矿池之后,想要发动攻击的人,作为矿主可能只占很小一部分比例的算力,只要能够吸引到足够多的不明真相的矿工加入到他的矿池里来就行了。

一般来说,矿池的矿主要收取一定比例的出块奖励作为管理费。矿主也要按照比例收取管理费,有的是按照出块奖励的比例,也有的是抽取交易费。有的一些有恶意的矿池在发动攻击之前,可能故意把管理费降得特别低,甚至是赔本赚吆喝,吸引足够多的矿工加入之后就可以发动攻击。

  • 假如某个矿池占到了半数以上的算力,他具体能够发动哪些攻击呢?

  • 分叉攻击

假如一个区块链,其中一个区块包含了一大笔的交易,又等了几个确认区块之后,自认为已经安全了,可这时也可能有人在该交易前面的区块发动分岔攻击。

虽然看上去好像追赶的道路是很漫长的,但如果拥有51%的算力,最终还是可以成功攻击。另外,不要把51%当成绝对的槛,有可能不到51%就可以。算力都是估计的,而且算力还在不断变化。

  • boycott(封锁交易)

比如说攻击者不喜欢某个账户,怀疑某个账户参与非法交易,想把这个账户封锁掉,所有跟这个账户相关的交易都不让上链。假如A把某个交易A→B发布到区块链上,攻击者就会马上进行分叉,产生一个不包含这个交易的区块,所有跟A有关的交易也都不包含进去。

  • 两种攻击的区别

分叉攻击要等后面几个确认区块。这时候如果攻击者等待确认区块,是为了让B放心,B以为后面有六个确认区块,已经没事了,然后攻击者再发动分岔攻击。

而如果是boycott,就没有必要等后面区块生成。A→B交易一上链马上进行分岔,越早越好,因为攻击者是希望别人沿着他的链往下挖的。

  • 攻击者掌握51%的算力后,能否故意不把某些交易写入区块?

前面讲过,有些有恶意的节点故意不把某些交易写入区块里,是可以的。但没有关系,后面的区块还是会包含的。但是如果这个坏人拥有51%的算力的话,他可能仗着自己算力强,公开抵制他想抵制的交易。这样别的矿工也不敢随便把交易打包进去了。

  • 攻击者掌握51%的算力后,能否把别人账上的钱转走?

不可能。因为他没有别人账户的私钥,没有办法伪造签名。

如果他算力强,强行把一个没有合法签名的交易发布到区块链上,会有什么样的结果?

会造成分叉。因为诚实的矿工会沿着另外一个分岔去挖,不会沿着他发布的区块往下挖。所以盗币是不可能的。

  • 矿池总结:

矿池的出现减轻了矿工的负担,矿工只需要挖矿,计算哈希值就可以,其他事情都由矿主完成,并且矿工的收入分配也更加稳定。但矿池的出现也有危害,发动51%的攻击变得容易了。他自己不一定有这么强的算力,只要动员召集这些算力就可以了。这有点类似于云计算中的on demand computing。平时不需要维护很大的计算机群,需要用的时候可以随时召回来。而矿池的情况,是on demand mining。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到