如何计算实际的51%的攻击概率呢? 全文见
http://blockindex.info/blog/51.htmlbitcoin创建到现在总计产生30多万个block, 我们可以用这30多万个block的时间来估算51%攻击实际的概率和需要的时间
以下以6个confirm为例,来计算实际可能的概率
正常的 blockchain, 我们称之为C
[]----->[]----->[]----->[]----->[]----->[]----->[] C blockchain
诚实节点计算的 A blockchain
攻击节点计算的 B blockchain
[]----->[]----->[]----->[]----->[]----->[]----->[] A blockchain
\
[]----->[]----->[]----->[]----->[]----->[]----->[] B blockchain
分别计算每连续6个block的生成时间间隔:
t1 = blk5.time - blk0.time t2 = blk6.time - blk1.time ..... tx = blkn.time - blk(n-5).time
这样得到100%算力的C的连续生成6个块的时间集合 {t1,t2,t3....tx} TC1
然后用同样的方法计算连续生成7个block的时间间隔, 得到100%算力的C的连续生成7个块的时间集合 {t1,t2,t3....} TC2
对TC1绘图,得到正常的C blockchain 连续生成6个block时间分布曲线
x为连续的6个block
y为生成连续的6个block的时间
时间分布曲线
http://blockindex.info/blog/imgs/6.png对时间排下序得到下图,可以得到连续生成6个block需要的最少时间和最多时间
时间分布曲线
http://blockindex.info/blog/imgs/6s.png然后对T1计算,每间隔10秒内Tx的数目, 得到{len(T1...Tx),len(Tx+1....Tx+n)....},得到密度分布曲线,如下
http://blockindex.info/blog/imgs/6d.png时间分布曲线
上图可以看出连续生成6个block需要的时间
每隔20000个block分别计算密度分布,难度应该变化10倍左右,算力变化x倍,发现block生成时间密度曲线基本重合
http://blockindex.info/blog/imgs/xd.png 把A和B看成一个独立的blockchain,则 A,B生成block概率的密度分布应该和C一致,但是由于A,B的算力下降,所以把时间轴等比缩放,
A 连续生成6个块需要的时间集合{t1,t2,t3....} TA = TC1 * 100/(1-49)
B 连续生成7个块需要的时间集合{t1,t2,t3....} TB = TC2 * 100/(1-51)
时间分布曲线
http://blockindex.info/blog/imgs/51d.png得到A,B的曲线(左边为A,右边为B),和A可能的连续生成6个block的时间集合TA,和B连续生成7个block的时间集合TB
现在问题转化为在TA中随机选一个时间,大于TB中任意元素的概率
代码如下:
AB为有序集合,从小到大依次排列
AB中任意取元素a,b, 计算a>b的概率
def AB (A,B):
N = []
qz = 0.0
for i,a in enumerate(A):
n = 0
for b in B:
if a<=b: break
else: n+=1
N.append(n)
return float(sum(N))/(len(B) *len(A))
实际的计算结果
51% 算力攻击, height高度为280000~300000, 20000个block的生成时间密度计算成功的概率为
z=0 P=1.000000
z=1 P=0.25991752883
z=2 P=0.327356211643
z=3 P=0.362791063488
z=4 P=0.38572021231
z=5 P=0.402129295953
z=6 P=0.41492854999
如果觉得20000个样本不够,那么以height高度为200000~300000的, 100000个的生成时间密度计算成功的概率为
z=0 P=1.000000
z=1 P=0.258909623337
z=2 P=0.327897207064
z=3 P=0.363898341947
z=4 P=0.387023480539
z=5 P=0.403786580212
z=6 P=0.416886094841
全文见
http://blockindex.info/blog/51.html