第三节 吹尽狂沙始到金
在第一章里我们提过,比特币是通过“挖矿”产生的,这是一种简单形象的说法。这一章里我们会说“挖矿”实际上并没有直接挖出比特币,“挖矿”的目的是竞争比特币交易的记账权,而比特币是对“挖矿”者完成交易记账后的奖励。
如果一个任务需要付出一定精力或代价去完成的话,那么要想让这个任务被很好地完成,有以下三种可能的方式:①依靠某位有奉献精神的人主动去完成;②采取措施强迫某个人去完成;③采取一定的激励机制,鼓励大家去完成。第一种方式在很多情况下比较奏效,但依赖于志愿者的素质和奉献意识,比如志愿者到敬老院为老人服务。第二种方式需要制度的保证,要有监督和惩罚措施,否则被强迫者在不情愿的情况下不能保证完成的质量。第三种方式往往包含一个竞争过程,会筛选出最有能力的人来完成这项任务,即所谓的“重赏之下,必有勇夫”。
多年前的一个暑假,有两个小朋友到我家来玩,为了培养她们做家务的意识,我便要求她们每次吃完饭要洗碗。最初,我采用第一种方式,问“有没有人主动洗碗?”刚开始两个小朋友很踊跃,争先恐后地去洗碗。可是多洗几次后,洗得多的小朋友心理就不平衡了:为什么总是我在洗碗,而她却可以看动画片?于是逐渐没人洗了。我赶紧换第二种方式:两人轮流洗。但每次都要调解两个小朋友之间关于洗碗是否公平的矛盾,并且大人必须在旁边监督着,否则碗会洗得不干净。最后,我换成第三种方式,根据工作量的大小,每次洗碗的小朋友会得到一定的积分,积分可以换炸鸡、薯片或其他零食。这下两个小朋友积极性高涨,早早地就守在水槽旁抢着洗碗。于是我就可以在饭后悠闲地陪着另一个“没抢着”的小朋友看动画片。
比特币系统就采用了第三种方式来激励大家“挖矿”,以保证有人参与并能够及时地记录比特币交易信息。那么比特币系统到底是怎么“挖矿”的?简而言之,第一章提到的那些“矿机”是通过计算来“挖矿”的。做的是什么计算呢?是一种叫作哈希的计算。
讲哈希计算前,我们先了解一下什么是哈希。哈希(Hash),一般也翻译成“散列”,是指将任意长度的输入信息经过一定的算法计算后,变成固定长度的输出信息。哈希计算有很多特性,其中之一便是即使你知道哈希计算的结果,也没法通过分析结果反推出它的输入数据,唯一可行的办法是不断地对不同的数据进行哈希计算,看其计算结果是不是与已知结果相同,从而确定输入数据,这一过程非常耗时。
比特币“矿机”在“挖矿”时,需要不断地进行哈希计算,直到计算的结果小于某个给定的值,即“挖矿”成功(当然,实际上是否真正成功还需要确认)。比如,告诉你一个目标值是345,也知道输入的数据可以在1到10亿中选择,你唯一能做的就是先计算1,看其哈希计算结果是不是小于345,如果不是,再计算2, ……以此类推,最后可能是512340034这个数的哈希计算结果正好小于345,但你已经计算5亿多次了。
你可能会对哈希计算的难度嗤之以鼻:这都啥年代了,计算机运算速度这么快,5亿次计算不算什么啊,现在的手机CPU运算速度很容易就到十亿次每秒啊!
是的,但这只是个例子。在真正的比特币“挖矿”计算中,目标值有256位数,每一位可能是26个大写英文字母、26个小写英文字母和0到9这10个数字中的任意一个,有62种可能,256位就有62256种可能。目前“挖矿”时的哈希计算结果目标值的前18位都为0,至少需要经过6218次计算,大约1.83×1032次计算。由于哈希计算的特性,“挖矿”没有捷径可走,只能采用不断尝试新数据进行计算这种很笨、很暴力的穷举方式。这也是“挖矿”很困难的原因。
比特币“矿机”在“挖矿”时其区块上有三个很重要的数值:nonce、bits和difficulty,我们可以将它们分别称为随机数、目标值和难度值。其中,难度值用来决定下次“挖矿”的难易程度,可以调整。目标值存放的是难度值和实际目标值经过一定运算后的近似值。随机数是本次“挖矿”计算中经过不断尝试并最终找到的、其哈希计算结果小于难度值的一个值。
也就是说,目标值给出了本次哈希计算结果需要小于的值,哈希计算用到的算法类型也是固定的(比特币系统采用的是一种叫SHA-256的哈希算法),但随机数是未知的。“挖矿”的过程就是不断地去试不同的随机数,把这个随机数和其他几个参数一起经过哈希计算后,确认其结果满足小于目标值的要求。
一旦某台计算机找到这样一个随机数,就可以宣布“挖矿”成功,“挖矿”计算机就把这个消息在比特币网络中广播给其他节点,以宣布自己在“挖矿”竞争中胜出。其他节点在接到这个成功消息后,只能停止“挖矿”,转而去验证这个消息的正确性,即失败者根据胜利者提供的随机值,在自己的计算机上运算一次以确定结果符合要求。
很显然,要想抢先“挖矿”成功,“挖矿”用的计算机运算速度就要非常快。早期“挖矿”用台式机就可以了,但随着“挖矿”的人越来越多,大家要比拼计算速度,台式机CPU(Central Processing Unit,中央处理器)的性能就不够用了,于是人们转而用GPU(Graphics Processing Unit,图形处理器)“挖矿”。GPU是一种专门用于计算的芯片,通常用来完成图形图像显示所需要的计算,所以计算机的显卡里就有GPU,你要玩大型游戏的话,就需要性能高的GPU。由于GPU只做专门计算,不像CPU那样还需要执行其他操作,所以其运算速度远超CPU。
GPU“挖矿”很快为“矿工”们带来了丰厚的收益,但技术进步没有停止,很快FPGA“挖矿”出现了。一台计算机只能带少量的GPU进行“挖矿”,却可以带大量的FPGA(Field-Programmable Gate Array,现场可编程门阵列)进行“挖矿”,所以“挖矿”效率大幅提升。很快,大家都转向FPGA“挖矿”,但新的矿机——ASIC(Application Specific Integrated Circuit,专用集成电路)矿机又出现了,这种新设备简化了其他所有功能,只用于“挖矿”。目前,矿机的进化还在持续中。
不过,单独一台“挖矿”设备已经不能满足“挖矿”需求了,很自然地,“矿工”们想到了用多台设备“挖矿”,这就产生了“矿场”。还记得第一章里提到的四川西部那些“矿场”吗?每个“矿场”都有成千上万的“矿机”在不断地“挖矿”,电力消耗费用大约会占到总费用的60%,所以“矿场”必须建在电力便宜的地方。另一种做法就是所谓的“矿池挖矿”,这有点类似于众筹或者股份制“挖矿”,即进入“矿池”的各参与方贡献自己的计算能力以形成巨大的运算能力,然后按照一定的规则分配挖到的比特币!更进一步的,现在又推出了“云挖矿”,你可以租用云服务平台的计算能力,不用投入任何硬件资源就有人帮你“挖矿”,进一步降低了“挖矿”的门槛。
可是,比特币的总数是有限的,为2100万个,因此能挖出来的比特币会越来越少,比特币的价格理论上应该越来越高。2009年,比特币刚推出的时候,几乎每10分钟就可以挖出50个比特币,如果你醒悟得早的话,开着“挖矿”软件睡上一觉,醒来后就会发现有几千个比特币!当“挖矿”的人越来越多后,每次能够挖出的比特币就开始少了,大约每经过4年每次能挖出的比特币数量就会减半一次。比如,2009年时每次可以挖出50个比特币, 2012年底后就只有25个,2016年7月之后就只有12.5个(由于是数字货币,比特币计数时可以有小数点后面多位,最小可以到0.00000001比特币,即一“聪”)。
当人们挖出的比特币总数达到一定数量后,比特币网络会调整难度值,影响目标值,使哈希计算的难度增加,从而延缓比特币的产生速度。难度值的调整实际上与比特币网络中的计算能力有关。“挖矿”难度增加后,由于“矿机”计算能力也提高了,所以比特币产出的速度没有太大变化,基本上还是每10分钟“挖矿”成功。
我们来看看掷骰子:假设我们规定每次要掷两颗骰子,根据骰子上的点数之和是否小于某个数字来定输赢。你马上就会想到,能够百分之百赢的就是规定这个数字为13,因为两颗骰子无论怎么掷,结果肯定小于等于12,但这样游戏就太简单了。于是我们修改规则,改为点数之和小于10,这样稍微有点难度,因为当出现(5,5)、(5,6)、(6,5)和(6,6)这四种情况时就输了。如果改成更小的数呢,比如小于3?那只有(1,1)这种情况才能赢了,你会觉得这也太难了。
为什么要采用这种又费马达又费电的“挖矿”方式呢?要知道,“挖矿”的难度增加后,大部分的计算都是无用的,在很多人看来,这浪费了能源。当然,是不是真的浪费,各方还各执一词。这有点像家长送小孩去学网球,小孩未来可能会获得“四大满贯”冠军,家长和孩子的投入得到巨大的回报,但这种概率极小。绝大多数情况下,小孩只是比常人更会打网球而已,家长在其身上的长期投入没有得到所期望的回报。
这种“挖矿”方式被称为“工作量证明”(Proof-of-Work, PoW),即通过你所做的工作的多少来决定你能获得的权益。“挖矿”就是比拼相同时间内谁做的运算量多,谁就能“挖矿”成功(当然也有运气问题,可能有的“矿工”没计算几次就碰巧找到了)。这种简单粗暴的方式看上去非常合理,现实生活中我们广泛采用了工作量证明方式来实现利益分配。在大家上高中的时候,你比别人花费更多的时间学习,于是你就有更大概率可以考上重点大学。据说美国前游泳世界冠军“飞鱼”菲尔普斯一天要游11~15千米!中国游泳名将孙杨也说他每天要游15~20千米。当你比别人做了更多的工作时,通常你就能获得更大的成功,PoW就包含了这一朴素的原则。“更高、更快、更强”,奥林匹克精神就是典型的PoW。