从门罗币的硬分叉,看Crypto的算力平衡课题

门罗币是加密货币的后起之秀。在大众的目光仍停留在 Bitcoin、Ethereum 等主流加密货币时,许多需要真正匿名交易特性的使用者,已经悄悄转投门罗币的怀抱。
随着 Crypto 的盛行,市场上出现了越来越多专为挖矿而设计的矿机。为了对抗使用 ASIC挖矿的矿机,不让这些矿机主导门罗币的区块链开採,门罗币的开发者社群决定从第 1,546,000 个区块开始,更改挖矿的演算法,让晶片矿机无法投入门罗币的开採。台北时间 4 月 6 日下午 4 点 22 分 11 秒,门罗币区块链的第 1,546,000 个区块被挖出,从这里开始,门罗币将採用新的 CryptoNight V7 演算法来挖矿。
到底挖矿是怎幺回事,矿机又是如何运作的?为什幺门罗币的开发者,对专用晶片的矿机这幺反感,乃至于要发起演算法变更这幺重大的动作,来对抗晶片矿机?这对加密货币,甚至未来区块链技术的发展,产生哪些影响?
随着加密货币的盛行、价格水涨船高,挖矿的利润空间也越来越大,导致越来越多的使用者投入加密货币的挖矿行列。伴随而来的,就是整体区块链网路的算力提升。但像是 Bitcoin 这样用矿工共识主导系统走向的网路设计,某些获得高度算力的方法其实会导致算力的过度集中化,反而与 Blockchain 网路的去中心化精神背道而驰。门罗币社群巧妙地利用修改演算法来防堵这种现象的发生,但这场算力提升与集中的战争似乎不可能永远平息。
挖矿加密货币的挖矿,指的是区块链网路上的使用者,透过某种相互协调的方法,选出一个使用者来,由这个使用者来整理、打包这一回合的交易资料。这个选出幸运儿的方法,称为共识演算法 。
受到比特币的启发,现今绝大多数的加密货币,使用的共识演算法都是「工作量证明」 演算法。PoW 演算法是这样运作的:由大家各自解一个很难解,但是很容易验证的题目,看谁先解出来,就对全世界大喊「我解出来了,答案在这里!此时大家会拿这个答案去验算。如果验算的结果正确,大家就承认第一个解出来的这个人,是这一轮的幸运儿,由他获得这一轮打包资料的殊荣,同时也能领取这一回合的挖矿奖励。
我们举比特币当範例,来说明挖矿怎幺挖。
比特币选择了 SHA256 这个杂凑函数 ,当作它的挖矿演算法核心。所谓 hash function,就是前面提过的那种难解开、易验算的题目之一。以 SHA256 来说,它的输入是一个长度介于 0 到bits 的字串,而输出则是一个 256bits 的数字。比如说我把 “Bird is handsome” 这个字串拿去做 SHA256 计算,就会得到这数字:
SHA256
-> 0x8066544d3ee23a0acf4dc9f21b14276f24bbfc1bb1de87ebdf3508ac4dbda367
如果我不小心把 handsome 打错一个字母,把其中的 o 打成了 a,算出来的 SHA256 就会变成:
SHA256
-> 0xb0327afc47f4fef6850236b2c854b3b3aff13d4514ec4417a48dda7d4d45c2d3
有没有发现 ? 差之毫釐,失之千里。只不过改变了输入中的一个字元,SHA256 算出来的结果就变得连他妈妈都不认得了。这就是 hash function 的特性:输入中的任何变化,都会让输出有着完全无法预期的变化,而且你几乎找不到任何关于「输入的变化」与「输出的变化」之间的规则,因此从 hash function 的输出去反算输入,理论上几乎是不可能的。
我们现在可以用这个特性来出题了。假设我们在 “Bird is handsome” 这个字串后面加上一个 6 位数字:比如说 778899 好了,这时就会算出一个新的 SHA256 值:
SHA256
-> 0xa4cdaaadc70539d23342806fcee58399d6c5f8afa8ced80b61e03d3da01a877c
然后我把题目定为:请大家依照以上的格式,找出一个数字,使得这个字串的 SHA256 输出,最前面的两位数都是 0。
这要这幺解呢?依照 hash function 的特性,你完全无法从输出猜测输入,因此唯一的解法就是用试的,或是用猜的。我们就老老实实从 000000 开始试好了:
SHA256
-> 0x60101f7d7c7a7e61ac2e4db4f7f45fea43c2e548bfec1af36d523e8b66c8d70d
SHA256
-> 0x32136485e25a23e0bba4c2474ee267e71d48b6696596c2d25a81b5b5d3c48900
SHA256
-> 0xe7316c060d9510a995aa08f7c635786e866e284447046ddf393429569d065d9e
试到 000056 时,我们就找到了一组解:
SHA256
-> 0x00999635ad2ba3441af06f8738b7212a52060d6cd1e4b3feaf04ea70323c8e27
事实上这解不保证是唯一的,这是 hash function 的特性之一。如果有人从三千多开始往上试,也会找到另一组解:
SHA256
-> 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 演算法的精神:藉由证明你所提供的工作量 ,以换取你在这一回合获取挖矿奖励的机会。
随着比特币的价格上扬,挖矿开始变成一门不错的生意。要挖得好、挖得快,关键就在于那个 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 ,如果都用 1Ghash/sec 的显示卡来挖,要两百亿张这种显卡才能挖到这个速度,地球上哪来这幺多显示卡?当然都是用专用 IC,也就是 ASIC 在挖呀。
用 ASIC 矿机挖矿的现象,导致整个比特币网路的计算能力,集中在少数拥有大量矿机的团体手上,一般平民百姓不管是买不起矿机,还是不愿为了挖比特币而去买专门的矿机,都没办法自己在家里用显示卡参加挖掘比特币的伟大行动,因为用显示卡挖矿根本连 ASIC 矿机的车尾灯都看不到。
这个现象,让比特币的区块链离「去中心化」的理念越来越远。计算能力的过度集中,甚至导致中国的某个矿池一度掌握了超过全网一半以上的计算能力,而让人担忧比特币网路会遭到所谓的「51% 攻击」。51% 攻击指的是,如果有单一节点掌握了整个区块链网路一半以上的计算能力,它就有办法操纵、甚至改写区块链上的资料。 来说,它的挖矿演算法,不像比特币只需要计算 SHA256 这幺简单。挖掘以太坊的计算过程,需要参照一个叫做 DAG 的表格,这个表格每 30,000 个区块要重新产生一次,而且它的大小会随着区块链的成长而增加。目前 Ethereum 的 DAG 表格大小大概是 2.4GB。
由于以太坊挖矿的计算过程,需要随时参照这张表格,如果要挖得快挖得好,这张表格就得放在速度很快的记忆体中,以便计算核心可以快速读取。但以目前的 ASIC 技术来说,就算用 embedded DRAM 製程也没办法在同一个晶片上做出这个大小的记忆体。而外挂记忆体或 stacked-DRAM 则需要处理汇流排、记忆体介面等複杂的设计,让个整体的设计变得相当複杂,成本也会大幅增加。它不是做不到,而是没办法像比特币的挖矿晶片那样用划算的方法做到。总之,以太坊的的演算法有很多巧思,都是为了对抗 ASIC 挖矿而设计的。
因此,以太坊自 2015 年 7 月上线以来,虽然计算能力快速成长,始终没有出现可以挖掘乙太币的 ASIC 矿机。直到今年四月。
2018 年 4 月,中国的矿机大厂比特大陆推出了一台叫做 Antminer E3 的 ASIC 矿机,售价八百美金,号称能用 180Mhash/sec 的速度挖掘以太币,而且只有 800W 左右的耗电。

虽然速度不像比特币的 ASIC 矿机那幺快,但耗电和价格还是远比使用显示卡挖掘以太币要低得多。这机器预计七月开始出货,届时对以太坊区块链的算力会有多少冲击,还有待观察。唯一正面的影响,大概是显示卡缺货的问题可以得到纾解。现在在矿工们疯狂扫货下,显示卡真的很难买呀。
门罗币保卫战至于前面提到的门罗币,在开发之初除了考虑到要对抗 ASIC 矿机之外,也用演算法拉近了 GPU 和 CPU 的挖矿能力。门罗币使用的挖矿演算法叫 CryptoNight,这个演算法的开发社群开宗明义就说了,这是个 “Egalitarian”PoW 演算法。他们希望在这个演算法之下,除了不会存在 ASIC 挖矿这种明显中心化的行为之外,你也不用去买贵森森的高阶显卡来挖矿,因为门罗币让显卡挖矿的速度跟 CPU 挖矿的速度差不多。
CryptoNight 演算法,用了几个方式实践这个「挖矿之前,人人平等」的精神:
- 每个挖矿的单元需要 2MB 的记忆体。它不像以太币挖矿需要的记忆体那幺大,但 2MB 对 ASIC 来说也是个不低的门槛。而这个大小,差不多可以符合现代 CPU 的 L3 快取记忆体大小 。
- 相对于 CPU 挖矿,GPU 挖矿的优势在于它的平行处理架构:它可以同时执行成千上万的挖矿工作。但由于每一个工作都需要各自的 2MB 记忆体,而且 CryptoNight 演算法存取这块记忆体的行为非常随机,因此显示卡上的 GDDR 记忆体不见得能负荷这样大的记忆体存取频宽。GDDR 记忆体的优势在于循序读写的频宽,在随机存取上反而没有优势。
- CryptoNight 演算法的核心用到一种称为 AES 的加密演算法。现在的 x86/x64 架构处理器都有专用的硬体电路和指令集来加速 AES 计算,这方面显示卡的 GPU 完全没有任何优势。
但赔钱的生意没人做,杀头的生意有人做。随着门罗币的价格上涨,它的挖矿利润也越来越高,终于还是出现了可以挖门罗币的 ASIC 矿机。
一样是比特大陆做的。
比特大陆在今年三月发表了一款叫做 Antminer X3 的矿机,宣称在 550W 的耗电下,能以 220Khash/sec 的速度挖掘门罗币。 相较于 AMD Radeon Vega 64 这种一张近两万块的高阶显卡,仅能用 2Khash/sec 左右的速度开採门罗币,Antminer X3 似乎开启了门罗币 ASIC 採矿的新时代。

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

为了要达到这个目标,门罗币社群决定进行一次「硬分岔」,也就是更改门罗币的挖矿演算法,让 ASIC 矿机难以在新的 CryptoNight V7 演算法上运作。
如同我们在文章一开始说的,门罗币在第 1546000 个区块进行了硬分岔,修改了挖矿演算法。究竟这个变更有没有成功让门罗币网路上的 ASIC 矿机现形呢 ? 我们来看看门罗币的算力变化就知道了。

就在门罗币执行硬分岔后,整个门罗币网路的算力暴跌了三分之二以上,而且至今都还没有爬回硬分岔之前的算力水準。
这中间的算力差距,大概就是被硬分岔踢出去的 Antminer X3 矿机所拥有的算力。Antminer X3 仍未开始交货,因此这些算力应该是比特大陆内部在测试机器时所贡献的算力。
至此,门罗币社群算是成功地防堵了 Antminer X3 矿机把持门罗币网路的算力。但目前仍不知道 Antminer X3 的挖矿晶片有多少弹性,会不会只需要修改软体,就能重新上线挖掘新演算法的门罗币,还是它们就此跟门罗币道别,改去挖其它仍使用旧版 CryptoNight 演算法的加密货币。
区块链网路的中心精神是「去中心化」,但由于挖矿带来的丰厚利润,各种矿池、矿场的规模化在所难免,也因此导致各加密货币网路的算力,往集中化的趋势倾斜。如同我们前面解释过的,PoW 演算法藉由证明工作量来换取打包资料的权利以及领取挖矿奖励,因此只要 PoW 演算法存在一天,这场开发者与矿机大户的算力大战就不会终止。
现在就是创办 Blockchain / AI 最好的时间,欢迎所有区块链、人工智慧创业者加入专为你们服务的 AppWorks Accelerator
下一篇:从阅兵看世界各国不同的军事文化(组图)
看了这篇文章的用户还看了
TOPS
- 热门排行
- 热门排行