挖矿的定义:H(block header) ≤ target ( target 越小,挖矿难度越大 )
比特币用的 hash 算法是 SHA-256 ,输出 256 bit,因此整个输出空间有
2
256
2^{256}
2256 种。
d
i
f
f
i
c
u
l
t
y
=
d
i
f
f
i
c
u
l
t
y
_
1
_
t
a
r
g
e
t
t
a
r
g
e
t
difficulty = \frac{difficulty\_ 1\_target}{target}
difficulty=targetdifficulty_1_target
difficulty_ 1_target:表示挖矿难度等于1时对应的目标阈值
- 为什么要调整挖矿难度?出块时间太短会有什么问题?
出块时间太短,分岔会成为常态,其中不止有二分叉。分叉过多,不利于系统达成共识并且威胁到系统的安全性。
分叉过多,不同的矿工可能选择不同的分叉继续往下扩展,因此系统的算力会被分散。而恶意的节点可以集中算力,扩展某一个分叉,使得该分叉变成最长合法链。在这种情况下,恶意节点不再需要51%的算力才能发动攻击(51% attack),从而危害系统的安全性!
比特币中出块时间 10min ,以太坊中出块时间 15s 。以太坊中有新的共识协议:GHOST协议
需要调整挖矿难度,使得出块时间维持稳定!
-
如何调整挖矿难度?
比特币中每隔2016个区块 (约两周) 需要调整挖矿难度:
t a r g e t = t a r g e t × a c t u a l t i m e e x p e c t e d t i m e target=target\times\frac{actual \ time}{expected\ time} target=target×expected timeactual time
expected time 等于 2016 × \times × 10min 表示两个星期
actual time表示系统最近的2016个区块实际花费的时间
actual time = time spent mining the last 2016 blocks
上调阈值最大为 4 × \times × target,下调阈值最小为0.25 × \times × target -
恶意节点不调整挖矿难度咋办?
block header中有 nBits 域(32bits),用于存储 target (256bits) 编码的版本。 如果有恶意节点不调整挖矿难度,那么该区块的合法性验证 (nBits域) 不能通过。 -
比特币系统的实际情况: