从门罗币的硬分叉,看加密货币的算力平衡

到底挖矿是怎么回事,矿机又是如何运作的?为什么门罗币的开发者,对专用晶片的矿机这么反感,乃至于要发起算法变更这么重大的动作,来对抗晶片矿机?这对加密货币,甚至未来区块链技术的发展,产生哪些影响?请看本文精辟详解!

门罗币(Monero) 是加密货币(Crypto) 的后起之秀。在大众的目光仍停留在Bitcoin、Ethereum 等主流加密货币时,许多需要真正匿名交易特性的使用者,已经悄悄转投门罗币的怀抱。

随着Crypto 的盛行,市场上出现了越来越多专为挖矿而设计的矿机。为了对抗使用ASIC (专用晶片) 挖矿的矿机,不让这些矿机主导门罗币的区块链开采,门罗币的开发者社群决定从第1,546,000 个区块开始,更改挖矿的算法,让晶片矿机无法投入门罗币的开采。北京时间4 月6 日下午4 点22 分11 秒,门罗币区块链的第1,546,000 个区块被挖出,从这里开始,门罗币将采用新的CryptoNight V7 算法来挖矿。

到底挖矿是怎么回事,矿机又是如何运作的?为什么门罗币的开发者,对专用晶片的矿机这么反感,乃至于要发起算法变更这么重大的动作,来对抗晶片矿机?这对加密货币,甚至未来区块链技术的发展,产生哪些影响?

随着加密货币的盛行、价格水涨船高,挖矿的利润空间也越来越大,导致越来越多的使用者投入加密货币的挖矿行列。伴随而来的,就是整体区块链网络的算力提升。但像是Bitcoin 这样用矿工共识主导系统走向的网络设计,某些获得高度算力的方法其实会导致算力的过度集中化,反而与Blockchain网络的去中心化精神背道而驰。门罗币社群巧妙地利用修改算法来防堵这种现象的发生,但这场算力提升与集中的战争似乎不可能永远平息。

挖矿

加密货币的挖矿,指的是区块链网络上的使用者,透过某种相互协调的方法,选出一个使用者来,由这个使用者来整理、打包这一回合的交易资料。这个选出幸运儿的方法,称为共识算法(consensus algorithm)。

受到比特币的启发,现今绝大多数的加密货币,使用的共识算法都是「工作量证明」(Proof of Work, PoW) 算法。PoW 算法是这样运作的:由大家各自解一个很难解,但是很容易验证的题目,看谁先解出来,就对全世界大喊「我解出来了,答案在这里!此时大家会拿这个答案去验算。如果验算的结果正确,大家就承认第一个解出来的这个人,是这一轮的幸运儿,由他获得这一轮打包资料的殊荣,同时也能领取这一回合的挖矿奖励。

我们举比特币当范例,来说明挖矿怎么挖。

比特币选择了SHA256 这个哈希函数(hash function),当作它的挖矿算法核心。所谓hash function,就是前面提过的那种难解开、易验算的题目之一。以SHA256 来说,它的输入是一个长度介于0 到(2^64-1) bits 的字串,而输出则是一个256bits 的数字。比如说我把“Bird is handsome” 这个字串拿去做SHA256 计算,就会得到这数字:

SHA256("Bird is handsome") 
-> 0x8066544d3ee23a0acf4dc9f21b14276f24bbfc1bb1de87ebdf3508ac4dbda367

如果我不小心把handsome 打错一个字母,把其中的o 打成了a,算出来的SHA256 就会变成:

SHA256("Bird is handsame") 
-> 0xb0327afc47f4fef6850236b2c854b3b3aff13d4514ec4417a48dda7d4d45c2d3

有没有发现? 差之毫厘,失之千里。只不过改变了输入中的一个字元,SHA256 算出来的结果就变得连他妈妈都不认得了。这就是hash function 的特性:输入中的任何变化,都会让输出有着完全无法预期的变化,而且你几乎找不到任何关于「输入的变化」与「输出的变化」之间的规则,因此从hash function 的输出去反算输入,理论上几乎是不可能的。

我们现在可以用这个特性来出题了。假设我们在“Bird is handsome” 这个字串后面加上一个6 位数字:比如说778899 好了,这时就会算出一个新的SHA256 值:

SHA256("Bird is handsame 778899") 
-> 0xa4cdaaadc70539d23342806fcee58399d6c5f8afa8ced80b61e03d3da01a877c

然后我把题目定为:请大家依照以上的格式,找出一个数字,使得这个字串的SHA256 输出,最前面的两位数都是0。

这要这么解呢?依照hash function 的特性,你完全无法从输出猜测输入,因此唯一的解法就是用试的,或是用猜的。我们就老老实实从000000 开始试好了:

SHA256("Bird is handsome 000000") 
-> 0x60101f7d7c7a7e61ac2e4db4f7f45fea43c2e548bfec1af36d523e8b66c8d70d 
SHA256("Bird is handsome 000001") 
-> 0x32136485e25a23e0bba4c2474ee267e71d48b6696596c2d25a81b5b5d3c48900 
SHA256("Bird is handsome 000002") 
-> 0xe7316c060d9510a995aa08f7c635786e866e284447046ddf393429569d065d9e 
......

试到000056 时,我们就找到了一组解:

SHA256("Bird is handsome 000056") 
-> 0x00999635ad2ba3441af06f8738b7212a52060d6cd1e4b3feaf04ea70323c8e27

事实上这解不保证是唯一的,这是hash function 的特性之一。如果有人从三千多开始往上试,也会找到另一组解:

SHA256("Bird is handsome 003280") 
-> 0x00696cc645d0cd17f014aaac0273c004eceea1d534fdfe04f0d30f229c4cfe07

但如果题目变成「使得它的输出,最前面的3 位数都是0」的话,难度就会上升许多,因为符合这个条件的数字一定比两个0 的要少很多。

因此,藉由调整使得解答成立的条件,我们可以控制题目的难度。

在比特币中,那个字串来自前一个区块的资讯,以及这个区块需要打包的资料,而那个数字则是header 中需要解算出来的一个栏位。比特币的每一个区块都有一个80 bytes 的header,它的格式是这样的:

前五个栏位都是已知的:版本就是目前使用的协定版本、从区块链上拿到前一个区块header 的SHA256 值、决定要打包哪些交易然后算出它们的Merkle hash、时间看看电脑的时钟就知道了、挖矿难度则有另外一个算法根据前面一段时间挖矿的产出速度决定,当一个矿工把前面五个栏位准备好后,他就可以开始挖矿。

挖矿的方法就是:调整第六个栏位,也就是nonce的数字,使得整个header的SHA256值前面的0的数量,符合挖矿难度那一栏的值。

难度与算力

挖矿难度也是比特币系统设计上一个很巧妙的地方。比特币开始上线时,挖矿的难度是开头8 个0,也就是找出来的nonce 必须让这个header 的SHA256 前面有8 个0。我们可以去比特币的区块链上查一下历史纪录就知道。捞一下2009 年的几个区块来看:

可以看到当时算出来的hash,前面只有8 个0 就算有效了。

但随著成千上万的矿工投入挖矿,整个网络的计算能力也大幅上升,为了维持差不多每10 分钟算出一个区块的速度不变,比特币网络就根据难度调整的算法慢慢地把0 的数量增加。

我们看看在今年四月挖出来的区块:

有效hash 值,所需要的0 的数量已经暴增到18 个。

每多一个0,找到有效hash 值的机率就变为原来的1/16,也就是挖矿难度变成16 倍。从2009 年到现在已经多了10 个0,也就是说现在的挖矿难度是当年的16^10 = 1,099,511,627,776 倍,1 兆倍。

换句话说,现在比特币网络上的总计算能力,也就是大家一起猜数字的速度,是当年的1 兆倍。

Nonce 是一个32bit 的值,也就是有2^32 差不多有42 亿种可能。当挖矿难度低的时候,这42 亿个数字中多半可以找到符合的解,但是随着挖矿难度增加,很有可能会遇到无法在这42 亿个数字里找到有效解的状况,这时候矿工就要稍微调整一下前面的几个栏位,再重新寻找有效的nonce。由于版本、前一个block 的hash 值、难度这几个栏位都是固定的,只有时间和Markle Root Hash 这两个栏位可以更动。常见的做法是调整Merkle Root Hash 这个栏位,细节还蛮复杂的,这里先不解释。

整个比特币的挖矿过程中,最复杂的计算就是这个SHA256 的计算。而挖矿这件事情,说穿了,就是大家比赛猜数字,把选定的数字丢到SHA256 里面去算,看看你是不是那个幸运儿。至于要怎么猜,是一个一个照顺序猜,还是跳着猜,还是乱猜,都无所谓,因为就机率模型来说,不管你怎么选数字,结果都是一样的。

计算SHA256 的速度越快,在同样的时间里能猜的数字就越多,你就越有可能猜中。这就是PoW 算法的精神:藉由证明(proof) 你所提供的工作量(work),以换取你在这一回合获取挖矿奖励的机会。

随着比特币的价格上扬,挖矿开始变成一门不错的生意。要挖得好、挖得快,关键就在于那个SHA256 算得好不好、快不快。于是继CPU、GPU 被拿来挖矿之后,终于有人设计IC 来挖矿了!

挖矿晶片

SHA256 算法其实非常适合用IC 来做,因为它的计算步骤都是单调、重复的布林运算和资料重排,用Verilog 来写的话其实才几百行程序代码而已。于是就出现了用专用的IC 来计算SHA256 的挖矿机器,而且一举把计算速度推升了好几个数量级。

大部分的GPU 计算比特币SHA256 的速度大概都在每秒10 亿次以下。但是!但是!重点来了,很多挖比特币专用的IC 都可以轻松达到每秒一兆次以上,而且耗电远比GPU 低得多。每秒一兆次是什么概念呢? 就是一组block header 的资料,所搭配的40 亿组可能的nonce 值,遇到这种挖矿的IC,它不用0.1 秒就能试完。要是题目出得不够快,还喂不饱这种挖矿IC 呢。

这种挖矿用的IC 既便宜又省电,计算能力还比显示卡高上许多,因此有越来越多的人利用这种装置投入比特币的开采。比特币现在整个网络的计算能力,大概是两千多万Thash/sec (这数字大概是2*10^19,用中文写的话是2000「京」),如果都用1Ghash/sec 的显示卡来挖,要两百亿张这种显卡才能挖到这个速度,地球上哪来这么多显示卡?当然都是用专用IC,也就是ASIC 在挖呀。

用ASIC 矿机挖矿的现象,导致整个比特币网络的计算能力,集中在少数拥有大量矿机的团体手上,一般平民百姓不管是买不起矿机,还是不愿为了挖比特币而去买专门的矿机,都没办法自己在家里用显示卡参加挖掘比特币的伟大行动,因为用显示卡挖矿根本连ASIC 矿机的车尾灯都看不到。

这个现象,让比特币的区块链离「去中心化」的理念越来越远。计算能力的过度集中,甚至导致中国的某个矿池一度掌握了超过全网一半以上的计算能力,而让人担忧比特币网络会遭到所谓的「51% 攻击」。51% 攻击指的是,如果有单一节点掌握了整个区块链网络一半以上​​的计算能力,它就有办法操纵、甚至改写区块链上的资料。(所以其实不用51%,有50.1% 或50.01% 也可以,差别只在于攻击成功的机率。)

其它的加密货币开发者注意到这个现象,纷纷开始想办法透过算法的设计,来避免这种「ASIC 矿机之乱」。

以目前市值排名第二的加密货币以太坊(Ethereum) 来说,它的挖矿算法,不像比特币只需要计算SHA256 这么简单。挖掘以太坊的计算过程,需要参照一个叫做DAG 的表格,这个表格每30,000 个区块要重新产生一次,而且它的大小会随着区块链的成长而增加。目前Ethereum 的DAG 表格大小大概是2.4GB。

由于以太坊挖矿的计算过程,需要随时参照这张表格,如果要挖得快挖得好,这张表格就得放在速度很快的记忆体中,以便计算核心可以快速读取。但以目前的ASIC 技术来说,就算用embedded DRAM 制程也没办法在同一个晶片上做出这个大小的记忆体。而外挂记忆体或stacked-DRAM 则需要处理汇流排、记忆体介面等复杂的设计,让个整体的设计变得相当复杂,成本也会大幅增加。它不是做不到,而是没办法像比特币的挖矿晶片那样用划算的方法做到。总之,以太坊的的算法有很多巧思,都是为了对抗ASIC 挖矿而设计的。

因此,以太坊自2015 年7 月上线以来,虽然计算能力快速成长,始终没有出现可以挖掘乙太币的ASIC 矿机。直到今年四月。

2018 年4 月,中国的矿机大厂比特大陆(Bitmain) 推出了一台叫做Antminer E3 的ASIC 矿机,售价八百美金,号称能用180Mhash/sec 的速度挖掘以太币,而且只有800W 左右的耗电。

虽然速度不像比特币的ASIC 矿机那么快,但耗电和价格还是远比使用显示卡挖掘以太币要低得多。这机器预计七月开始出货,届时对以太坊区块链的算力会有多少冲击,还有待观察。唯一正面的影响,大概是显示卡缺货的问题可以得到纾解。现在在矿工们疯狂扫货下,显示卡真的很难买呀。

门罗币保卫战

至于前面提到的门罗币,在开发之初除了考虑到要对抗ASIC 矿机之外,也用算法拉近了GPU 和CPU 的挖矿能力。门罗币使用的挖矿算法叫CryptoNight,这个算法的开发社群开宗明义就说了,这是个“Egalitarian” (平等主义) PoW 算法。他们希望在这个算法之下,除了不会存在ASIC 挖矿这种明显中心化的行为之外,你也不用去买贵森森的高阶显卡来挖矿,因为门罗币让显卡挖矿的速度跟CPU 挖矿的速度差不多。

CryptoNight 算法,用了几个方式实践这个「挖矿之前,人人平等」的精神:

  1. 每个挖矿的单元需要2MB 的记忆体。它不像以太币挖矿需要的记忆体那么大,但2MB 对ASIC 来说也是个不低的门槛。而这个大小,差不多可以符合现代CPU 的L3 快取记忆体大小(以平均分配给每个核心的快取记忆体大小来计算)。
  2. 相对于CPU 挖矿,GPU 挖矿的优势在于它的平行处理架构:它可以同时执行成千上万的挖矿工作。但由于每一个工作都需要各自的2MB 记忆体,而且CryptoNight 算法存取这块记忆体的行为非常随机,因此显示卡上的GDDR 记忆体不见得能负荷这样大的记忆体存取频宽。GDDR 记忆体的优势在于循序读写的频宽,在随机存取上反而没有优势。
  3. CryptoNight 算法的核心用到一种称为AES 的加密算法。现在的x86/x64 架构处理器都有专用的硬体电路和指令集来加速AES 计算,这方面显示卡的GPU 完全没有任何优势。

但赔钱的生意没人做,杀头的生意有人做。随着门罗币的价格上涨,它的挖矿利润也越来越高,终于还是出现了可以挖门罗币的ASIC 矿机。

一样是比特大陆(Bitmain) 做的。

比特大陆在今年三月发表了一款叫做Antminer X3 的矿机,宣称在550W 的耗电下,能以220Khash/sec 的速度挖掘门罗币。相较于AMD Radeon Vega 64 这种一张近两万块的高阶显卡,仅能用2Khash/sec 左右的速度开采门罗币,Antminer X3 似乎开启了门罗币ASIC 采矿的新时代。

但门罗币阵营也不是省油的灯。Antminer X3 的消息一出来,门罗币的主要开发者Riccardo Spagni 就在推特上开呛了: 他公开宣示:「Antminer 这种ASIC 矿机对门罗币不管用。」

为了要达到这个目标,门罗币社群决定进行一次「硬分叉」(hard fork),也就是更改门罗币的挖矿算法,让ASIC 矿机难以在新的CryptoNight V7 算法上运作。

如同我们在文章一开始说的,门罗币在第1546000 个区块进行了硬分叉,修改了挖矿算法。究竟这个变更有没有成功让门罗币网络上的ASIC 矿机现形呢? 我们来看看门罗币的算力变化就知道了。

就在门罗币执行硬分叉后,整个门罗币网络的算力暴跌了三分之二以上,而且至今都还没有爬回硬分叉之前的算力水准。

这中间的算力差距,大概就是被硬分叉踢出去的Antminer X3 矿机所拥有的算力。Antminer X3 仍未开始交货,因此这些算力应该是比特大陆内部在测试机器时所贡献的算力。

至此,门罗币社群算是成功地防堵了Antminer X3 矿机把持门罗币网络的算力。但目前仍不知道Antminer X3 的挖矿晶片有多少弹性,会不会只需要修改软体,就能重新上线挖掘新算法的门罗币,还是它们就此跟门罗币道别,改去挖其它仍使用旧版CryptoNight 算法的加密货币。

区块链网络的中心精神是「去中心化」,但由于挖矿带来的丰厚利润,各种矿池、矿场的规模化在所难免,也因此导致各加密货币网络的算力,往集中化的趋势倾斜。如同我们前面解释过的,PoW 算法藉由证明工作量来换取打包资料的权利以及领取挖矿奖励,因此只要PoW 算法存在一天,这场开发者与矿机大户的算力大战就不会终止。

本文链接地址:https://www.wwsww.cn/xmr/6028.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。