你若是想加入比特币挖矿行列,我们不会极力劝阻你,但会提醒你比特币挖矿潮很像当年的淘金热。历史上的淘金热充斥着各种年轻的淘金者下海淘金发财的故事,并且不可避免地,许多人最终失去了一切。在这些确实经历了千辛万苦的人们当中,也只有少数人变得富有。我们将在本章中了解到,和传统淘金以及其他快速致富途径一样,比特币挖矿也面临着类似的挑战和风险。我们首先要看一下技术细节。要成为比特币矿工,你必须加入比特币网络并与其他节点相联。建立链接之后,还有六个任务要完成:
1.监听交易广播。监听网络上的交易广播,然后验证它们的签名是正当有效的,交易输出没有被重复支付。
2.维护区块链网络和监听新的区块。必须先维护区块链。为了做到这一点,一开始你可以要求其他节点把区块链上的历史记录(在你加入区块链网络之前的)同步过来。然后,监听那些被广播到网络上的新的区块。你的任务是验证你收到的每个区块,这里的验证是指保证区块里的每笔交易都是有效的,而且这个区块包含了一个有效的随机数。我们会在本章后面谈到验证随机数的技术细节。
3.组装一个备选区块。一旦拥有最新的全部区块链数据备份,你就可以开始制造你自己的区块了。要做到这一点,你要把所监听到的交易进行组合并放进一个新的区块,然后把该新区块排在整条链中最新的区块的后面。你必须保证你建立的新区块里的每笔交易都是正当有效的。
4.找到一个让你的区块有效的随机数。这一步的工作量最大,也是矿工工作中最难的一个环节。我们后面会谈到细节。
5.希望你的区块被全网接受。即使你找到了一个区块,也不能保证该区块会成为共识链(concensus chain)的一部分。这需要有点运气,希望其他的矿工接受你的区块,然后从该区块开始继续接龙下去,而不是从你的竞争对手发现的区块开始。[1]
6.利润。如果所有其他矿工接受了你的区块,那你就能获取利润。在2015年,一个区块的奖励是25个比特币,大约在10 000美元左右。此外,如果在该区块里的任何交易都有交易费,所有交易费也会为矿工所有。到目前为止,交易费作为额外收入,相对来说还比较低,大概是一个区块默认奖励的1%。
我们可以把矿工的任务分成两类:第一类任务是验证交易和区块,这是比特币网络赖以生存和运转的基础。这些任务也是比特币协议需要矿工的首要原因。第二类任务是和其他矿工竞争,争取可以找到区块并因此获益。这些任务并不是比特币网络存在所必需的,而是为了鼓励矿工去完成第一类任务而设置的。当然,这两类任务都是使比特币成为一个数字货币的必要条件,因为矿工必须获得奖励才会去完成这些重要的任务。加 入 会 员 微 信
寻找有效区块
现在回到如何找到一个使区块有效的随机数的问题上。在第3章中我们讨论过,区块链主要有两层基于哈希函数的结构。第一层在是区块链上,每个区块的头部都有一个指针指向其前一个区块,第二层是在每一个区块里,包括所有交易的梅克尔树。
作为矿工,首先需要从你的交易池中选出一系列有效的交易并且编译成梅克尔树。当然,只要不超过每个区块随机数的交易上限,你可以选择编译的交易数量。然后,组装出一个新的区块,让它的头部指向区块链上的前一个区块。新区块的头部,有一个32位的随机数区域。你需要尝试不同的临时随机数,直到该随机数能使整个区块的哈希值小于目标值。这个目标值一般体现为以零开始的特定位数的数值。作为一名矿工,你可能使随机数从0开始,每次增加数值1,直到该随机数能使区块有效为止,如图5.1所示。
图5.1 寻找有效区块
注:在这个例子中,矿工尝试了一串都是零的临时随机数,但没有产生有效的哈希值,所以矿工继续尝试其他不同的临时随机数。
在大多数情况下,随机数试过所有32位可能的取值后,仍然不能产生一个有效的哈希值,这时候你必须做出更多的改变。注意,图5.1中币基(coinbase)还有一个随机数可以改动。当你遍历区块头部随机数所有可能的取值后,可以改变币基里的随机数,比如加1,然后可以重新改变区块头部随机数来寻找有效的哈希值。
当改变币基里的随机数后,整个梅克尔树上交易的哈希值都会改变(见图5.2),因为币基值的改变会向上传递,所以改变币基的随机数值比改变头部随机数值的代价要大很多。正因为如此,矿工大部分时间只改动头部的随机数,只有在遍历头部232个随机数值且还没有找到一个有效区块时,才改动币基的随机数。
图5.2 改变临时随机数
注:改变币基里的临时随机数,整个梅克尔树的哈希值都会因此而改变。
你所尝试的绝大多数临时随机数都不会成功,但若能够坚持足够长的时间,你总能找到一对正确的临时随机数组合——头部随机数与币基随机数,用来产生一个符合哈希值要求的新区块。找到后要立即宣布,就有希望得到相应的区块奖励。
每个人都在运算同一个谜题吗?
你可能会想,如果每个矿工都在临时随机数值上逐步加1,岂不是大家都在按照同一个运算模式解同样的谜?岂不是最快的一个总赢得竞争吗?不会的。首先,矿工们不太可能在完全相同的一个区块上进行运算,因为每个矿工都会把或多或少不同的交易用不同的次序来放进区块内。但更关键的是,就算两个不同的矿工所组建的区块里包括了一模一样的交易,这两个区块的哈希值还是会不同。请记住在币基交易里,矿工会写自己的地址接收新铸币。这个地址本身的区别会沿着梅克尔树往上传递直达树根,导致整棵树上的哈希函数值不同,从而保证了没有两个矿工的区块是一样的。除非两个矿工共享公开密钥。这种情况只有可能两个矿工同在一个矿池(我们以后会讨论)。同在一个矿池的矿工会互相通信,确保使用不同的币基临时随机数以避免重复工作。
找到一个有效区块到底有多难?到2015年年底,这个挖矿的难度目标区域值(用16进制来表示)为:
所以任何有效区块的哈希值必须低于这个值。换句话说,大约268个临时随机数里只有不到一个可以成功,这是一个非常巨大的数值。一个粗略的估计,它比全球人口总和的平方还要大。也就是说,如果地球上的每个人都是一个包含7亿人口的独立星球,那么总人口将会是265。
决定难度
每挖出2 016个区块,挖矿难度会改变一次,这个周期大约是两个星期。难度的改变是根据上2 016个区块的挖矿效率来决定的。用下列公式来表达:
注意,2 016× 10分钟就是两周,也就是说,如果产生一个区块需要10分钟,那么产生2 016个区块就需要两周时间。所以这个公式的意义就是,测量全网难度进而维持平均每10分钟产生一个新的区块的速度。挖矿难度改变的周期是两周,并没有什么特别的意义,只不过是一个权衡之下的结果。如果这个周期太短,难度会随着每一个周期找到的区块的数目的不同而波动(概率问题)。如果太长,整个网络的哈希算力会与难度大大地失去平衡(难度的调整滞后于计算能力的变化)。
每个比特币矿工独立地计算难度,只接受达到这个难度的区块。两个在不同分叉上的矿工可能会有不同的计算难度,但在同一个区块工作的矿工一定会对计算难度达成共识。
图5.3中显示,挖矿难度会随着时间不断地增加。其增加不一定是稳定线性或者是指数型,而是取决于市场行为。挖矿难度会受到有多少新矿工加入的影响,新矿工的加入本身又由比特币的当前价格来决定。总的来说,当越来越多的矿工加入并且挖矿的硬件设备效率越来越高,找到有效区块所花费的时间就会越短,紧接着难度就会增加,直到重新回到每10分钟找到下一个有效区块。
在图5.3中,虽然整个网络的哈希速度是平滑向上增长的,那条实线代表的难度却呈现阶梯函数式增长。这是因为每产生2 016个区块才会调整计算难度。
图5.3 挖矿难度随时间变化(2014年年中)
注:y轴开始于80 000TH/s(全网算力)。哈希速度是基于超过1 008个区块计算出来的平均值。
资料来源:bitcoinwisdom.com
可以从另外一个角度来看网络增长率,即看平均要多长时间才能找到一个有效区块。图5.4(a)展示出区块链上两个连续区块产生的间隔时间是多少秒。它逐渐下降,跳升,又逐渐下降。当然产生这种现象的原因就是每2 016个区块之后,难度重新被设定,找到区块的时间又重新回到大约10分钟。虽然一个调整周期内难度都不会变,但是随着越来越多的矿工加入,全网哈希算力增加而难度不变,找到有效区块的速度越来越快,直到大概两个星期内2 016个区块被发现之后,难度会被重新调整。
图5.4(a)找到一个有效区块所花费的时间(2014年早期)
注:y轴开始于460秒。找到一个有效区块花费的时间是2 016个区块样本花费时间的平均值。由于当时全网挖矿速度的连续快速增长,找到一个有效区块所花费的时间在两周的时间内稳步减少。
资料来源:bitcoinwisdom.com
图5.4(b)找到一个有效区块所花费的时间(2015年早期)
注:y轴开始于540秒。找到一个有效区块花费的时间是2 016个区块样本建造时间的平均值。由于整个网络增长开始减速,所以找到有效区块的平均时间非常接近10分钟,偶尔还会因为全网算力缩小而超过10分钟。
资料来源:bitcoinwisdom.com
即使找到有效区块的时间目标被设定为平均10分钟,但是在2013年和2014年的大多数时间,这个时间平均是9分钟左右,并且在两周的周期末尾阶段时接近8分钟。计算表明,全网运算能力的增速大概是每两周25%,或者每年几百倍,这个数字非常惊人。
不出所料,这种增长不会无休止地进行,2015年的增速就降低很多(偶尔也会负增长)。在图5.4(b)中,我们可以看到全网哈希算力达到了一个稳定的状态,发现每个区块的时间非常接近10分钟,甚至有时会超过10分钟,在这种情况下难度将会被调低。这种曾经被认为不可想象的状况却在2015年频繁发生。
虽然到目前为止,全网哈希算力还没有经历过灾难性的倒退,但是并不排除它发生的可能性。一个有关比特币崩盘的设想被称作“死亡螺旋”,不断下降的比特币价格导致挖矿无利可图,矿工们因此而退出挖矿(全网运算能力下降),继而进一步导致价格下跌。
[1] 如果下一个区块始于其他人发现的有效区块,你发现的这个区块就会变成无效区块而被丢弃。——译者注