区块链大学Bitcoin(比特币)源码研读及相关技术小白学习区块链

比特币最长连共识为什么是6个块确认???4个,8个,11个不行吗

2018-11-29  本文已影响0人  WallisW

知其然

我们知道比特币的都知道比特币有一个6个区块的最长链确认机制,但是知道归知道.我们可曾想过这里为什么是6个,而不是4个,8个或者11个呢?

难道就是为了确认随便定的吗,可是堂堂中本聪何许人也?他在考虑这个问题时候又是怎么想的呢?

不求甚解

由于各种因素,在区块链上会不可避免地产生临时分叉.简单地说(只是表达这个原理,实际可能不是这么计算),当有链上发生节点攻击而产生分叉时,在一定的出块时间内要么诚实节点出块,要么攻击节点出块,总之肯定有一个会出块。假设他们出块的概率为p和q并且攻击结点会一意孤行的在自己的链不断出块,p+q=1。

一般攻击节点的算力也不会太大,我们这里举例诚实节点出块概率为3/4,攻击节点概率为1/4,那么他们各出一个块后再继续出块他们成为主链的概率分别为9/16和1/16。继续下去当诚实节点的链上确认块越多,成为合法主链的概率也就越大(当然这都是假设诚实节点算力较大),越往后这个成功率就会趋近于1。反之,攻击节点的成功率就会不断趋近于零。

综上,当产生分叉时就需要N个区块的确认来确认最长链,至于这个N到底是几呢?

Analysis of hashrate-based double-spending(基于哈希率的双重支付分析)中列出一个表来表示攻击结点出块概率,诚实节点确认块数和攻击结点攻击成功率的关系.从表中可以看出,当攻击节点拥有2%算力,诚实节点确认5个块后,攻击成功的概率就约等于零了。这里也能看出比特币的“6个区块确认最长链”的准则是基于攻击节点拥有10%的算力假设(这个攻击实力已经相当可观了)!

Analysis of hashrate-based double-spending

知其所以然

其实,这个问题中本聪在他发布的比特币白皮书(中文翻译戳这)中已经有所提及:

设想如下场景:一个攻击者试图比诚实节点产生链条更快地制造替代性区块链。即便它达到了这一目的,但是整个系统也并非就此完全受制于攻击者的独断意志了,比方说凭空创造价值,或者掠夺本不属于攻击者的货币。这是因为节点将不会接受无效的交易,而诚实的节点永远不会接受一个包含了无效信息的区块。一个攻击者能做的,最多是更改他自己的交易信息,并试图拿回他刚刚付给别人的钱。 诚实链条和攻击者链条之间的竞赛,可以用二叉树随机漫步(Binomial Random Walk)来描述。成功事件定义为诚实链条延长了一个区块,使其领先性+1,而失败事件则是攻击者的链条被延长了一个区块,使得差距-1。 攻击者成功填补某一既定差距的可能性,可以近似地看做赌徒破产问题(Gambler’s Ruin problem)。假定一个赌徒拥有无限的透支信用,然后开始进行潜在次数为无穷的赌博,试图填补上自己的亏空。那么我们可以计算他填补上亏空的概率,也就是该攻击者赶上诚实链条,如下所示:

image.png
假定p>q,那么攻击成功的概率就因为区块数的增长而呈现指数化下降。由于概率是攻击者的敌人,如果他不能幸运且快速地获得成功,那么他获得成功的机会随着时间的流逝就变得愈发渺茫。那么我们考虑一个收款人需要等待多长时间,才能足够确信付款人已经难以更改交易了。我们假设付款人是一个支付攻击者,希望让收款人在一段时间内相信他已经付过款了,然后立即将支付的款项重新支付给自己。虽然收款人届时会发现这一点,但为时已晚。 收款人生成了新的一对密钥组合,然后只预留一个较短的时间将公钥发送给付款人。这将可以防止以下情况:付款人预先准备好一个区块链然后持续地对此区块进行运算,直到运气让他的区块链超越了诚实链条,方才立即执行支付。当此情形,只要交易一旦发出,攻击者就开始秘密地准备一条包含了该交易替代版本的平行链条。 然后收款人将等待交易出现在首个区块中,然后在等到z个区块链接其后。此时,他仍然不能确切知道攻击者已经进展了多少个区块,但是假设诚实区块将耗费平均预期时间以产生一个区块,那么攻击者的潜在进展就是一个泊松分布,分布的期望值为:
image.png
化为如下形式,避免对无限数列求和:
image.png

此外,他还给出了C语言的实现:

#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
 double p = 1.0 - q;
 double lambda = z * (q / p);
 double sum = 1.0;
 int i, k;
 for (k = 0; k <= z; k++)
 {
     double poisson = exp(-lambda);
     for (i = 1; i <= k; i++)
     {
         poisson *= lambda / i;
     }
     sum -= poisson * (1 - pow(q / p, z - k));
     }
 }
 return sum;
}

copy完上面的解释后,到代码这里我们就可以亲测一下为啥是6个区块数确认呢???

这是我的测试代码:

AttackerSuccessProbability_test

编译并运行:

image.png

这个结果和上面提到的参考表在数值上会有一些出入,但是大体不差(上述结果和白皮书给出计算结果相同).当假设攻击结点拥有10%算力(这个算力已经相当可观),当诚实链确认块数达到6的时候其攻击成功的概率为0.02%,这个值相比上个值足够接近0并远离0.1%(确认块为5时攻击成功概率为0.09%).

写在后面

最近刚工作比较忙所以好久(快一个月了)没有更新文章了.近两周的工作,感觉自己真的还是个区块链里的小白,还有很多东西需要去吃透吃通.

链圈路漫漫,吾将上下而求索!(还好超哥只在链圈混,最近币圈比特币带动的暴跌丝毫不能影响超哥对区块链技术的热情...).

参考文献

.
.
.
.

互联网颠覆世界,区块链颠覆互联网!

--------------------------------------------------20181129 23:38
上一篇下一篇

猜你喜欢

热点阅读