比特币里的挖矿到底是挖什么矿?

这一篇,我要介绍一下比特币里最令人迷惑的一个概念——挖矿。这个概念在前面的漫谈中已经提及了,如果没有前面基础性的铺垫,很难说清楚挖矿是怎么回事。春节期间有一个用打麻将打趣区块链的段子1,看起来还真是形似,我们今天开始要分若干篇详细说说比特币的挖矿,各位自己判断打麻将与区块链的关系吧。

打麻将

挖矿到底是在干什么?

我们在漫谈比特币运行原理时说到,为了防止被某节点垄断记账权(中心化),就设计了一个比赛项目来确定如何产生一个新的区块,让所有节点通过比赛来竞争新区块的发布权,在比特币里被称为工作量证明(Proof-of-Work,PoW)。

如何理解工作量证明,简单的说是这中本聪设计的一种节点竞选规则,用各个节点所拥有的计算能力作为是否获得新区块发布权的基本依据。通过这种方式一方面能让新区块在一个相对固定的时间内(十分钟)不断产生,也让比特币网络保持足够的计算力来验证交易和区块的合法有效性,另外这也是比特币发行的唯一方式。可见工作量证明是比特币网络运行中最核心的环节,几乎所有需要解决的重要问题(安全性问题、去中心化问题等等)都用这个方式得到了解决。

计算能力并不是每个节点自报配置来确定的,是参与一个数学计算过程,计算能力强的自然比弱的算得快,有更高概率胜出。因此从旁观者看来,这些参与比赛的节点在拼命的计算(干活),而越努力的节点(干活多的)获得的奖励就越多(新区块发布奖励),因此从形式上看就跟淘金一样,付出越多劳动就能得到越多的收获,于是工作量证明被形象的称为“挖矿”,而参加这样工作的节点就被称为“矿工”2

淘金

为啥是挖矿,不是其他方式?

我们现在已经了解了工作量证明是为了解决去中心化的记账问题,每一个区块的发布都是节点努力工作竞争来的。那么有朋友就要问了,为啥用工作量证明这种方式,不用其他方式呢?我们来帮中本聪想想,他有哪些方式选项呢?

有一种方式是人类社会非常熟悉的方式,就是选举。但是在古往今来各种文明的尝试中,要么效率低下,要么沦为中心化(被强权控制)。在我们之前介绍分布式系统达成共识时,有一个希腊城邦问题可以用选举的方式解决,现在确实有算法在用,这里不详细介绍了。但是在比特币网络这种拜占庭将军问题中,选举方式无法满足需求。

另一种场景就像大家参加婚宴或者年会时的抽奖方式,嘉宾入场时就会每人得到一张抽奖券,主持人在抽奖的时候(如果没有做手脚),中奖会是一个随机的过程。在这种情况下,如果有人冒名多领了很多抽奖券,那么这个人就会得到更高的概率中奖。换到比特币网络环境中,所有节点都是匿名的,而且谁都可以设置任意多的设备作为节点,那么谁部署节点多,谁就会有更高的概率被选中发布新的比特币区块。这种情况是中本聪必须想办法防止的,专业术语叫做“女巫攻击”。

中本聪最终采用了类似抽奖的方式,但是增加了工作量证明作为防止“女巫攻击”的手段。工作量证明的核心理念是,我们把随机选取节点改为根据节点占有某种资源的比例来选取节点,我们希望这种资源是没有人可以垄断的。比如说,如果这个资源是计算能力,这就是我们称之为工作量证明系统3。如果有人发起“女巫攻击”,那么他必须给制造的每一个节点都配置上足够的计算资源,那么投机取巧显然就变成真抓实干了。

工作量证明不是中本聪的发明

正如我们前面说到区块链技术是许多技术的组合,而每一个技术并不是中本聪发明出来的,都在比特币出现前几十年内为解决这样那样的问题出现过,中本聪最神奇的是把这些技术组合起来,加上奖励机制以及历史的机缘巧合等,拼出了神奇的比特币。

工作量证明技术也是如此,早在1992年,密码学家辛提亚·沃克(Cynthia Dwork)和摩尼·纳欧尔(Moni Naor)首先提出这种方案,用来降低垃圾邮件问题4。他们设想是发送邮件时,必须花几秒钟来解决一道数学计算题目,如果没有附上题目的答案,收件人会自动忽略邮件。这样对于普通用户来说,发送邮件频率不高的情况下,这样的开销并不会带来大麻烦。但是对于想要同时发送成千上万垃圾邮件的人来说,这个计算量就累加得几乎不可能了。

1997年,亚当·贝克(Adam Back)在他发明的哈希现金(Hashcash)的数字加密货币体系中采用过类似设计。这里多说一句,亚当·贝克似乎觉得比特币没啥技术突破,因为他认为比特币技术基本与他发明的哈希现金差不多,还说了一句有点过分的话:“比特币只是对哈希现金进行通货膨胀控制而得到的延伸产品罢了。”杰里米·克拉克(Jeremy Clarek)在普林斯顿教材《比特币和数字加密货币技术》里,说这句话酸得就像说:“特斯拉只是在轮子上加上电池而已”。5

哈希现金创始人Adam Back
哈希现金创始人Adam Back

工作量证明方式其实只是一个技术思路,要让这些节点展示自己的计算资源,最难的是那个数学计算题目的设计,可以说这才是核心发明或者核心创新。

工作量证明的数序计算题目应该是怎样的?

对于比特币网络来说,出一道巧妙的数学计算题目可算是最核心的天才发明。我们先来看看这个数学题目需要具备什么样的特征。

1、无关过程(progress free)

举一个我和朋友们经常做的一个小游戏,被称为为“终极密码”。游戏是这样的,一个主持人秘密的记录一个1到100之间的任意数字。然后让其他人来猜他记录下来的数字,那么猜数字的人也是在1到100范围内随便猜,猜错主持人会告诉她不对6然后她继续猜直到猜中为止。从概率上来看,第一次猜中的概率为百分之一,第二次猜中就是九十九分之一,她每一次猜只否定了一个可能性,这样她下一次猜的难度就稍微降低了一点。

假如我们规定的范围是1到1万亿之间的数字,那么她每一次猜的难度就与上一次猜就没啥区别了。这样如果很多人在相互保密的猜这个数字,那么猜的次数越多的人当然猜中的概率越高,但同时有可能有人运气好没几次就猜中。如果这样的猜数字一轮一轮长期比赛下去,我们统计总数时一定会知道猜中总次数多的人显然是猜的总次数多的人,但那些猜的少的人也是有机会“来得早不如来得巧”,这样的属性被称作无关过程。因为这种属性能保证我们把最终选取节点的概率分布能够按照节点参与的计算资源比例来分配。

2、无记忆过程(memoryless process)

继续用上一个例子,如果每次猜题都是1到1万亿之间的数字,那么猜得多的人经过长期无数轮比赛后,积累排除掉的数字会越来越多,反过来就降低了题目的难度。因此这个题目不能始终是猜主持人的那秘密记下来的一个数字,每一轮主持人要随机更换数字让大家竞猜,这样每一轮之后,上一轮的所有积累都作废,一切从头开始。这个属性就被称为无记忆过程。

3、快速验证

我们的题目是要让竞猜的人难以快速算出答案,但是对于算出答案发布区块后,其他节点验证时要降低难度,让其他节点不费吹灰之力就能验证答案也是这种题目的必要特征。继续用我们“终极密码”游戏,猜对的人和主持人把两个数字一起公布,那么其他人看一眼就确认是否正确,这就算一个有快速验证能力的算题。

4、难度可调整

对于区块链的应用,由于区块记录的是某个时间段的数据,整个区块链其实就是一个按时间的分布式数据库,因此每个区块之间有一定的时间间隔这是最基本原理决定的。数字加密货币也不例外,但是大家对到底多长时间作为间隔其实并不一致,比特币是十分钟,其他数码加密货币有的是秒级的,但是不管怎么说,区块被发布出来的间隔时间是存在的,如何控制这个时间也是这个挖矿算题所需要具备的特征。

还是说“终极密码”,假如一开始就几个人来猜,那么题目的难度一开始为1到100为范围,当猜得人越来越多,同时猜的人越来越聪明,那么每轮猜中的时间就会越来越短。这时主持人根据人数和聪明程度调整难度,从1到100范围,调到1到1000,再调到1到10000,假如人数突然变少了,主持人发现间隔时间变长了,也可以减少范围来降低难度。于是这个挖矿算题就是一个难度可调整的好题目,通过调整难度来整定每个区块发布的时间间隔。

“终极密码”游戏并不是比特币用的算题,因为这样的P2P网络不可能有一个中心化的主持人,我只是用这个来说明算题所需基本特征的意思,这一点千万不要误读,因为比特币的算题在形式上与此大相径庭。

比特币的挖矿算术题

中本聪设计的比特币挖矿算题,专业名称叫“不完全哈希函数原像解密”(partial hash-preimage puzzle),这个名词的中文翻译估计没有人能看得懂,放在这里也就是告诉大家这么个名字而已,具体的意思需要好好解释一下。

不知道还有谁能记得我在这个漫谈系列介绍密码学技术基础时,专门介绍哈希算法作为密码学的瑞士军刀,具备三个有用的属性,当时我介绍了碰撞阻力和隐秘性,还有一个谜题友好性我当时没说。在这里可以填这个坑,哈希算法的谜题友好特性恰好就是我们刚刚说的具备挖矿算术题的能力。

(1)比特币选择的哈希函数算法SHA256的输入是无限的,输出是个可能性,几乎也是无限的,因此每次计算猜中答案的概率几乎完全一样,同时输入与输出也没有任何规律,具备了无关过程特性;

(2)比特币每次区块比赛所用的输入源就是各节点自己准备发布的区块与随机数的组合,因此每一次区块计算比赛的输入都与过去的区块计算完全没有关系,具备了无记忆特性;

(3)哈希函数的验证非常简单,只要将发布出来的区块进行一次哈希计算则可以判断对错,具备了快速验证特性;

(4)哈希值其实是一个数字,中本聪设计的是让节点竞赛计算得到一个小于目标值数字的哈希值,并设计了自动调整这个目标值数字的规则来调整比赛的难度,具备了难度可调整特性。(目标值怎么来的,难度到底是怎么调整的,我们未来再详细介绍,因为这是个大话题)

可见中本聪采用SHA256算法作为挖矿算术题,是满足工作量证明所需的数学计算题目的所有特征。具体节点们解题过程就是这样:

第一步:整理自己收集的交易,生成一个准备发布的区块;

第二步:猜一个随机数,与区块组成一个输入字符串;

第三步:用SHA256计算得到一个输出值;

第四步:将输出值与目标值比较;

第五步:如果小于目标值则成功;如果大于目标值则回到第二步循环。

恐怖的比特币网络算力资源

成功猜中的节点一般要循环计算无数次,每秒钟能进行的哈希计算次数是衡量计算能力(简称“算力”)的单位,用“h/s”表示。现在全比特币网络的算力已经是非常恐怖的天文数字,2018年3月1日比特币全网络的算力已经达到24.8Eh/s,也就是说每秒钟能进行次哈希计算。

数量级

两年来的比特币网络算力数据,来自于data.bitcoinity.org
两年来的比特币网络算力数据,来自于data.bitcoinity.org

为何说现在比特币网络算力是一个恐怖数字,我们来看看世界超级计算机500强的算力。这些计算机的算力单位是每秒钟能够进行的浮点计算数(f/s),浮点计算与哈希计算其实是无法对比的,因为这两种计算的差别相当于跳绳与跑步的差别。不过现在许多资料都是假设两种计算等价的情况下衡量数量级的差别。目前排名第一是我国的神威·太湖之光计算机,最高浮点计算能力是125Pf/s;第二名是我国的天河二号计算机,最高浮点计算能力是54Pf/s7

数据来自维基百科
数据来自维基百科

全球500强计算机算力总和接近1Ef/s,与比特币网络的算力相比差了20多倍。五年前有人也计算过,当时比特币网络比全球500强算力总和高8倍,看来比特币网络算力的扩张远超超级计算机的算力增长。

基于top500.org的对数图表,y轴为每秒浮点计算数(单位是Gf/s)。红线表示最快超级计算机的速度,黄线表示TOP500上第500名计算机的速度,深蓝线表示TOP500上所有计算机速度的总和。注意Y轴是对数比例。数据来在维基百科。
基于top500.org的对数图表,y轴为每秒浮点计算数(单位是Gf/s)。红线表示最快超级计算机的速度,黄线表示TOP500上第500名计算机的速度,深蓝线表示TOP500上所有计算机速度的总和。注意Y轴是对数比例。数据来在维基百科。

(由于挖矿是个大话题,里面有很多有趣的内容,考虑篇幅限制,分几期来漫谈)


注释:

  1. 段子是这样的:
    麻将其实是最早的的区块链项目:
    (1)四个矿工一组,先碰撞出13个数字正确哈希值的矿工可以获得记账权并得到奖励。
    (2)不可篡改。因为说服其他三个人需要消耗太多算力和体力。
    (3)典型的价值互联网。我兜里的价值用不了八圈,就跑到他们兜里去了。
    ​​​(4)去中心化,每个人都可以是庄,完全就是点对点。
  2. 比特币网络的节点并不全是矿工,其实绝大部分节点并不参与比特币网络的验证工作,例如钱包节点,这种被称为轻节点,它不一直在线,上线也只关心自己的地址和交易的验证。参与挖矿的节点才被称为矿工。
  3. 工作量证明之外还有一种叫做权益证明,是根据对某种数字加密货币的拥有量,也有计算拥有时间的,有点类似于股权,这种方式目前是与工作量证明一起普遍被接受和应用,未来我们专门会说权益证明的原理和应用。
  4. 这种方案后来并没有实际应用,垃圾邮件的处理采用了其他方式。
  5. 本段话其实都来自于《比特币和数字加密货币技术》,只是我重新改写了一些文字而已。
  6. 实际上主持人会告诉她猜的大了还是小了,相对来说是给下一次猜缩小了范围,我这里把游戏规则给改了。
  7. 我查网上资料,有人说天河二号的哈希计算能力是400Th/s,我没有采用。不过我的理解也可能不对,所以如果有错误请指正。

Warning: printf(): Too few arguments in /home/geekszon/public_html/wp-content/themes/simplelin/inc/template-tags.php on line 76

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据