全节点与轻节点 #
前面我们说过比特币的节点分为全节点和轻节点,全节点包含了区块的header及body,轻节点只包含header,下面我们详细地来对比下他们之间的异同。
-
轻节点 全节点 是否一直在线 不是一直在线 一直在线 包含信息 在本地硬盘保存完整的区块信息 只保存每个区块的块头 交易信息 在内存中保存完整的utxo集合 不保存全部交易,只保存和自己有关的交易 合法性校验 监听比特币网络上的交易信息, 验证每个交易的合法性 无法验证大多数交易的合法性,只能验证与自己有关的交易的合法性 打包交易 决定哪些交易会打包到区块中 无法检测网上发布的区块的正确性 合法性 监听其他矿工挖出的区块,验证其合法性 仅可以验证挖矿难度 挖矿 决定沿着哪条链挖下去&当出现等长分叉,选择哪一个分叉 只能检测哪个是最长链,不知道哪个是最扯昂合法链
比特币网络中大部分节点都是轻节点,在挖矿过程中,如果监听到别人已经挖出一个新的区块,延申了最长合法链,那么应该重新组装一个新的候选区块,重新开始挖矿。这样做是不是有些可惜?并不,因为挖矿是无记忆性的,每一次nonce值的尝试,都不会对下一次的尝试造成影响。
挖矿设备 #
挖矿设备的演化趋势是越来越趋于专业化,从普通的家用电脑,到如今的ASIC矿机。
一代设备:CPU #
开始的时候大家用普通的家庭电脑的CPU来进行挖矿,但实际上使用家用电脑来挖矿是十分不划算的,因为在挖矿过程只用到了电脑的一部份资源,大部分内存、CPU资源都是在闲置的。如果用通用计算机来挖矿,那么挖矿很快会变得无利可图,因为性价比太低。
二代设备:GPU #
GPU的主战场是大规模的并行计算,例如一些深度学习计算,而挖矿则恰好需要这种功能来进行大量并发的哈希计算。但这种设备任然存在资源闲置的问题,例如在深度学习中,需要一些复杂浮点运算,但在比特币挖矿中都是整数计算,所以如果使用GPU来挖矿,设备一些浮点运算组件任然会被闲置。
三代设备:ASIC芯片 #
ASIC芯片的全名为 Application Specific Integrated Circuit,这种芯片专门为了挖矿中的哈希值计算而生,并且某种类型的ASIC芯片只能适用于某种特定的哈希加算法。这种芯片那么强悍,那是不是挖矿会变得更加容易呢?答案是不一定,原因如下:
- ASIC芯片设计、流片流程很长,假如比特币的价格剧烈变化,前期投入很可能会血本无归。
- 即使是在比特币黄金时期,ASIC芯片的竞争也是非常激烈的,可能刚买的ASIC芯片用不了几个月,就有算力更强的ASIC芯片出现,又得重新购买新的芯片,相当于一场军备竞赛。
思考 #
专业化挖矿设备的出现在一定程度上违背了比特币去中心化的初衷,最理想的情况是大家都用家用电脑来进行挖矿,这样可以保证一定的公平性。目前市面上也存在一些抗ASIC芯片的加密货币,例如门罗币、Zcash 等。
矿池 #
根据前面提到的挖矿难度调整机制,每隔10分钟才会出一个新的区块,但这是对所有矿工而言。对单个的矿工来说,买一台ASIC矿机,可能要挖个1年2年甚至更久才能出一个区块,这就相跟买彩票一样,十年不开张,开张吃十年。那如何解决这样的问题呢,我们需要引入矿池的概念。
所谓的矿池就是把这些矿工组织起来,作为一个整体,来进行挖矿。矿池的整体架构是一个全节点矿主下面管理许多矿工,矿工只负责计算哈希值,全节点的其他职责都由矿主来完成。
收益分配 #
矿工可能来不同的机构,不同的地方,那么矿工加入矿池后利益如何分配?
-
平均分配?
NO,这种方式做多做少一个样,太容易吃大锅饭。
-
按工作量分配
目前矿池使用的是这种方式,矿工需要向矿主证明,自己干了多少活,能获得多少奖励。那么矿工如何证明自己进行了多少次哈希计算?如果矿工用挖出新区块作为工作量证明,显然又是不可行的,因为在一段时间内,能挖出新区块的矿工就只有一个,其他矿工相当于在陪跑。
解决方案是降低原本的挖矿难度,这里并不是真正降低比特币的挖矿难度,而是矿主允许矿工挖到一个难度降低的区块,我们称其为share,或者叫almost valid block,将其记录为矿工的工作量证明。
思考 #
-
矿工如果挖到新区块,能否自己偷偷摸摸发布获得出块奖励,而不告诉矿主呢?
这是不可行的,在矿池机制中,矿主会分配不同区间的nonce值给各个矿工,让他们去计算哈希值,但出块奖励的收款人是矿主,所以即使被矿工偷偷发布了,也不会给矿工带来额外的收益。
-
如果矿工一开始就组装一个收款人是他自己的区块呢?
这种做法相当于离开矿池了,因为区块的内容被修改过,即使矿工提交了一个share,矿主也不会认,矿工也不会得到矿池的利益。
-
有没有矿工捣乱?平时提交share,等挖到区块后不提交给矿主?
这种情况有可能出现,但不提交给矿主也就无法获得对应奖励,这是一种杀敌八百自损一千的做法,不过也不排除有些恶意竞争者真的会这么做。
矿池统计 #
https://bitbo.io/glossary/mining-pool/
矿池份额统计图,可见挖矿集中化的程度任然比较大,几个大型矿池占了相当大的一部分份额。表面上看没有哪个矿池的算力超过一半,但实际实上某个机构如果有超过一半以上的算力,其必然不会将其放入一个矿池中,而是将其分散隐藏,真正需要发动攻击时候再集中起来发动51%攻击(ps:矿工转换矿池是很容易的)。
在矿池机制中,矿主需要向矿工收取一定管理费,如果有恶意的矿主想攻击系统,会将管理费降低甚至赔本赚吆喝来吸引足够多的矿工,从而使得51%攻击变得更加容易。