从零搞懂区块链(5):家里有矿心不慌
我们经常听到比特币网络中有“挖矿”和“矿工”的说法,这是什么意思呢?又是如何进行的呢?
矿工是比特币网络里的一种节点角色,他一直在收集网络中广播的交易记录,并致力于计算区块的数学难题及工作量证明。
矿工通过计算寻找符合要求的解(即满足要求的随机数),这个过程就称为挖矿。一旦找到了这个随机数,矿工就会向全网广播自己的结果。其它矿工节点可以检验其是否符合规则。只要其它节点通过计算哈希值发现其确实满足要求(小于目标哈希值),那么该数据块就是有效的,其他节点就会接受该数据区块,并将其附加在自己的区块链之后,从而延续比特币的区块主链。其它的矿工节点读取最新区块中的交易信息后,会将这些交易ID从自己的交易缓存池中清除出去,即不对交易进行重复打包。在更新了自己的比特币交易数据库和回滚交易数据库后,会立刻开始进行下一个区块的计算。
即然挖矿有奖励,那大家都来挖矿,同一时刻可能出现很多合格的区块,造成区块链容易分叉的问题。为了防止分叉,需要对挖矿的难度进行控制,减少同一时刻不同矿工挖出合格区块的几率,这就是挖矿的难度调整。
挖矿的难度是由哈希算法的性质决定的,计算出的哈希值的有效性跟目标值密切相关,只有小于目标值的哈希才是有效的,这个目标值是比特币网络里定义好的,是一种共识机制,无法人为修改。这个目标值非常小,计算出来的哈希值小于该值的几率是非常渺茫的,可能计算数十亿次才能够中一次,比如下图是某个计算出来的哈希值,要有18个前导0才能满足系统约定好的难度要求。这也就是挖矿如此之慢的根本原因。
区块头里面所有的特征值都是固定的,比如地址、交易信息、时间戳等等,那么如何让计算出来的哈希值产生变化呢?所以中本聪在设计区块头结构的时候,专门增加了一个随机项叫Nonce,矿工的工作就是猜出这个Nonce的值,使得计算出的区块头哈希值可以小于目标值,从而挖到一个能被其它节点接受的区块。
Nonce的值是非常的难猜的,目前来看只能通过穷举法一个一个的试验。协议中规定的Nonce值是一个32位的二进制值,最大可以达到21.47亿,要在这么多数字里面找到一个满足要求的值,计算量是非常大的。
挖矿难度是每隔一段时间就调整一次的。中本聪在设计比特币的时候,已经预见到了硬件的算力在不断地增长,而且加入到网络的节点数量也会随时发生变化,为了解决这个问题,中本聪提出了工作量证明(PoW)的思路,采用移动平均目标的方法来确定一个挖矿难度。使得在这个难度值下每小时生成区块的速度为某一预设的平均数,如果区块生成的速度过快,难度就会相应的提高。
为了防止难度变化过快,比特币网络的难度调整周期为2016个块。难度调整幅度要求小于一个阈值。目前是四倍,下一个难度值是当前难度值的四倍或1/4。如果超过四倍值,则按四倍处理,到下下一个难度调整周期再继续调整。
挖矿难度是怎么控制的呢?在区块头中有一个区块难度参数,称为Bits,它是用指数形式表示的一个256位难度目标值。例如Bits值为0x1b0404cb,则其对应的十六进制的目标Hash值就是:
矿工挖矿时计算出的区块哈希值,必须比这个值小(通常也说计算出的哈希值前导零的数量比目标哈希值的前导零多),才能被系统接受。所以说改变这个bits参数的值,就是改变了目标哈希值的大小,从而调整了挖矿的难度。调整的原则是保证全网大约每十分钟能够产生一个新的区块。再结合每四年减半的奖励机制,就可以保证在2140年左右产生总量为2100万个比特币的金融总量。改变这个bits参数的方法是每产生2016个区块,就检查一次出块所花费的时间,上一周期内全部区块的产生周期是否为两周,即约每十分钟出一个区块,共2016个区块。如果耗时大于两周,则难度会调低,如果小于两周,则难度会调高,最终保证大约十分钟产生一个新的区块。
等都挖完了,也就是说等到全部2100万个比特币全都发行结束以后。矿工就靠打包交易的手续费来继续维持挖矿的动力。因为到那时可能比特币扩容问题早已解决,交易吞吐量可能也已远远超过现在,于是就有比较可观的手续费来继续让矿工维持挖矿。手续费的存在,也可以防止大量微额交易对比特币网络的“粉尘攻击”。比特币也有更小的单位,最小可细分到小数点后8位(聪)。(1BTC=1亿聪)货币紧缩的政策促使更多的矿工加入到挖矿节点,保障了比特币网络的安全性。
按照比特币产出的运算公式,几乎每逢四年产出都会减半,最终达到极值2100万个,到2013年比特币已经产出了大约1100万个。每秒13G的矿机机器,按照2013年的全网算力和全网算力和难度,每天24小时大约能挖到0.035个比特币。所以说挖矿实际上是矿机装备性能的竞争,由非常多张显卡组成的挖矿机,组团之后的运算能力还是能够超越大部分用户的单张显卡的。
为什么要用显卡做矿机?挖矿主要是进行数据的并行计算,CPU主要是为串行指令而进行优化的,而GPU则是为大规模并行计算而优化的,现代的多核CPU针对的是指令级并行计算和任务的并行,而GPU则是进行数据的并行计算,GPU往往拥有更大的带宽和显存,也就是Memory,因此在大吞吐量的应用中也会有很好的性能,而且每台主机可以插多个显卡,工作效率比用CPU要更高。
目前主流的矿机计算的算力为14T左右,也就是说每秒钟大概可以计算1.4×1013次哈希。一个矿工在全网算力中的占比,也就是他获得记帐权的概率。也就是说你希望挖到更多的比特币,那么你就要相应的提高自己的计算能力,也就是相应地要提高自己挖矿设备的资金投入,这两者之间是正比的关系。比如你想要达到全网20%的记账概率,那么你的算力也必须要达到全网算力的20%。
由于单台矿机的算力有限,所以目前产生了矿池的概念。矿池就是由很多计算机联合在一起,组成一个巨大的计算设备(矿池)来进行挖矿。
矿池就可以突破地理位置的限制,将分散在全球的矿工的算力进行连接,一起来挖矿。矿池负责信息的打包和区块的发布,接入进来的矿场算力负责竞争记账权,也就是计算区块哈希值的Nonce值。矿池挖矿所产生的比特币奖励,会按照每个矿工贡献算力的占比来进行分配。
目前全球排名前五的矿池:蚂蚁矿池,莱比特矿池,BT c dot,com鱼池,viaBTC都是中国的矿池chi,中国矿池算力已占全网75%以上。世界上首台挖矿专用芯片由我国芯片企业阿瓦隆于2012年研发制造,目前已经迭代到第四代。
全球比特币的节点分布,主要分布在美国和欧洲,中国的算力虽然巨大,但是比特币的全节点数量并不多,只占到全球的7.03%,而美国则占了27.66%。
挖矿相关的内容就先介绍到这里,下一次我们将就比特币的交易过程进行分析,从而逐渐深入地对区块链的运作过程及原理抽丝剥茧,欢迎大家持续关注!作者:币布斯链接:https://www.jianshu.com/p/b9a8f8140021来源:简书