到底挖矿是怎么回事,矿机又是如何运作的?为什么门罗币的开发者,对专用晶片的矿机这么反感,乃至于要发起演算法变更这么重大的动作,来对抗晶片矿机?这对加密货币,甚至未来区块链技术的发展,产生哪些影响?请看本文精辟详解!
门罗币(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 的数量增加。
我们看看在今年四月挖出来的区块:
EOS是什么?快速了解它的6大特性、运作原理、使用方式
简单来说,EOS开发团队自己建置了一条链,与以太坊类似也是开源平台,能让参与者在链上撰写智能合约创造应用程序,EOS柚子币则能在其链上做使用,后续文章段落会提及该币的应用
有效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 演算法,用了几个方式实践这个「挖矿之前,人人平等」的精神:
- 每个挖矿的单元需要2MB 的记忆体。它不像以太币挖矿需要的记忆体那么大,但2MB 对ASIC 来说也是个不低的门槛。而这个大小,差不多可以符合现代CPU 的L3 快取记忆体大小(以平均分配给每个核心的快取记忆体大小来计算)。
- 相对于CPU 挖矿,GPU 挖矿的优势在于它的平行处理架构:它可以同时执行成千上万的挖矿工作。但由于每一个工作都需要各自的2MB 记忆体,而且CryptoNight 演算法存取这块记忆体的行为非常随机,因此显示卡上的GDDR 记忆体不见得能负荷这样大的记忆体存取频宽。GDDR 记忆体的优势在于循序读写的频宽,在随机存取上反而没有优势。
- 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 演算法存在一天,这场开发者与矿机大户的算力大战就不会终止。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
从货币历史看虚拟货币
法币是怎么来的?跟虚拟货币真的有很大差别吗? 币圈走得如火如荼,全世界都杀红了眼想着获利,政府手忙脚乱地在世界各地急着推出法案,希望能够规范虚拟货币这脱缰野马,为什
原创文章,作者:掘金K,如若转载,请注明出处:https://www.20on.com/119866.html