比特币挖矿原理

比特币挖矿是通过解决复杂的数学问题来确认交易并添加到区块链中的过程。在比特币网络中,所有的交易都被打包成一个区块,然后通过挖矿节点竞争来解决一个数学难题。这个数学问题是一个哈希函数,挖矿节点需要不断尝试不同的随机值,直到找到一个符合特定条件的“幸运数值”。

欧易
欧易(OKX)

全球三大交易所之一,注册领50U数币盲盒,币圈常用的交易平台!

币安
币安(Binance)

币安交易所是世界领先的数字货币交易平台,注册领100U。



比特币系统节点

比特币系统中存在两种节点,一种是全节点,一种是轻节点。

全节点特点:

首先,全节点保持一直在线,成为比特币网络的稳定节点。这意味着无论何时,全节点都能响应网络中的数据请求,确保交易的及时处理和验证过程。而这一点对于网络的去中心化和安全性至关重要。

其次,全节点在本地硬盘上维护完整的区块链信息。这样做的目的是为了能够独立验证每一笔交易的有效性,而不依赖于第三方服务。这种独立性保证了交易数据的可靠性和安全性。

第三,全节点在内存中维护着UTXO(未花费交易输出)集合,以便快速检验交易的正确性。通过实时更新和维护UTXO集合,全节点能够有效地验证交易并防止双重支付等欺诈行为的发生。

此外,全节点不仅监听比特币网络上的交易信息,还验证每个交易的合法性。这种实时的监控和验证机制,有助于防范恶意交易和保护网络的安全。

决定哪些交易会被打包进下一个区块也是全节点的职责之一。通过自身的验证能力和算法,全节点能够选择最合适的交易,并将其打包进区块中。这一过程不仅保证了交易的顺利进行,也有助于维护网络的高效性。

另外,全节点还会监听其他矿工挖出的区块,并验证其合法性。这种对区块的验证工作,有助于防止恶意矿工篡改区块数据,确保整个网络的安全性和公正性。

最后,全节点还参与挖矿的过程。全节点需要决定沿着哪条链继续挖掘,以确保网络的连通性和稳定性。同时,在出现等长的分叉时,全节点会选择哪一个分叉进行挖矿,以保证网络共识的一致性和完整性。

轻节点(SPV client)特点:

首先,轻节点不需要一直保持在线,这使得用户可以更加灵活地使用比特币网络。相比之下,全节点需要始终在线以确保网络的健康运行。对于那些对在线时间有限的用户来说,轻节点是一个理想的选择,因为它们可以更好地适应用户的需求。

其次,轻节点只需要保存每个区块的块头而不是整个区块链。块头包含了区块的重要信息,如哈希值、时间戳和难度目标。通过仅保存块头,轻节点可以在保持存储空间效率的同时,获得足够的信息来验证区块链的工作量证明。

此外,轻节点只保存与自己相关的交易,这进一步减少了存储需求。尽管轻节点无法校验大多数交易的合法性,但它们仍然可以验证与自己相关的交易,从而确保自己的交易安全可靠。

不过,正如所描述的那样,轻节点无法检测网上发布的区块的正确性,这意味着用户需要谨慎对待从外部来源获取的区块信息。此外,轻节点可以验证挖矿的难度,这有助于确保区块链网络的安全性和稳定性。

最后,需要注意的是,轻节点只能检测哪个是最长链,而不知道哪个是最长合法链。这是因为轻节点无法检测交易的合法性。因此,轻节点必须假设矿工都会选择沿着合法的最长链挖矿,以确保网络的一致性和连续性。

比特币网络中大部分节点都是轻节点。如果只需要进行转账等交易,而不进行挖矿,那么只需要运行一个轻节点即可。

比特币挖矿过程中的问题

比特币挖矿的过程中,如果监听到区块链上新发布了一个区块,那么本地节点就需要停止当前的工作,重新组装一个候选区块来挖。因为区块链上的这个新区块里面包含的交易会影响本地正在挖的这个区块的内容,需要重新打包交易计算MerkleRootHash,另外指向前一个区块的哈希指针也需要指向这个区块链上新发布的这个区块。

前面已经挖了很久的工作就白白付出了,但这不需要可惜,因为挖矿的一个性质是无记忆性,前面挖的结果不影响后面。所以无论是继续挖之前的区块,还是停下来组装新的区块重新开始挖,成功的概率是相同的。只要当前还没有挖到nonce,前面无论做多少工作对后面的结果都没有影响。

即使自己挖出来了nonce,也不一定会被写到区块链里。例如可能会出现race condition,自己所在的分叉不是最长合法链。也可能因为一些其他原因导致自己存储的交易和其他区块有冲突,被判断为double spending导致验证不通过。

比特币挖矿的设备

早期比特币挖矿设备

比特币挖矿原理

最早的时候,是使用的CPU进行挖矿,专门使用一台计算机来进行挖矿。但这样做是很不划算的,计算机中的内存很大一部分是闲置的;CPU也只用到了通用CPU的某几个指令,大部分资源也是闲置的;硬盘和其他很多资源也都是闲置的。随着挖矿难度的提高,使用通用计算机的CPU挖矿就因为性价比变得无利可图。

挖矿的第二代设备就是GPU。GPU挖矿的效率相较于CPU有了很大的提高。GPU主要用于大规模的并行计算,例如深度学习中需要用到的计算大量的矩阵乘法。但是GPU设计的是用来做通用并行计算,用来挖矿时依然会有很多部件被闲置,例如用于浮点数计算的资源。这部分资源对于深度学习很重要,但是挖矿只涉及整数运算,也会对设备造成很大的浪费。而且随着挖矿难度的提升,使用GPU挖矿也越来越不划算。

挖矿的第三代设备是ASIC芯片(Application Specific Integrated Circuit,专用集成电路)。专门用于挖矿的集成芯片,上面没有多余的电路逻辑,整个芯片就是为了比特币的挖矿哈希值计算而设计的,所以性价比最高。但是这种芯片功能单一,只能用来挖这一种加密货币,不能做其他事情,甚至连挖其他加密货币也不行,除非这两种加密货币用同一种mining puzzle。但是这种ASIC芯片的研发时间很长,在这个时间内,如果这种芯片对应的加密货币价格出现巨大的变化,这款芯片的前期投入就很可能打水漂。而且随着竞争越来越激烈,定制的ASIC芯片可能用不了几个月就过时了,就需要重新更换更强大的芯片。

ASIC芯片设备问题

购买一台比特币矿机ASIC芯片,一般是需要提前预定的。而一款新的ASIC只有在刚出来的前几个月内在算力上有优势。所以就会出现一些无良的厂家:在芯片制造出来之后,不急于交货,而是告诉买家芯片还处于测试期,厂家自己先用生产出来的芯片挖矿两个月,之后再交付买家。这时候,因为厂家的芯片算力强、矿机多,所以会造成比特币的挖矿难度有个突然的上升。

出现这种算力集中在大厂商手中的情况,与比特币设计的初衷“去中心化“是相违背的。”去中心化“是希望大家都使用家里电脑CPU进行挖矿,即使是不懂IT的人可以参与。

所以,后面新出来有些加密货币,在设计mining puzzle时,设计的是Alternative mining puzzle,设计这种puzzle出发点是ASIC resistance(抗ASIC芯片化),让通用计算机也能参与挖矿过程。

大型比特币矿池

比特币矿池的好处

比特币挖矿的另一个趋势是大型矿池的出现。

单个矿工即使用了ASIC芯片,从平均收益上挖矿有利可图,但是收入也是很不稳定的。虽然用上了ASIC芯片,单个出块奖励也很高,但是要挖很长时间才能出块,就像买彩票中奖几率很小,挖到时就像中了大奖,挖不到时那些电费就白白付出了。

单个矿工,作为一个全节点,除了挖矿外,还需要承担全节点的其他责任,任务很重。

比特币矿池,就是把这些矿工组织起立,作为一个整体。

矿工们只负责计算哈希,全节点的其他功能都由矿主负责。(ASIC芯片只能负责计算哈希值,不能处理全节点的其他功能)。

矿工的收入也变得稳定。

比特币矿池结构

比特币矿池的架构一般是:一个全节点,驱动很多矿机。

比特币挖矿原理

比特币矿池收益分配

比特币矿池还解决了收入不稳定的问题,很多节点一起挖矿,出块了有了收益一起分配。

比特币矿池一般有两种组织形式:

●类似大型数据中心,有成千上万个矿机,如果这些矿机属于同一个机构。那么收益的分配只取决于这个机构如何分配

比特币矿机来自不同机构。分布式的,矿工和矿主不在同一个位置。矿工要加入这个矿池,只需要根据这个矿池规定的通信协议与矿主进行联系,矿主把要计算的哈希值的任务分配给矿工,矿工计算完后把结果返回给矿主,将来有出块奖励时一起参与分红。

对于第二种组织形式,在进行分红时需要按照每个矿工的贡献大小来进行分配。这个贡献大小也需要一个工作量来证明。

区块的挖矿难度很高,可能一个矿工一两年也不能出块,所以矿工的工作量不能通过出块来证明。

矿主可以将挖矿难度降低,设计一个比较低的目标阈值。当矿工挖到符合矿主设置的目标阈值时,就作为一个区块提交给矿主。这样的区块叫做share,是一个almost valid block。这种share对于矿主来说没有其他实际意义,因为它不能作为一个区块被写入区块链,但是这种share可以被用来当做矿工的工作量证明。矿主可以根据矿工提交了多少个share来判断其工作量,决定其分红。

比特币矿工可能存在的问题

比特币矿工挖矿的过程中,如果挖出来了成功的区块,但是没有提交给比特币矿主,而是自己私自发布。

私自发布区块这种对比特币矿工其实是没有用的。因为区块是由矿主组装的,矿主去修改CoinBase并分配nonce给矿工进行计算,区块中的铸币交易的收款人写的是矿主的公钥。即使比特币矿工私自提交区块,最终也是矿主得到了出块奖励。所以,只要比特币矿工是按照矿主分配的任务进行比特币挖矿的,就不可能偷出块奖励。

比特币矿工收到比特币矿主的任务后,将其中铸币交易的收款人改为了自己,然后将计算得出的Share提交给矿主。

这样的Share在矿主那边是校验不通过的,因为修改了铸币交易,就会导致MerkleRoot的哈希值就会发生变化,所以这样的Share是无法当做矿工的工作量证明的。就等于矿工在自己单干,和矿池没有关系。

比特币矿工在挖矿的过程中,挖到了区块,而故意丢弃掉不提交给比特币矿主,这种情况是可能会存在的。

虽然这种情况对这个矿工本身来说是不经济的,意味着他和其他矿工将无法通过这个区块得到分红奖励,只能依然可以依靠其他矿工提交的区块的报酬和自己的Share得到一些分红。但这种情况确实是可以存在的,矿池与矿池之间是竞争关系,有些矿池为了扰乱敌对的矿池,会故意派一些这样的“卧底”矿工去进行捣乱。

比特币矿池的危害

在比特币系统中,矿池的算力占据了整个系统算力的很大部分。

曾经GHash.IO矿池一度占据了整个比特币系统中51%的算力,已经有能力进行51%attack,统计发布后造成了恐慌,后来GHash.IO主动大幅度降低了自己的算力。

后来虽然GHash.IO运营不下去了,但是挖矿集中化的趋势依然没有消失,几个大的矿池依然占据整个系统算力的很大一部分。

虽然看上去每个矿池都没有占据51%的算力,但也可能只是表面现象。可能会有这么一个机构,它拥有超过51%的算力,但是并没有集中到一个矿池中,而是分散隐藏在很多个矿池中,真正需要发动攻击时再集中起来发动攻击。而转换一个矿池是非常简单的,矿工只需要按新的矿池协议联系另一个矿主即可转换矿池。

在矿池出现前,单个节点想要控制51%的算力是很难的。但是矿池出现后,只要这个节点能够吸引到51%算力的其他不明真相的矿工,就可能发动51%攻击。正常矿池经营时,矿主会通过收取出块奖励分红、抽取交易费等形式收取管理费,但是恶意的矿主在发动攻击前,可能会故意将管理费降到很低甚至赔本来吸引大量的矿工扩大算力,最后进行攻击。类似于云计算中的on demand computing(按需计算,平时不需要自己维护很大的计算集群,需要用时可以随时召唤)。

算力也并非一定要达到51%,这只是一个概率。而且每个矿池所占的比重本身也只是一种估计,而且算力一直在不断变化。

51%攻击

分叉攻击

如果掌握了51%以上算力,最常见的是可以发动分叉攻击:

A转账给B一笔钱写到了区块1中,并经过了6 confirmation。此时B看到已经有了6 confirmation,认为交易已经不能篡改,账户已经收到钱。然后恶意节点将A转账给自己另一个账户A2的交易写到区块A,并将区块A也连接到区块0上。这时区块A如果想要生效,就需要将自己变为最长合法链。正常算力的节点要做到这点是很难的,但是如果节点掌握了51%算力,那么区块A的分叉出块速度就会大于区块1分叉的速度,最终可以让区块A的链成为最长合法链。

而“被迫’参与这次攻击的矿工是不明真相的,只是在负责计算矿主分配的哈希,并不知道往上层发生了哪些交易,根本不知道在参与分叉攻击。

比特币挖矿原理

Boycott

除了分叉攻击,拥有51%算力的矿主还可以进行Boycott攻击(封锁境域):

比特币挖矿原理

攻击者不喜欢某个竞争对手账户A,想封锁掉A账户,所有和A账户相关的交易都不允许上链。如果有人将A转账给B的交易发布到区块链上,他马上进行分叉,产生一个不包含A账户交易的区块。

这种攻击类似于分叉攻击,但是稍有不同。它不需要等待6个confirmation之后再分叉(分叉攻击中需要等6个confirmation,让对方账户以为自己收到钱之后再攻击回滚交易)。只要发现有包含A账户的交易的区块上链,就马上进行分叉,并将自己的分叉变为最长合法链。

这样慢慢的,别的诚实的矿工最后也不敢打包A的交易,因为如果打包了A的交易,就会被攻击者分叉变将自己的区块为orphan block,自己挖的区块就白白浪费了。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...