本帖最后由 链小二 于 2019-11-5 13:46 编辑
11 计算(Calculations)
假设一个攻击者试图比诚实节点产生chain更快地制造替代性区块链。即便攻击者达到了这一目的,但是整个系统也并非完全受制于攻击者的掌控之中——比方说凭空创造价值(creating value out of thin air),掠夺本不属于攻击者的货币。这是因为节点不会接受无效的交易,而诚实的节点永远不会接受一个包含了无效信息的区块。所以说,一个攻击者最多可以尝试更改他自己的交易信息,并试图拿回他刚刚付给别人的钱。
诚实链条和攻击者链条之间的长度竞争,可以用二项随机漫步(Binomial Random Walk)来描述。成功事件定义为诚实链条延长了一个区块,使其领先性+1,而失败事件则是攻击者的链条被延长了一个区块,使得差距-1。
攻击者成功填补某一既定差距的可能性,可以近似地看做赌徒破产问题(Gambler’s Ruin problem)。假定一个赌徒拥有无限的透支信用,然后开始进行潜在次数为无穷的赌博,试图填补上自己的亏空(reach breakeven)。那么我们可以计算他填补上亏空的概率,也就是该攻击者赶上诚实链条,如下所示:
这里,p是诚实节点找到出下一个区块的概率;q为攻击节点找到出下一个区块的概率;qz为攻击节点落后诚实节点z个区块时候能追上的概率。假定p>q,那么攻击成功的概率就因为区块数的增长而呈现指数化下降。由于概率是攻击者的敌人,如果他不能幸运且快速地获得成功,那么他获得成功的机会随着时间的流逝就变得愈发渺茫。那么我们考虑一个收款人需要等待多长时间,才能足够确信付款人已经难以更改交易了。我们假设付款人是一个支付攻击者,希望让收款人在一段时间内相信他已经付过款了,然后立即将支付的款项重新支付给自己。虽然收款人届时会发现这一点,但为时已晚。 收款人生成了新的一对密钥组合,然后只预留一个较短的时间将公钥发送给付款人。这将可以防止以下情况:付款人预先准备好一个区块链然后持续地对此区块进行运算,直到运气让他的区块链超越了诚实链条,方才立即执行支付。当此情形,只要交易一旦发出,攻击者就开始秘密地准备一条包含了该交易替代版本的平行链条。
然后收款人将等待交易出现在首个区块中,然后在等到z个区块链接其后。此时,他仍然不能确切知道攻击者已经进展了多少个区块,但是假设诚实区块将耗费平均预期时间以产生一个区块,那么攻击者的潜在进展就是一个泊松分布,分布的期望值为:
现在,为了计算攻击者追赶上诚实节点的概率,我们将攻击者取得进展区块数量的泊松分布的概率密度乘以在该数量下攻击者依然能够追赶上的概率。
将上面的方程进行重新排列,用以避免无限级数求和:
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;
- }
复制代码对其进行运算,我们可以得到如下的概率结果,发现概率对z值呈指数下降。 当q=0.1时 z=0 P=1.0000000 z=1 P=0.2045873 z=2 P=0.0509779 z=3 P=0.0131722 z=4 P=0.0034552 z=5 P=0.0009137 z=6 P=0.0002428 z=7 P=0.0000647 z=8 P=0.0000173 z=9 P=0.0000046 z=10 P=0.0000012 当q=0.3时 z=0 P=1.0000000 z=5 P=0.1773523 z=10 P=0.0416605 z=15 P=0.0101008 z=20 P=0.0024804 z=25 P=0.0006132 z=30 P=0.0001522 z=35 P=0.0000379 z=40 P=0.0000095 z=45 P=0.0000024 z=50 P=0.0000006 求解令P<0.1%的z值: 为使P<0.001,则 q=0.10 z=5 q=0.15 z=8 q=0.20 z=11 q=0.25 z=15 q=0.30 z=24 q=0.35 z=41 q=0.40 z=89 q=0.45 z=340
12 结论(Conclusion) 本文提出了一种不需要信用中介的电子支付系统。首先从数字签名的一般框架开始讨论,虽然这种系统为电子货币的所有权提供了强有力的控制,但是不足以防止双重支付。 为了解决这个问题,我们提出了一种采用工作量证明机制的点对点网络(p2p)来记录交易的公开信息,只要诚实的节点能够控制绝大多数的CPU计算能力,就能使得攻击者事实上难以改变交易记录。该网络的强健之处在于它结构的简洁。节点之间的工作大部分是相互独立的。在p2p网络中,每个节点不需要证实自己的身份,由于交易信息的流动路径并无任何要求,所以只需要尽其最大努力传播即可。节点可以随时离开网络,而想重新加入网络也非常容易,因为只需要补充接收离开期间的工作量证明链条即可。节点通过自己的CPU计算力进行投票,表决他们对有效区块的确认,他们不断延长有效的区块链来表达自己的确认。任何需要的规则和激励都可以通过这种共识机制(consensus mechanism)来实施。
|