比特币挖矿难度为什么会增加
分析:比特币挖矿难度调整意味着矿工的回归
比特币挖矿难度和算力有什么关系
2009年1月3日,中本聪(Satoshi Nakamoto)在位于芬兰赫尔辛基的一个小型服务器上,中本聪挖出了 比特币 的第一个区块,并获得了50个比特币的奖励。这标志着加密数字货币时代的来临。
创世区块是区块链技术中的第一个区块,是区块链中非常独特的一环,因为它是第一个区块——整个数字基础设施中唯一没有与前一个区块连接的区块。
比特币最早的挖矿难度只有1个哈希值,可以用最弱的消费者级别的CPU来开采比特币,而且有很大的机会获得比特币。
在随后的几年里,随着交易所建立,比特币持有者之间的交易活动变得更有组织性。挖矿的难度显著增加,它需要越来越强大的处理器,到后来升级到图形处理器。2013年,专门的ASIC挖矿硬件开始出现,性能甚至远远超过最强大的图形处理器。
到2013年底,比特币挖矿难度首次达到了1个Giga hash哈希值。这是创世纪块挖矿难度的1000*1000*1000倍。之后,比特币的挖矿难度又增加了数千倍。
挖矿难度是为了保证让比特币新区块的产生速度在平均每10分钟产生一个而设置的动态参数。
每挖2016个块便会做出一次调整,调整的依据是前面2016个块的出块时间,如果前一个周期平均出块时间小于10分钟,便会加大难度,大于10分钟,则减小难度,目的是为了保证系统稳定的每过10分钟产出一个块,所以难度调整的时间大概是2周(2016 * 10 分钟)。
比特币挖矿形同猜数字谜,矿工要找出一个随机数(Nonce)参与哈希运算 1Hash(blockquan+Nonce),使得区块哈希值符合难度要求。算力指计算机每秒可执行哈希运算的次数,也称为哈希率(hashrate)。一个矿机每秒钟能做多少次hash碰撞,就是其“算力”的代表,单位写成 hash/s或者H/s。
算力单位:
1 KH/s = 1000 H/s
1 MH/s = 1000 KH/s
1 GH/s = 1000 MH/s
1 TH/s = 1000 GH/s
1 PH/s = 1000 TH/s
1 EH/s = 1000 PH/s
全网算力是btc网络中参与竞争挖矿的所有矿机的算力总和。当前难度周期全网算力会影响下一个周期的难度调整, 如果全网算力增加,挖矿难度增大,单台矿机固定时间的产出就会减少。
那么,已知当前全网算力,下一个周期难度将如何调整呢?
根据公式:
难度 * 2^32 / 全网算力 = 出块时间
出块时间要稳定在10分钟, 也就是600s:
难度 = 600 * 24.42 * 10^18 / 2^32
= 3.46e+12
那么,在3.46e+12的难度下, 一台算力为14TH/s的矿机平均要花多长时间才能出一个块呢?
根据公式:
难度 * 2^32 / 算力 = 出块时间
有:
3.46 * 10^12 * 2^32 / 14 * 10^12
= 1.06e+9 s
结果大概是12270天。
原本中本聪设计的是一个公平的完全去中心化的一个数字货币系统,每个人都可以使用个人电脑进行挖矿。然而,有利可图时大量新算力不断加入,矿工竞争激烈,使得单个矿工的挖矿成功率几乎为零。
2011 年起矿池出现,大量矿工纷纷加入矿池,以稳定收入,摊薄成本。大量算力融入,使得比特币挖矿难度越来越大。数字货币挖矿业形同军事竞备,挖矿设备不断更新迭代,不再遵循摩尔定律。
比特币挖矿的难度和算力
难度是对挖矿困难程度的度量,即指:计算符合给定目标的一个HASH值的困难程度。
difficulty = difficulty_1_target / current_target
difficulty_1_target 的长度为256bit, 前32位为0, 后面全部为1 ,一般显示为HASH值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, difficulty_1_target 表示btc网络最初的目标HASH。 current_target 是当前块的目标HASH,先经过压缩然后存储在区块中,区块的HASH值必须小于给定的目标HASH, 区块才成立。
例如:如果区块中存储的压缩目标HASH为 0x1b0404cb , 那么未经压缩的十六进制HASH为
所以,目标HASH为0x1b0404cb时, 难度为:
比特币的挖矿的过程其实是通过随机的hash碰撞,找到一个解 nonce ,使得 块hash 小于 目标HASH 值。 而一个矿机每秒钟能做多少次hash碰撞, 就是其“算力”的代表, 单位写成 hash/s 或者 H/s
算力单位:
比特币系统的难度是动态调整的, 每挖 2016 个块便会做出一次调整, 调整的依据是前面2016个块的出块时间, 如果前一个周期平均出块时间小于10分钟,便会加大难度, 大于10分钟,则减小难度,目的是为了保证系统稳定的每过 10分钟 产出一个块,所以难度调整的时间大概是2周(2016 * 10 分钟)
全网算力是btc网络中参与竞争挖矿的所有矿机的算力总和。当前难度周期全网算力会影响下一个周期的难度调整, 如果全网算力增加,挖矿难度增大,单台矿机固定时间的产出就会减少。目前全网算力大概是24.42EH/s, 一台蚂蚁S9矿机的算力大概是14TH/s
那么, 已知当前全网算力,下一个周期难度将如何调整呢?
根据公式:
因为出块时间要稳定在10分钟, 也就是600s:
那么,在3.46e+12的难度下, 一台算力为14TH/s的矿机平均要花多长时间才能出一个块呢?
根据公式:
有:
结果大概是12270天
什么是比特币挖矿难度?如何调整?原理是什么?
比特币挖矿难度(Difficulty),是对挖矿困难程度的度量,挖矿难度越大,挖出区块就越困难。目标值(Target)与挖矿难度成反比。难度越高,目标值越小。而难度目标是目标值通过转化得到,是一个只有 4 个字节的字段(为了便于理解,本文将难度目标等同目标值处理)。比特币系统正是通过调整区块头中难度目标来控制挖出区块所需平均时间的。
目标值是个长度为 256 比特的字符串,换句话说目标值约有 2^256 种可能的取值。调整难度目标就是调整目标值在整个输出空间的占比。
举例说明:挖矿就如射击,所有射出去的子弹都会落在一个很大的靶子上。难度目标就是这个大靶子上圈出一个范围,这个范围越小,被射中的难度就越高。调节难度目标,就是调节这个圈在整个靶子上的占比。
挖矿算力增大,单位时间射击的次数就越多,目标范围被射中所需的时间就越短。反之,挖矿算力减小,目标范围被击中所需的时间就越长。而比特币系统追求的平均出块时间为 10 分钟,这时候就需要调整难度目标来实现。
02 如何调整难度目标?
比特币系统是怎样调整难度目标的呢?在《白话区块链入门 080 | 数说比特币,了解 比特币 必须知道这 10 个数字》一文中,我们介绍了比特币系统每过 2016 区块(大约为 14 天时间),会自动调整一次难度目标。所有区块高度为 2016 整数倍的区块,系统就会自动调整难度目标。如果上一个难度目标调整周期(也就是之前 2016 个区块),平均出块时间大于 10 分钟,说明挖矿难度偏高,需要降低挖矿难度,增大难度目标(准确地说是目标值);反之,前一个难度目标调整周期,平均出块时间小于 10 分钟,说明挖矿难度偏低,需要缩小难度目标。
03 难度目标的可调范围
比特币系统设定,难度目标上调和下调的范围都有 4 倍的限制。举例说明:假设上一个难度目标调整周期内的 2016 个区块,由于算力暴涨,只用 7 天就全部挖出来了,通过难度目标调整,将难度目标缩小一倍,可以将平均出块时间维持在 10 分钟左右,但如果算力暴涨,前 2016 个区块全部挖出只用了 1 天,那么难度目标最小只能调整为原来的四分之一。
04 总结
比特币的算力是持续波动的,比特币系统通过难度目标的调整,使得平均出块时间维持在 10 分钟左右。难度目标和挖矿难度成反比,挖矿难度越大,难度目标越小。当区块高度为 2016 的整数倍时,比特币系统就会在该区块上,自动调整难度目标。如果上一个难度目标调整周期内,平均出块时间超过 10 分钟,那么降低挖矿难度,增大难度目标;反之则提高挖矿难度,减小难度目标。难度目标上调和下调的范围都有 4 倍的限制。
比特币每 2016 个区块(大约 14 天)调整一次挖矿难度,相比于 BCH 每个区块都调整(大约 10 分钟调整一次),有明显的滞后性。你认为是哪种调整方式更合理呢?为什么呢?欢迎在留言区分享你的观点。
比特币多久提升难度
比特币每产生2026个数据块之后更新计算难度(每个数据块包括25个左右的比特币),今天或明天应该更新一次。
越往后,每计算一个数据块所用的时间越久,计算难度更新频率越低。