这一章将着重讨论比特币挖矿(bitcoin mining)。前面章节讨论了比特币是如何依赖这些矿工们而运行的——他们查证交易记录、制造和存储全部的区块、对被写入区块链的区块达成共识、从中获取一些奖励。可是还有一些问题:这些矿工是谁?他们是如何进入这个行业的?他们是怎么运做的?他们的商业模式是什么?他们对环境形成什么影响?本章将回答这些问题。编程
5.1 比特币矿工的任务数组
要成为比特币矿工,你必须加入比特币网络并与其余节点相连,创建链接后,你还须要完成六个任务:安全
矿工的任务能够分为两类:1.验证交易和区块。这是比特币网络赖以生存和运转的基础,这些任务也是比特币协议须要矿工的首要缘由。2.和其余矿工竞争。争取找到区块并得到奖励,不是比特币网络存在所必须的,而是为了鼓励矿工去完成第一类任务而设置的。固然,这两类任务都是使比特币成为一个数字货币的必要条件,由于矿工必须得到奖励才会去完成这些重要任务。网络
寻找有效区块函数
在第3章中咱们看到,区块链主要有两层基于哈希函数的结构。1.区块链上,每一个区块头部都有一个哈希指针指向前一个区块。2.每个区块里,包括全部交易的默克尔树。性能
做为矿工,首先须要从你的交易池中选出一系列有效的交易而且编译成默克尔树。而后,组装出一个新的区块,让它的头部指向区块链的上一个区块。在新区块的头部,有一个32位的随机数区域。你须要尝试不一样的临时随机数,直到该随机数能使整个区块的哈希值小于目标值。这个目标值通常体如今以0开始的特定位数的数值。做为一名矿工,你可能使随机数从0开始,每次增长1,直到该随机数能使区块有效为止,以下图所示。区块链
图5.1.1 寻找有效区块。矿工尝试了一串都是0的随机数,但没有产生有效的哈希值,因此矿工继续尝试其余不一样的临时随机数spa
若是你在尝试了全部32为可能的取值后,仍然不能产生一个有效的哈希值,那么你就必须作出更多改变。注意,上图中(前面章节也有提到过)币基交易(coinbase)中还有一个随机数能够改动,你能够改变这个随机数,好比加1,而后就能够从新改变区块头部的随机数来寻找有效的哈希值。设计
改变币基里的随机数后,整个默克尔树上交易的哈希值都会改变,由于币基值的改变会向上传递,因此改变币基的随机数比改变区块头部的随机数代价要大。因此,通常而言,矿工都是更改头部随机数,除非在头部找不到有效的随机数,才会选择改变币基里的随机数。3d
当你坚持足够长的时间,你总能找到一对正确的临时随机数组合——头部随机数和币基随机数,用来产生一个符合哈希值要求的新区块,而后当即宣布,就有但愿得到相应区块的奖励和交易费。
决定难度
每挖出2016个区块,挖矿难度就会改变一次,而一个区块的产平生均须要10分钟,所以,大约两个星期挖矿难度会调整一次,以维持产生有一个区块所需的平均时间是10分钟,调整的方式以下公式:
下一个难度=(上一个难度 * 2016个区块 * 10分钟)/ 产生2016个区块所花费的时间
挖矿难度改变的周期是两周,并无什么特比的含义,只是一个权衡的结果。周期过短,难度会随着每个周期找到的区块数目不一样而波动(几率问题);周期太长,整个网络的哈希算力会与难度大大地失去平衡。
每一个矿工独立地计算难度,只接受达到这个难度的区块。两个在不一样分叉上的矿工可能会有不一样的计算难度,可是在同一个区块上工做的矿工必定会对计算难度达成共识。
5.2 挖矿所需硬件
矿工所要作的计算是十分困难的,其核心在于,对SHA-256哈希函数的运算。SHA-256是SHA-2这个家族里的一员,是目前被公认的最安全的哈希函数。固然,不排除随着时间的推移,其安全性可能会下降。
矿工的任务就是尽量快地进行SHA-256函数运算,并且,在比特币中,这个运算还要进行两轮。为何要进行两轮,缘由并不清楚,可是这就是比特币的个性,做为比特币矿工只能服从。
比特币挖矿工做经历了好几代的发展历程。
1.CPU挖矿。假如一个高端我的电脑每秒计算大约2千万次哈希函数(20MH/s),根据2015年早期的难度水平(2的67次方),大概须要几十万年来找到一个有效区块。因此,经过CPU挖矿,不可能赚到钱。
2.GPU挖矿。第二代矿工使用GPU来挖矿,由于GPU具备高吞吐量和高并行处理能力。可是,大量GPU堆放在一块儿,冷却处理是一个突出的问题,并且GPU也很是耗电。假如一个很是高端的显卡通过超频后能达到每秒计算大约2亿次哈希函数(200MH/s),那么,100个显卡一块儿,在2015年早期,仍须要几百年才能找到一个有效区块。所以,GPU挖矿也不赚钱。
3.FPGA挖矿(现场可编程门阵列挖矿)。FPGA比GPU性能好,特别是在数位操做方面。精心使用FPGA可使运算速度达到每秒计算大约10亿次哈希函数(1GH/s),那么,100块FPGA一块儿,在2015年早期,平均仍须要100年的时间才能找到一个有效区块。所以,FPGA挖矿也只是昙花一现,没有持续多久。
4.ASIC挖矿(专用集成电路技术挖矿)。专门为比特币挖矿而生产的ASIC矿机,由专门的供应商制造和出售。
现在,挖矿已经从我的领域转到了大型专业的挖矿中心,这些中心能够购买大量的ASIC矿机进行挖矿,从而维持利润。
将来
如今,用ASIC挖矿是惟一一种能够赚钱的比特币挖矿手段,而这对于个体矿工来讲,是十分不友好的。人们不由要问,将来如何发展?小规模矿工是否永远不可能再参与挖矿过程?更重要的是,如今使用ASIC和专业挖矿中心是否已经违反了比特币当初的设计初衷:一个彻底去中心化的系统,全部人均可以用本身的电脑去挖矿。这些问题将在第8章中探讨。
5.3 能源消耗和生态环保
比特币挖矿须要消耗大量的能源,这种“浪费”能源的形式常常被人诟病,由于SHA-256的运算没有其余任何用处。可是,咱们必须认识到,任何一种支付系统都须要能源和电力的消耗。如纸币印刷、ATM机器运行、硬币分类器、点钞机、支付服务系统、运行现钞和金条的运钞车,无一不在消耗各类能源。你也能够同样说这些能源除了维护整个货币系统外,没有任何其余用处。因此,若是咱们承认比特币做为一个有用的货币体系,那么支持比特币体系的能耗就不能认为是浪费。
5.4 矿池
对于单个矿工来讲,挖矿就是一个赌博游戏,你可能一年都找不到一个区块,而白白浪费成本,也有可能一年以内你找到了好几个区块,而后赚了一笔钱。
矿池
历史上,当小商人遇到大风险时,会自发组建一个互助保险公司来下降风险。对于比特币矿工来讲,也能够采起相似的方式。
矿池应运而生——矿池就是一个比特币矿工互相之间的保险。一组矿工能够造成一个矿池共同挖矿,并指定一个币基接受人。这个接受人就是矿池管理员。只要有人找到一个有效区块,矿池管理员就会收到这个区块的奖励,继而根据每一个参与人贡献的工做量按比例分配给全部矿池的参与者。
挖矿工分(mining shares)
挖矿工分用于衡量每一个参与人的贡献。工分,就是那些接近有效区块的区块。好比,目标值是个前面67位是0的数字,输出的哈希值必需要低于这个目标才算有效。在寻找这个哈希值的过程当中,矿工可能会找到其余一些区块,它们的哈希值也有许多0,可是达不到67个。矿工们能够用这些区块来证实他们确实在工做,一个合格的工分可能要求40-50个0,这取决于矿池的要求。
有了工分以后,管理员就能够按照工分来分配奖励。最多见最简单的分配方式有工分分成和按实际比例分成。
矿池跳换(pool hopping)
矿工在具备不一样分配方案的矿池之间进行切换,以得到更高的收益。
历史和标准化
矿池兴起于2010年比特币的GPU时代。已有不少矿池管理协议应运而生。甚至有人建议这些矿池管理协议应该被标准化,做为比特币自己的一部分。
51%矿池
2015年早期,绝大部分矿工都经过加入矿池来挖矿,只有不多的矿工还在单独挖矿。2014年6月,网络里最大的矿池GHash.IO,其算力甚至超过了比特币全网算力的50%,主要是由于这个矿池给矿工优厚的奖励,以致于你们都想加入。
一个矿池掌握了全网51%的算力是比特币社区里一个使人担心的问题,GHash也所以遭到反击,到2014年8月,GHash再也不接受新用户而主动下调了一些比例。
不管如何,矿池有可能会掩盖一个事实:实际上的算力集中在几个大的挖矿机构手上,这些大的机构能够同时参与多个不一样的矿池以掩盖它们的真实规模。这种作法称为“洗算力”(laundering hashes,相似于洗钱)。由于矿池的缘由,发现洗算力变得很是困难,这也使得外人没法知晓矿机的实际物理控制有多集中。
矿池是有益的吗
矿池的一大问题就是中心化管理。矿池管理员实际掌握了多少算力是一个问题。此外,这减小了比特币网络中全节点的数目,即要存储整个区块链、交易每个交易,如今这些均可以交给矿池管理员了。若是你对矿池的中心化模式感到不安,你可能会问:是否能够从新设计挖矿流程,你们必须本身进行挖矿。将在第8章讨论这个问题。
5.5 挖矿的激励和策略
矿工在挑选一个区块开挖以前,都须要作一些策略上的选择:
下面看看几种不一样的策略,有可能会使得挖矿收益更高。
分叉攻击(forking attack)
分叉攻击,即重复支付。一个恶意矿工给受害者Bob发送了一些比特币购买服务,Bob看到了这笔交易被放进了最长链,甚至还等到了6次确认,因而开始提供服务。可是,如今这个矿工建立了一个包含另外一个交易——双重支付交易的更长的分叉。以下图所示。
图5.5.1 分叉攻击
拥有51%算力的矿工能够经过发起分叉攻击来得到更高的收益。
经过贿赂来进行分叉攻击
经过购买足够的矿机来发起分叉攻击,是很困难且很是昂贵的。相反,能够经过贿赂那些有能力的矿工来为你工做而发起分叉攻击,是有可能的。
临时保留区块攻击(temporary block-withholding attacks)
攻击场景:当你找到一个区块后,你不是马上宣布,而是在此基础上继续寻找下一个区块。若是你的运气很好,在其余矿工找到下一个区块以前,你连续找到了两个区块,而且秘密保留它们。这时候,当一个其余矿工宣布找到一个区块以后,你就马上同时宣布你找到的两个区块,这样,另外一个矿工的那个区块就会成为孤岛,由于你的两个区块是更长的分叉,其余矿工会在你的区块后面接龙下去。这样,就致使了另外一个矿工的算力浪费。这种行为成为自私挖矿(selfish mining),以下图所示。
图5.5.2 自私挖矿。1是攻击以前的区块链,2和3是攻击者的两个区块,4是非攻击者的区块,会成为孤岛。
黑名单和惩罚分叉攻击
若是一个矿工想把一个来自地址X的交易列入黑名单,换句话说,想冻结从该地址出来的钱。传统观点都认为在比特币里这种黑名单没有办法实施,由于即便有些矿工拒绝把交易放进区块链,其余一些矿工仍是会放进区块链。可是,若是你拥有网络的大部分算力,你能够对全部矿工宣布:我将拒绝在包含来自该地址的交易的区块链上工做。这是由于你拥有网络的大部分算力,区块链的延展基本是你说了算,若是有的矿工执意要把这些交易(来自地址X)放进区块链,那么他们的区块必将是区块链的分叉,而最终成为孤岛,浪费算力。
羽量级分叉
若是你没有那么大的算力,那么你的宣布就是自找麻烦。由于,若是其余矿工没有按照你宣布的意愿来,那么你就可能会被排除在最长的共识链以外。一个重要的缘由是,你的说法——我将拒绝在包含来自该地址的交易的区块链上工做——太绝对了,这会致使一个硬分叉。因此,你应该对其余矿工宣布:我将尝试发起分叉,但过一段时间我可能会放弃封杀的尝试。例如,你能够宣布:当k个区块证明从地址X出来的交易是正当的,那么我就回到最长共识链上。
这种状况下,只要你有必定的算力,你就有可能说服其余矿工来加入你,一块儿拒绝来自地址X的交易。只要你把你的计划公布出来,其余矿工就会知道:若是他们胆敢把这个来自地址X的交易放入本身的区块,那么就有必定的可能会丧失本身已经发现的区块【被你的羽量级分叉攻击(feather forking)所消灭】。
最终就演化成:其余矿工通过理性思考,将决定是否加入你对X地址的封杀行动。因此,这个攻击,即封杀地址X,要想成功,关键在于确保其余矿工相信你将会进行分叉攻击。
逐渐转移到用交易费来奖励挖矿
随着挖矿奖励逐渐发完,交易费将变得愈来愈重要,由于若是一笔交易没有交易费,那么矿工不会打包这笔交易,或者最后再打包。
未解的问题
1.矿工能够自由选择挖矿策略,可是目前,大多数矿工仍是选择默认策略,如今比特币运行得很好,也很稳定,可是在理论上,咱们暂时没法论证这是一个稳定的机制。
2.默认策略可以在实际中一直保持有效,咱们没有把握。
3.这个系统将如何演化,是尚不清楚的。基于博弈论对此进行预测也是一个很是有趣的前沿研究领域。