算力
比特币挖矿形同猜数字谜,矿工要找出一个随机数(Nonce)参与哈希运算 1Hash(Block+Nonce)
,使得区块哈希值符合难度要求。算力则指计算机每秒可执行哈希运算的次数,也称为哈希率(hashrate)。
下图是当前比特币算力图表 2。到 2017 年时,比特币挖矿所需算力疯涨。这与不断研发出的新型矿机投入市场有关——这些矿机利用新的技术,拥有更强的运算能力,即单位成本下的算力在快速增长,由此带来了整体算力的提升。
算力单位
算力每隔千位划为一个单位,最小单位 H=1 次
,其他分部是:
*1 H/s = 每秒可执行一次哈希运算。
*1 KH/s = 每秒 1,000 哈希(一千次)。
*1 MH/s = 每秒 1,000,000 次哈希(百万次)。
*1 GH/s = 每秒 1,000,000,000 次哈希(十亿次)。
*1 TH/s = 每秒 1,000,000,000,000 次哈希(万亿次)。
*1 PH/s = 每秒 1,000,000,000,000,000 次哈希。
*1 EH/s = 每秒 1,000,000,000,000,000,000 次哈希。
如果不清楚单位简称,可以查看下面国际单位的前缀表。
挖矿难度计算
动态调整挖矿难度 Difficulty
为什么算力会变化呢?这和比特币协议设计有关。中本聪设计比特币时,加入挖矿难度调整机制是为了使得比特币出块时间能理想的恒定在 10 分钟左右。比特币协议规定每隔 2016 个区块,将根据过去最近 2016 个区块出块总时间调整,自动调整下一个 2016 个区块的挖矿难度。理想情况下 2016 个块需要两周(2016*10 s)时间,如果实际用时不到两周则增加难度,如果超过两周就降低难度。
原本中本聪设计的是一个公平的完全去中心化的一个数字货币系统,每个人都可以使用个人电脑进行挖矿。然而,有利可图时大量新算力不断加入,矿工竞争激烈,使得单个矿工的挖矿成功率几乎为零。2011 年起矿池出现,大量矿工纷纷加入矿池,以稳定收入,摊薄成本。大量算力融入,使得比特币挖矿难度越来越大。数字货币挖矿业形同军事竞备,挖矿设备不断更新迭代,不再遵循摩尔定律。
专业矿机专门针对哈希算法、散热、耗能进行优化,这脱离了比特币网络节点运行在成千上万的普通计算中并公平参与挖矿的初衷。矿池的算力占据,也使得比特币风险一直存在:51% 算力攻击。
挖矿难度计算公式
需要多少算力才能找出一个随机数,由当前区块的挖矿难度决定,难度越大所需算力越多。但挖矿难度并不在区块信息中,只在网络节点中依据规则动态计算,公式如下:
D=T1 /T
T 字母是 Target 的缩写,D 字母是 DiFFiculty 缩写。 T1 和 T 均是一个 256 位的大数字 (big
number),其中 T1 为一个非常大的常数 2 256?32?1。依据公式,T越小,挖矿难度 D 越大。
依据公式,当 T=0
时,D 无穷大,标志着无法计算出结果。幸运的是, T 不会为 0,最小值为 1,此时难度值最大,为 2256?32?1=2224?1。当 T=T1
时,难度值为最小值 1。
目标值 Target 与挖矿难度转换
为了方便人类直观估算难度,比特币协议将大数字 T
压缩为一个浮点数记录在区块头中,字段为 bits
。
如果一个区块目标值是 0x1b0404cb,则转化成 Target 值为:0x0404cb×256(0x1b?3)。
T 使用类浮点数的一种压缩表示法 4 进行压缩,压缩计算过程如下:
- 将数字转换为 256 进制。
- 如果第一位数字大于 127 (0x7f),则前面添加 0。
- 压缩结果中的第一位存放该 256 进制数的位数。
- 后面三个数存放该 256 进制数的前三位,如果不足三位,从后补零。
例如,将数字 1000 压缩,先转换为 256 进制数:1000=0x03×2562?1+0xe8×2561?1
,结果为 [0x03,0xe8]。第一个数未超过 0x7f , 则不需填 0。但长度两位低于三位,在后面补零,最终表示为:0x0203e800