编者按:区块链涉及到的技术很多,从互联网底层到不明觉厉的密码学,可是往往关注币价者多而研究技术的人少。牛市的时候,大家为了炒币也会努力学习,熊市的时候,反正也没啥事,我觉得可以更加努力学习。作为一个文科生,我当然会有很多理科生看起来觉得很白痴的问题。作为一个记者,我不难找到业内懂的人用人话给我解释,而且他们往往不会当面嫌弃我。
这是小明学习笔记第六期,如果有其他有趣问题,欢迎投稿和提问。
———这是华丽丽的正文分割线———
回顾过往,小明学习笔记已经从周更变成月更,这一篇距离上一篇可以说是季更了。由于我现在的工作主要是编辑了,所以一般是带着记者出去采访和写稿,很少自己单独写稿,所以学习笔记的更新估计也是绵绵无绝期。
这期要分享的是矿池,首先要感谢 xDAG 的核心开发者谢锐,同时他也是 xDAG 官方挖矿软件的设计者,年前给我科普了很多这方面的知识。
我最早了解这个行业是在 2017 年采访 ViaBTC微比特,当时杨海坡总结,矿池就像矿工的联盟,把大家聚起来挖矿。这个确实已经是矿池非常本质而且通俗的解释。
我们都知道,随着比特币而诞生的 PoW 共识机制,其挖矿的过程本质就是在做随机数碰撞,谁猜中者这个随机数谁就可以获得记账权、成为这轮的出块人。因为是乱猜,所以单位时间内猜的次数越多,猜中的概率就越大。
随着专业矿机等设备出现,比特币、莱特币等币种**挖矿算力增加,大部分的矿工靠自己SOLo挖矿已经很难挖到币,矿池应运而生。矿池就像一个联盟,把这些零散的矿工甚至是矿场集合起来一起挖矿,按算力占比给矿工收益,这样既可以增加挖到币的概率、也可以稳定矿工的收入,同时矿池提供的技术也有利于**挖矿效率。
矿池究竟把什么任务给到矿工?
神鱼也曾经总结,矿池其实就是在分派任务给大家算。不过,我想知道得更细节,就是矿工们究竟在算什么?矿池又是怎么分配任务的呢?
《浅谈矿池和矿场(矿池篇)》这篇文章举了个例子说明挖矿的过程:“矿池将区块难度分成很多难度更小的任务下发给矿工计算,矿工完成一个任务后将结果提交给矿池,叫提交一个 share。假设**难度要求 n 的值为 100,即前 100 个比特位为 0,矿池可能会给矿工分配一个任务,要求前 30 位为 0,然后再从所有提交的任务中,寻找有没有凑巧前 100 位为 0 的目标值。”
谢锐告诉我,理论上,矿池给矿工分配任务的方式可以有两种:
**种,矿池只是一个节点,打包交易的还是矿工。矿池会把任务的完整信息给到到矿工,矿工打包交易、然后广播。矿工知道完整信息,但是需要填的东西比较多,签名也是矿工签的。
第二种矿池节点直接打包,给到矿工的是结果的中间状态,或者说非完整信息,矿工填完他要填的东西。块**的组合由矿池来做。矿工把 nounce 发给矿池,签名是矿池。
“**不会变的是,你接入这个矿池的数据同步方式。”
看完上面两种方式,显然大部分商业运营矿池会选择第二种,挖矿收益的分配就是按照签名。如果我既是矿工也是矿池主,两种没有区别,大可选择**种。
看到上面说的 nounce 值,你大概会有点懵逼,这其实就是我们常说的 PoW 过程中要碰撞的那个随机数,下面还会解释。
根据《精通比特币》一书,挖矿的目标是找到一个使区块头哈希值小于难度目标的 nonce。前提是选取的交易已经确定,说到这里,我们就需要来学习一下比特币的区块头结构。
表格来自《精通比特币》
在区块头里面,基本上挖矿节点能改变的东西就两个:交易和 nounce。既然挖矿的目标是让区块头哈希值小于目标,整个步骤基本上是:决定你要打包的交易并形成对应 merkle tree 根——乱猜一个 nounce —— 把 nounce 放到区块头里面哈希一下——才知道有没有小于目标哈希值,即大于目标难度。
So,基本上你所选的交易和 nounce,都无助于你“预知”**的哈希值大小(nounce 值大,区块头哈希不**就变大变小),你每一步都只能乱猜。别人一次可能就猜中了,你猜了几万次都还没有中,你**能做的就是比别人在同一时间里面猜更多次,这就是矿机在做的事情——把自己所有的精力都集中起来做一件事。
再说说矿机的抗 AISC 属性
说到矿机,我问真的存在抗 ASIC 的算法吗? 谢锐总体认为本质上没有抗 ASIC,不过不同的算**让制造 ASIC 矿机的成本更高。
** PoW 币种都会有一套挖矿算法/软件,ASIC 芯片就是把这个软件烧成电路。最早的芯片都是专用的,比如收音机的芯片只能做收音机的东西。FPGA(Field Programmable Gate Array) 则是可编程阵列,在硅芯片上施加电压,一个与门就可以变成非门。这类芯片应用范围更广,首先上头成本比ASIC高;而且为了做得更通用,还是有冗余,没有 ASIC **。所以现在大家会在电脑上设计、在FPGA上设计,然后烧 ASIC。如此类推,GPU 甚至 CPU 能做的计算类型就更多了。如果想知道 FPGA 具体为什么比 CPU 和 GPU 更**,可以参考这篇文章。
为什么会有冗余?举个假设性的例子(不准确但有助理解),比如 5 5 ,FPGA 可能没有 5 这个概念,就要变成 1 1 1 1 1,ASIC就可以直接算 5 5。这让我想起王嘉平接受 Odaily星球日报采访时说过一句话:在计算机领域,灵活性/通用和**往往是冲突的。
“ASIC **的就是并行计算 ,FPGA稍微差一点。其实本质上没有抗ASIC,只能让它反推的每一步更难,比如要求把东西放在内存里算,比如需要算方差,需要把每个数据都放进内存,GPU 到 FPGA 到 ASIC,(ASIC)需要的显存芯片可能是 GPU 的 100 倍。(要不要研发某个币种的 AISIC 矿机)只看成本和收益。”通俗来说,可以理解为研发一台挖以太坊的 ASIC 矿机比研发比特币 ASIC 矿机更难,而且同样时间下研发出来的芯片,对比起普通 CPU/GPU 效果提升不明显。比特币可能是提升了成千上万倍,以太可能提升了几倍到几十倍,效果划不来。
类似的分析也可在公开资料看到,比如耳朵财经的这段话:
“Ethereum使用了Ethash算法,前身为Dagger算法(Vitailk发明),其目的是为了抵制ASIC矿机。如何抵制ASIC矿机呢?通过将挖矿和内存带宽相捆绑,即**其他硬件的运算优势,从而达到挖矿设备平等这一理念。
Ethash算法没有阻挡ASIC矿机的出现,只是拖延了出现的时间。
绑定内存带宽意味着可以通过提高内存带宽速度来提高算力,或者在相同内存带宽速度下**功耗,只不过目前内存带宽价格过高以及ETH价格过低,从成本上考虑,ASIC矿机相较GPU来得不够划算。
Litecoin使用的是密码学家兼程序员Colin Percival于2009年发表的论文Stronger Key Derivation via Sequential Memory-hard Functions上所发明的scrypt算法。原理和Ethash较为相似,都是提高挖矿时内存的使用成本,延缓ASIC矿机的出现。
2014年,Zeu**iner研发出了专门针对scrypt算法的ASIC矿机。这也说明通过绑定某一硬件(如内存)从而抬高挖取的使用成本是没有办法**杜绝ASIC矿机。”
现在大部分号称抗 ASIC 的挖矿算法,都是将内存和计算捆绑。
以太中文网还整理了一下不同 PoW 算法部署 ASIC 之后挖矿效率增长倍数:
SHA256 约1000倍
Scrypt和NeoScrypt 约1000倍
X11和X16R 约1000倍
Equihash 约100倍
Cuckoo Cycle 约100倍
CryptoNight 约50倍
Ethash 约2倍
矿池的收益分配模式
**简单提下矿池的收益分配模式,其实这个已经有很多文章解释过。矿池的分配模式大类有两种:
**种是实际出块情况分币:时间周期内,矿池挖到多少块,就按照算力比例分配所得挖矿收益。
这种方式的时间周期一般按挖出块的时间为止,即两次挖到块的时间之内的算力分布比例分配收益;也可以每天结算,如果你所在的矿池爆了好几个块,当天的收益就很高,如果矿池一天都没有挖到什么块,那么所有人今天都没有收益。这称为 PPLNS(Pay Per Last N Shares)。
第二种即按理论值分币:时间周期内(一般是一天),理论上矿池能得到多少收益,按照算力比例给矿工分钱,相比上一种稳定。
借用这篇文章里的一个例子:假如在某 10 分钟,你为某矿池提供了 1 T 算力,当时该矿池算力共为 100 T,**算力 1000 T,比特币网络平均每 10 分钟出一个块,出块奖励为 12.5 个 BTC,矿池占**总算力的**之一,矿池收益期望值为 1.25 个 BTC,你的算力占矿池算力的百分之一,无论矿池是否挖到区块,你的收益都是理论收益 1.25 BTC。这种称为 PPS(Pay Per Share)。由于 PPS 模式下,矿池承担风险,所以费用的比率会更高。
行文至此矿池的基本知识科普得差不多了。突然想起最近(我是在年前采访的……)看文章看到以太坊的空块率多了很多,我又顺便问了一下矿池为什么要挖空块,得到的回答是省时间:“挖空块的好处,不用同步数据,也不用下载,而且上传更快,(不过短时间内)出块太多会提升难度。”
想知道得更详细,可以参考《科普入门 | 空块是什么?为什么矿工要挖空块? 》这篇文章:
“挖空块技术**的优势就在于,因为空块只有一条信息,空块矿工省去了‘打包’大量信息的时间。这使得空块矿工挖完这个区块,直接就可以开始下一个区块的挖矿。
如果是大矿场甚至矿池级别的硬件,这一操作说起来只是节省了几秒钟的时间,不过大矿池几秒钟时间的算力,秒秒钟几百万上下真是一点也不夸张啊。
2