主页 > imtoken钱包官网大陆苹果怎么下载 > 为什么比特币最长链共识是6个区块确认???4、8、11还不够???

为什么比特币最长链共识是6个区块确认???4、8、11还不够???

知道

了解比特币的人都知道,比特币有6个区块的最长链确认机制,但我们都知道。我们有没有想过为什么这里有 6 个而不是 4 个、8 个或 11 个?

只是为了确认随机决定,但中本聪是谁?当他考虑这个问题时,他是怎么想的?

不问

由于各种因素,区块链上不可避免地会出现临时分叉。简单来说(只是表达这个原理,实际可能不会这样计算),当链上发生节点攻击,发生分叉时,在某个出块时间内,要么是诚实节点出块一个块,或者攻击节点会产生一个块,简而言之,其中一个肯定会产生一个块。假设他们出块的概率是p和q,攻击节点会在自己的链上继续出块,p+q=1。

一般攻击节点的算力不会太大。这里我们以诚实节点出块的概率为 3/4,攻击节点出块的概率为 1/4 为例。然后他们各自出块,然后继续出块,他们成为主链的概率分别是9/16和1/16。继续下去,诚实节点的链上确认的区块越多,成为合法主链的概率就越大(当然这是假设诚实节点有更大的算力),成功率会接近1未来。反之,攻击节点的成功率将继续接近于零。

综上所述,当发生分叉时,需要N个区块确认才能确认最长的链。至于这个N,是什么?

在基于算力的双花分析中,列出了一个表格来表示攻击节点出块的概率、诚实节点确认的块数和攻击节点的攻击成功率之间的关系。从表中可以看出,当攻击节点拥有2%的算力且诚实节点确认5个区块时,攻击成功的概率大约为零。这里也可以看出,比特币的“6个区块确认最长链”标准是基于攻击节点拥有10%算力的假设(这个攻击强度已经相当可观了)!

基于算力的双花分析

知道为什么

事实上,中本聪在他的比特币白皮书中已经提到了这个问题(中文翻译点这里):

考虑以下场景:攻击者试图创建替代区块链的速度比诚实节点生成链的速度要快。即使达到了这个目的,整个系统也不会完全受制于攻击者的任意意志,比如凭空创造价值,或者掠夺不属于攻击者的货币。这是因为节点不会接受无效交易,诚实节点永远不会接受包含无效信息的区块。攻击者最多只能更改自己的交易信息,并试图取回他刚刚支付给别人的钱。诚实链和攻击者链之间的竞争可以用二项式随机游走来描述。成功事件被定义为诚实链被扩展一个块,使其领先+1,而失败事件是攻击者' s 链被延长了一个块,使间隙-1。攻击者成功填补给定空白的概率可以近似为赌徒的毁灭问题。假设一个赌徒有无限的透支信用并开始赌博可能无限次以试图弥补他的不足。然后我们可以计算他填补了这个空白的概率,也就是攻击者追上诚实链的概率,如下:

图像.png

假设 p>q,攻击成功的概率随着块数的增加呈指数下降。由于概率是攻击者的敌人,如果他不幸运且不能快速成功,那么他成功的机会就会随着时间的推移而变得渺茫。然后我们考虑收款人需要等待多长时间才能充分确信付款人难以更改交易。我们假设付款人是一个付款攻击者,想要在一段时间内说服收款人他已经付款,然后立即将付款还给自己。虽然收件人届时会发现,但为时已晚。收款人生成一对新的密钥,然后只留出很短的时间将公钥发送给付款人。这将防止付款人提前准备好一条区块链,然后在这个区块上不断操作,直到运气使他的区块链超过诚实链,并立即执行付款的情况。在这种情况下,一旦交易被发送,攻击者就会秘密地准备一个包含交易的替代版本的平行链。然后收款人将等待交易出现在第一个块中,然后等待 z 个块将其链接起来。此时,他仍然不知道攻击者究竟推进了多少个区块,但假设诚实的区块会花费平均预期时间来产生一个区块,那么攻击者的潜在进展是一个期望值为 的泊松分布:并立即执行付款。在这种情况下,一旦交易被发送,攻击者就会秘密地准备一个包含交易的替代版本的平行链。然后收款人将等待交易出现在第一个块中比特币确认数是什么,然后等待 z 个块将其链接起来。此时,他仍然不知道攻击者究竟推进了多少个区块,但假设诚实的区块会花费平均预期时间来产生一个区块,那么攻击者的潜在进展是一个期望值为 的泊松分布:并立即执行付款。在这种情况下,一旦交易被发送,攻击者就会秘密地准备一个包含交易的替代版本的平行链。然后收款人将等待交易出现在第一个块中,然后等待 z 个块将其链接起来。此时,他仍然不知道攻击者究竟推进了多少个区块,但假设诚实的区块会花费平均预期时间来产生一个区块比特币确认数是什么,那么攻击者的潜在进展是一个期望值为 的泊松分布:

图像.png

转换为以下形式,避免对无限序列求和:

图像.png

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

#include 
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;
}

复制上面的解释后,我们可以在这里测试一下代码,看看为什么会被6个blocks确认???

这是我的测试代码:

AttackerSuccessProbability_test

编译并运行:

图像.png

这个结果和上面提到的参考表略有不同,但总体来说还不错(上面的结果和白皮书给出的计算结果是一样的)。假设攻击节点有10%的算力(这个算力相当可观),当诚实链确认的区块数量达到6个时,其攻击成功的概率为0.02%,与之前的值相比足够接近 0,而远离 0.1%(确认区块为 5 攻击成功的概率为 0.09%)。

写在背面

最近工作比较忙,好久没有更新文章了(快一个月了)。经过这两周的工作,感觉自己在区块链上真的还是个新手,还有很多东西需要深入了解。

链圈路漫漫其修远兮,我会上下求索!(好在潮哥只混链圈,最近币圈比特币带动的暴跌完全不影响潮哥对区块链技术的热情……)。

参考

.

.

.

.

互联网颠覆世界,区块链颠覆互联网!------------------------------------ ----------------- ----------20181129 23:38