??挖矿的定义: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域) 不能通过。 -
比特币系统的实际情况:
|