-
挖矿的难度跟目标预值是成反比的
- 公式是:
difficulty = difficulty_1_target / target- 上面是指挖矿难度等于1的时候所对应的目标预值
- 公式是:
-
为何要调整挖矿难度?
- 系统里的总算力越来越强,挖矿难度保持不变的话,出块时间越来越短 -> 出现大量分叉 -> 诚实节点的算力被分散 ->
51% attack变得更容易(恶意节点集中算力进行分叉攻击) - 所以挖矿时间间隔应保持大概在一个常数
- 系统里的总算力越来越强,挖矿难度保持不变的话,出块时间越来越短 -> 出现大量分叉 -> 诚实节点的算力被分散 ->
-
如何调整挖矿难度?
- 实际代码里:
target = target × (actual time / expected time)- actual time指产生2016个区块实际花费的时间
- expected time指产生2016个区块应用的时间,即2016×10min
- 或等价为:
next_difficulty = (previous_difficulty * 2016 * 10 minutes) / (time to mine last 2016 blocks) - 实际上,上调和下调都有四倍的限制。假如实际时间超过了8个星期或低于半个星期,那么我们计算公式时也只能按4倍和1/4倍算
- 计算target的方法写在比特币系统的开源代码里,每挖到2016个区块会自动进行调整。nBits(4个字节)则是target(256位)一个压缩编码
- 实际代码里: