全节点
- 一直在线
- 在本地硬盘上维护完整区块链信息
- 在内存中维护UTXO集合,以便快速检验交易的正确性
- 监听比特币网络上的交易信息,验证每个交易的合法性
- 决定哪些交易会被打包到区块里
- 监听别的矿工挖出来的区块,验证其合法性
- 挖矿时:
- 决定沿着哪条链挖下去
- 当出现等长分叉时,选择哪一个分叉
轻节点
- 不是一直在线
- 不保存整个区块链,只需要保存每隔区块块头
- 不保存全部交易,只保存和自己有关的交易
- 无法验证大多数交易合法性,只能检验和自己相关的交易合法性
- 无法检测网上发布的区块正确性
- 可以验证挖矿难度
- 只能检测哪个是最长链,不知道哪个是最长合法链
挖矿设备演化
挖矿设备演化趋势是逐渐趋于专业化。
大体上经历了三个阶段:普通CPU→GPU→ASIC芯片。
最早的时候用的是普通的CPU挖矿,像家里计算机、笔记本电脑。但如果买一台计算机专门用来挖矿是非常不划算的,计算机当中的大部分内存都是闲置的,挖矿只用到其中很小一部分内存,CPU当中的大部分部件也是闲置的,因为挖矿当中计算哈希值的操作只用到了通用CPU当中的很少一部分指令。硬盘和其他很多资源也都是闲置的,所以随着比特币挖矿难度的提高,用CPU挖矿,用通用计算机挖矿显得性价比太低。
所以挖矿转入第二代设备:GPU。GPU效率相比CPU提高了很多,主要用于大规模的并行计算。但GPU用来挖矿还是有点浪费了,GPU是用于通用并行计算而设计的,用来挖矿的话有很多部件仍然是出于闲置状态,比如说用于浮点数计算的部件。这些部件对于深度学习来说是很重要的,但比特币的操作只用到了整数挖矿。所以GPU虽然效率提高了很多但仍然有不小的浪费。这些年GPU价格涨得很快,有些人归因于深度学习的火热,其实有很多GPU是用来挖矿的。不过有一个好消息,随着比特币挖矿难度的提升,用GPU挖矿已经划不来了,已经超过了GPU的算力范围,所以GPU现在可以更多的用于深度学习、游戏应用的服务。
有一些新开发的加密货币有的还在用GPU挖矿,而现在更多用ASIC芯片挖矿,这是专门为了挖矿而设计的芯片,上面没有多余的电路逻辑,整个芯片就是为了比特币挖矿、计算哈希值的操作而设计的。它的性价比是最高的,这个芯片除了挖矿什么事都干不了,而且为某一种加密货币设计的ASIC芯片,只能挖这一种加密货币。除非这两个加密货币用同一个mining puzzle。
ASIC芯片生产周期是比较长的,比特币的ASIC芯片研发一般需要一年,但这个速度与其他通用芯片相比,已经是非常快了。一款ASIC矿机上市后,大部分利润是在前两个月获得的,因为此时它的算力在同类产品中是最强的,当更强的矿机出现后,它就会被淘汰掉(被淘汰便完全作废,因为它除了挖矿没有任何其他用途)。
当比特币系统中算力突然有了很大的提升,一般就是有大厂商生成出了最新的ASIC矿机。目前要购买ASIC矿机都要提前预定,有些不良厂商生产出最新一代的矿机后,自己先挖矿挖一段时间,等赚钱的黄金时间过去后再交给用户,所以再挖矿浪潮中真正赚钱的不一定是挖矿的用户,也可能是卖矿机的大厂商。
ASIC芯片的出现也产生了一些影响:
挖矿设备变化趋势是从通用变得越来越专用,普通人已经参与不了挖矿的过程了,有人认为这违背了比特币系统去中心化的理念。因此也出现了一些新的加密货币,其出发点是 抗ASIC芯片化,目的是让通用计算机也能参与挖矿。
大型矿池
挖矿的另一个趋势便是大型矿池的出现,对于单个矿工来说,即使使用ASIC矿机,其算力在系统中的占比还是很小的,即使从平均收益上看是有利可图的,但收入是非常不稳定的。此外单个矿工还要承担全节点的许多职责,造成了算力的消耗。为了增加收益,便有了矿池。
所谓矿池,就是把一些矿工组织起来,一起挖矿。矿池的架构一般是一个全节点驱动多台矿机,一个矿池有一个矿主(pool manager),矿工只需负责计算哈希值,全节点的其他职责由矿主来承担,他负责监听网上的交易,把交易打包成区块,同时关注有没有其他节点抢先发布区块,若有考虑调整现有工作······矿工挖到矿后提交给矿主,收益大家分配,这样可以解决单个矿工收益不稳定的情况。
矿池利益分配方法:
矿池一般有两种组织形式,一种是集中式的,集中成千上万的矿机,如果这些矿机是属于同一机构的话,怎么分配就不重要了;第二种是分布式的,矿工和矿主不在同一个地方,矿工如果要加入一个矿池,只要按矿池规定的通讯协议和矿主联系,矿主把计算哈希值的任务分配给他,矿工计算完把结果反馈给矿主即可,将来矿池获得出块奖励时一起分配
矿工来自五湖四海的情况,收益如何分配?
显然平均分配是不可行的,吃大锅饭会导致某些矿工消极懈怠不干活(因为有成本),需要进行按劳分配,所以这里同样需要工作量证明,一个思路是降低挖矿难度,比如说原本挖矿需要找到nonce使block header的哈希值前面至少有70个0,现在降低挖矿难度,矿工只要找到能使block header的哈希值前面有60个0就行了,这样挖到的叫做一个share,也叫almost valid block,找到share后把它提交给矿主,矿主以此作为矿工的工作量证明。等到有矿工挖到真正的区块后,矿主得到出块奖励后按所有矿工的share数量进行分配。
几个思考:
- 有没有可能某个矿工挖到矿后,不提交给矿主,自己偷偷发布赚出块奖励?
- 这是不可能的,矿工的任务是矿主分配的,矿主组装的区块里铸币交易的收款方地址是矿主的,矿工挖到的nonce只适用这个块头,修改收款地址nonce就作废了
- 有没有可能某个矿工捣乱,平时提交share,但真正挖到后丢弃不提交?
- 这是有可能的,虽然没有经济上的好处,但有可能是别的矿池派来的卧底,为了打击竞争对手。
矿池带来的影响:
优:减轻了矿工的负担,矿工收入也更加稳定。
缺:发动51%攻击变得容易了,攻击者只要能够动员号召这些算力就可以了,威胁到了区块链系统的安全性。
矿池相关数据
- 可见中国矿池所占比例远远超过其他国家
在2014年6月,有个名为GHash.IO的矿池算力比例占据了全网算力的一半以上,在当时引起了恐慌,因为可以发动51%攻击,之后矿池主动降低了矿池算力,避免动摇人们对比特币的信心。
如今的算力发布相对比较分散,但是几个大型矿池占了相当大的比重。看似没有矿池占50%以上的算力,但实际上某个机构如果有超过50%的算力,也不会将其放入一个矿池中,可以把算力分散隐藏在很多矿池中,真正需要发动攻击时再集中起来发动攻击(因为矿工转换矿池是很容易的)
一般来说,矿池的矿主要收取一定比例的出块奖励作为管理费,有些恶意矿池在发动攻击之前,可能故意把管理费降得特别低,吸引足够多的矿工加入后就可以发动攻击了。这就是大型矿池的一个弊端,使51%攻击更加容易了。
51%攻击
拥有51%算力的矿池可以发动哪些攻击?
- 分叉攻击 forking attack
- 即使等过六个确认区块,51%算力仍然可以将其回滚
- 抵制交易 Boycott
- 攻击者如果怀疑某个账户,想封锁这个账户,他可以凭借强大的算力让跟这个用户相关的交易都不上链。若新的区块中包含账户A的交易,攻击者检测到后马上进行分叉,产生一个不包含这个交易的区块,然后让这条链成为合法最长链。
- 之前说过有的恶意节点的确会故意不打包某些区块,但没关系,之后的诚实节点还是会包含,但是攻击者如果拥有51%的算力,他可能仗着算力强大,公开抵制他想抵制的交易,每次诚实节点打包进去,就被攻击者分叉掉了,这样一直得不到出块奖励,其他矿工也就不敢随意打包这笔交易了。
- 和分叉攻击不同的是,攻击者没必要等待六个确认区块,越早分叉越好,因为攻击者是希望别的节点沿着他的链往下挖的。
- 可以盗币吗?
- 这是不可能的,因为没有别人账户的私钥,无法伪造签名。若强行把非法的转账交易发布到区块链,正常节点是不会认可的,即使攻击者让这条链再长,其他节点也不会认为其为最长合法链。
本系列文章为个人学习笔记,文章的所有内容均不构成任何投资比特币或其他数字货币的意见和建议,也不赞成个人炒作任何数字货币!