比特币挖矿是一个高度竞争的行业。哈希算力自比特币诞生以来每年都呈指数级增长。一些年份的增长反映了彻底的技术更新,比如2010和2011年,很多矿工从CPU挖矿转到了GPU挖矿,以及现场可编程门阵列(FPGA)挖矿。在2013年,随着ASIC挖矿的引入,把SHA256函数直接集成到了挖矿的专用芯片上,导致了哈希算力的另一次巨大飞跃。第一台采用这种芯片的矿机所产生的算力,比2010年整个比特币网络的算力还要大。
比特币运行前五年全网哈希算力的情况如下所示。
0.5 MH/秒~8 MH/秒(16倍增长)。
8 MH/秒~116 GH/秒(14500倍增长)。
16 GH/秒~9 TMH/秒(562倍增长)。
9 TH/秒~23 TH/秒(2.5倍增长)。
23 TH/秒~10 PH/秒(450倍增长)。
10 TH/秒~150 PH/秒(截至8月份,15倍增长)。
图8.7显示了两年间比特币网络哈希算力的增长情况。如你所见,矿工之间的竞争以及比特币的成长导致了哈希算力(全网络每秒的哈希运算能力)呈指数级增长。
图8.7 两年间的总哈希算力变化
资料来源:blockchain.info。
随着投入挖矿运算的哈希算力呈爆炸式增长,挖矿难度也相应地提高了。图8.8中,难度值以当前难度与最小难度(第一个区块的难度)之间的比率来计量。
图8.8 两年间的比特币挖矿难度
资料来源:blockchain.info。
2012~2014年,ASIC挖矿芯片的集成度越来越高,已经接近了芯片制造业最前沿的22纳米特征尺寸(分辨率)的水平。由于挖矿利润的驱使,这个行业甚至比通用计算行业发展得更快。当前,ASIC制造商的目标是超过通用CPU芯片制造商,设计出16纳米特征尺寸的芯片。目前看来,比特币挖矿已经很难有巨大的飞跃。这个行业已经达到了摩尔定律的极限,摩尔定律认为每18个月计算密度翻一番。尽管如此,随着更高密度芯片的出现,以及能够部署成千上万芯片的更高密度数据中心的发展,网络算力还将继续保持指数级的增长。现在已经不再是比较单一芯片的能力,而是如何把更多芯片集成在一起,并处理好散热和供电的问题。
从2012年起,比特币社区提出了一种区块头结构的基础限制问题的解决方案。在比特币发展的早期,矿工可以不断迭代随机数找到一个区块,使其哈希值小于指定目标。随着难度的增加,矿工们经常碰到即使将40亿个随机数都循环一遍也找不到解的情况。不过,这个问题因为区块中时间戳的更新而轻易地得到了解决。由于时间戳是区块头的一部分,它的改变使得矿工可以重新进行随机数迭代,得出不同的结果。但是,当挖矿硬件性能超过4GH/秒时,这个方法就变得越来越难了,因为随机数的值1秒钟内就耗尽了。当ASIC挖矿装备加入后,运算能力超过了TH/秒级,挖矿软件需要更大的随机数空间来寻找有效的区块。时间戳虽然可以延后一点,但是延后太多又会导致区块无效。区块头需要一个能够产生“变化”的源。解决方案是使用铸币交易作为额外随机数的来源,因为币基脚本可以存储2~100字节的数据。矿工开始使用这个空间作为扩展的随机数空间,这使得他们可以探索更大范围的区块头以找到有效的区块。铸币交易受到默克尔树的保护,也就是说,币基脚本的任何修改都会导致默克尔根的变化。8字节的扩展随机数,加上4字节的“标准”随机数,允许矿工在不改变时间戳的情况下,每秒尝试296(8后跟28个0)种可能性。如果未来,矿工们有能力遍历所有这些可能性,他们仍然可以通过改变时间戳来进一步增加可能性。当然,币基脚本中也仍然有富余空间供未来扩展随机数使用。
在这种激烈竞争的环境下,单个矿工(也被称为“个体矿工”)独立工作基本没有机会赢得竞争。他们通过挖矿弥补电力和硬件成本的可能性非常低,基本上就等同于参加一场赌博或者买彩票。即使最快的消费型ASIC挖矿系统,也无法赶上那些安装了成千上万芯片的商业系统,那些系统通常建在水电站附近的巨大机房里。矿工们一般联合起来组成矿池,他们将算力集中起来,而奖励也在成员间共享。通过加入矿池,矿工可以得到全部奖励的一小部分,但是这种方式削减了不确定性,矿工们几乎每天都能分到奖励。
我们来看一个具体的例子。假定一个矿工购买了一台矿机,其处理能力能达到6000G哈希每秒(GH/s),或者6TH/s。在2014年的8月份,这台设备的成本大概是1万美元。设备运行时的功率为3kW,每天72度(kWH)耗电,每天平均电力成本是7~8美元。在当前的比特币挖矿难度下,如果矿工单干的话,大概每155天或者5个月可以找到1个新区块。如果矿工在这个时间内真的找到了1个区块,那么他将得到25比特币的奖励,每个比特币兑换价格大概是600美元,总的奖励是1.5万美元。这笔钱扣除硬件和电力的全部成本后,大概还有3000美元的收益。但是,5个月内能否找到一个区块,完全凭矿工的运气。他可能5个月内找到2个区块,获得更多的收益;也有可能10个月也找不到1个区块,导致财务损失。更糟糕的是,比特币工作量证明的难度很可能在这段时间内已经显著提高了,以当前哈希算力的增长速度,矿工最多在6个月时间内必须达到收支平衡,否则硬件就将过时,需要被更强的挖矿硬件取代。如果矿工加入一个矿池,每周就能赚到500~700美元,而不用等待5个月一次的“横财”。矿池定期派发的奖励帮他摊销了硬件和电力成本,不再需要承担巨大的风险。硬件设备仍然会在6~9个月后过时,风险依然很高,但是至少在这个时间内的回报是定期发放,相对可靠的。
矿池通过专门的矿池协议,将成百上千的矿工集合在一起。个体矿工在矿池中创建账号后,通过设置把挖矿设备与矿池服务器相连。在挖矿的过程中,挖矿硬件保持与矿池服务器相连,与其他矿工同时进行挖矿工作。这样,矿池中的矿工共享挖矿的努力,也共享收获的奖励。
挖矿成功后,奖励将被发送到矿池的比特币地址,而不是某个个体。当矿工的份额达到某个阈值后,矿池服务器将定期把奖励发送到矿工的比特币地址。通常,矿池服务器会抽取一定百分比的佣金,作为提供矿池服务的报酬。
寻找候选区块工作量证明解的工作被分割成多个部分,分给所有加入矿池的矿工,这些矿工则根据其贡献赚取奖金份额。矿池通常设置一个比比特币网络的实际难度小1000倍的难度目标,用以衡量矿工的工作量投入,以分割奖励份额。当矿池中有人成功挖出一个区块,奖励由矿池领取,矿池再根据矿工贡献的大小分配奖金。
矿池对所有矿工开放,不管是大还是小,专业还是业余。因此,一个矿池中不仅存在只有单台小型矿机的矿工,也存在拥有大量高端挖矿硬件的矿工。有些矿工挖矿耗费功率只有几十千瓦,有些则运营着功耗达到兆瓦级的数据中心。矿池如何才能做到既可以避免欺诈,又能基于每个矿工的贡献公平分配奖金呢?答案在于使用比特币的工作量证明算法来衡量矿工的贡献,矿池将难度值设得很低,确保即使是最小的矿工也能经常赢得奖励份额,让他们觉得加入矿池是值得的。通过设置较低的分享份额的难度目标,矿池可以衡量每个矿工完成的工作量。每当矿工找到一个小于矿池难度的区块头哈希,就证明了他已完成了寻找结果的哈希计算。更重要的是,这些为获取份额而做的工作,能以一个可衡量的统计方法,为整个矿池寻找小于比特币网络难度目标的哈希做出贡献。成百上千的矿工寻找小值哈希,最终总能找到一个足够小的、满足比特币网络难度目标的区块哈希。
我们回到骰子游戏的例子。假设骰子玩家的目标是总点数小于4点(全网难度),矿池可以设置一个较为简单的目标,比如,计算每个参与矿池的玩家掷出小于8的总点数的次数。当矿池中的玩家投掷出小于8点(矿池份额目标)时,他们赢得一个份额,但他们并没有赢得游戏,因为还没有达到游戏的目标(小于4点)。矿池玩家可以比较容易地就达到矿池目标,从而非常有规律地赢得他们的份额,即使最终他们没有达到赢得游戏的目标。
时不时地,矿池中的玩家会投出一个总点数小于4点的组合,让矿池赢得游戏。接着,基于玩家们赢得的份额进行收益分配。虽然目标设置为8或更少并没有最终赢得游戏,但这是衡量玩家们投掷点数的公平方法,而且偶尔也会产生一个小于4的点数。
类似地,一个矿池可以设置矿池的难度,确保矿池中的矿工可以经常找到小于矿池难度的区块头哈希,从而赢得份额。这种尝试工作时常也会找到一个小于比特币网络目标的区块头哈希,从而产生有效区块,矿池成为这个区块的赢家。
大多数矿池都是“托管矿池”,即公司或者个人运营着矿池服务器。矿池服务器的拥有者被称为矿池经营者,他按一定比例向加入矿池的矿工抽取奖励费用的佣金。
矿池服务器运行着专用的软件,根据矿池挖矿协议来协调矿工们的工作。矿池服务器同时与一个或多个完全比特币节点相连,可以直接访问区块链数据库的完整复制。这使得矿池服务器可以代表矿工对区块和交易进行验证,使他们从运行完全节点的负担中解脱出来。对于矿池中的矿工而言,这是一个重要的考虑因素,因为一个完全节点需要一台专用的计算机,配置至少15G~20G的硬盘,至少2G的内存(RAM)。此外,运行在完全节点上的比特币软件还需要时不时地监控、维护、升级。任何因为缺少维护或者资源而导致的宕机,都会损害矿工的收益。对于很多矿工来说,不用维护完全节点即能参与挖矿是加入托管矿池的另一大好处。
矿池矿工利用挖矿协议,比如Stratum(STM)或GetBlockTemplate(GBT)与矿池服务器相连。曾经有个旧标准,被称为GetWork(GWK),到2012年年底基本上已经作废了,因为这个标准难以支撑哈希速度超过4GH/s的挖矿工作。不管是STM还是GBT协议,都会创建一个包含候选区块头的区块模板(templates)。矿池服务器通过归集交易,添加铸币交易(包括扩展随机数空间),计算默克尔根,加入连接到前序区块的哈希引用,从而创建一个新的区块。候选区块的区块头作为模板,发送给矿池中的所有矿工。每个矿工基于区块模板,在一个低于比特币网络难度值的目标下进行挖矿;一旦找到满足矿池难度值的区块,就将其发回矿池服务器,赢得奖励份额。
托管矿池有可能引发矿池管理员的欺诈行为,他可能将矿池的算力引导至双重支付交易或者无效区块(参见本章中“共识攻击”)。此外,中心化的矿池服务器也存在单点故障的隐患。如果矿池服务器宕机或者因拒绝服务攻击而放慢运行速度,矿池中的矿工就无法挖矿。在2011年,为解决这个中心化问题,引进了一个新的矿池挖矿协议:P2P矿池(P2Pool),它是一个点对点的矿池,不需要中心管理员。
P2P矿池通过将矿池服务器的功能去中心化,实现了一个平行的类似区块链的系统,叫作份额链(share chain)。份额链是一条相比比特币区块链具有较低难度的区块链。份额链允许矿工在去中心化的矿池中协同工作,它们以每30秒一个份额区块的速度在份额链上进行份额挖矿。份额链上的每个区块记录着参与贡献的矿工的奖励份额,并且继承了之前份额区块上的份额记录。当某个份额区块同时达到比特币网络的难度目标时,这个区块就会被传播出去,并入比特币区块链,而区块奖励则根据每个矿工之前对份额的贡献度进行发放。本质上,份额链采用一种类似比特币区块链的去中心化共识机制,让所有矿池中的矿工都能跟踪所有贡献份额的记录,而不像矿池服务器一样,由一个中心节点保存矿工的份额和奖励记录。
P2P矿池挖矿比托管矿池挖矿复杂得多,它要求矿工运行一台具有足够硬盘空间、内存和网络带宽的专用电脑,以支持完全节点和P2P矿池节点软件。P2P矿池矿工将他们的挖矿设备与本地的P2P矿池节点进行连接,P2P矿池节点通过向挖矿设备发送区块模板的方式,模拟矿池服务器的功能。在P2P矿池中,矿工构建他们自己的候选区块,归集交易,其行为与个体矿工很类似,但是P2P矿工是在份额链上合作挖矿。P2P矿池整合了个体矿工和矿池两者的优势,能够让个体矿工在支出上具有更加细粒度的优势,在控制层面,它不需要像托管矿池那样将控制权交给矿池管理人。
当前,矿池中集中的算力已接近可发起51%攻击的能力(参见本章中“共识攻击”),出于对此的担忧,P2P矿池的矿工数量有了显著增长。P2P矿池协议进一步的发展有望移除对完全节点的依赖,从而使这种去中心化的挖矿更加易用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。