投稿
简析POW共识机制的比特币网络的安全性
布洛克科技
15天前
12991

全文共计3574字,预计阅读7分钟

布洛克科技按:比特币的安全性是一个很值得研究的大问题。就目前看来,比特币的安全性十分良好,经过十年的运行这个体系变得更稳定而不是像哈尔·芬尼接受中本聪的第一笔比特币支付时那样对交易是否会被接受一无所知。


程小永    清华大学互联网产业研究院研究员

沈寓实    国家千人计划评审专家&清华大学互联网产业研究院研究员

黄京磊    清华大学金融协会会长

比特币的安全性是一个很值得研究的大问题。就目前看来,比特币的安全性十分良好,经过十年的运行这个体系变得更稳定而不是像哈尔·芬尼接受中本聪的第一笔比特币支付时那样对交易是否会被接受一无所知。关于各类可能的攻击形式,我们仅在此介绍它们的目的、方式和比特币的应对策略。对于技术实施的细节,我们推荐大家参考一些更为专业的书籍。

(1)双重支付

双重支付攻击在前面已经有所提及。总而言之,在攻击者没有掌握绝对算力时,其他矿工会因为激励机制废弃双重支付交易和其所在区块,导致攻击者遭受损失。掌握绝对算力之后,由于比特币打包区块过程并不是一个“赢者通吃”的过程,而只是几率占比更大。当然一直保持几率更大从概率计算的角度确实能使得双重交易成功(即使比特币接受者等待了6个区块才支付商品或服务),但这种维持算力的成本过于高昂。而且当其他节点意识到攻击发生时,他们会因为安全性的崩塌而放弃比特币体系,这会打击比特币的价值并降低双重支付的收益。逐利的矿工们并不会这样做。

(2)女巫攻击

女巫攻击指的是黑客恶意大量制造节点导致混乱,因为在比特币中女巫攻击只是自然身份的创造,而比特币给予每个自然身份的权利都是相同的:贡献算力来获取比特币和自由使用它们。制造更多的节点既不会增加算力也不会给予节点更大的使用特权,所以女巫攻击只是徒劳的。另外,基于交易的分布式账本也避免了女巫攻击造成存储崩溃的局面。

(3)盗用比特币

盗用的发生只可能在私钥发生泄露的时候,不过这已经是比特币体系之外的事了。毕竟比特币以自然身份为节点的,不能保证在用户收到威胁或诱骗而吐露私钥时,对其真实的社会身份进行验证。如果用户的私钥没有丢失,哈希函数的性质告诉我们:盗用就是不可能的。当然,拥有SHA-256也并不就能就让我们高枕无忧了。它也有被日益提升的算力攻破的可能,但至少还需要一段时间。

(4)黑名单攻击

这是一个理论上存在的攻击方式。比如一名占有全网0.01%算力的矿工宣称自己不会将来自于A地址的交易打进区块里,并且不接受任何打有含A地址交易的区块。虽然拥有这一点点算力的矿工貌似并不会改变其他节点的行为,但请让我们从概率的角度思考。如果一名其他的矿工打了含A地址交易的区块,它的区块下一次被延伸的可能性只有99.99%;而如果它不打含A地址的交易,假如自己挖到区块,被承认的概率将是100%。如果矿工打进A交易获得的交易费小于他打整个区块的收益乘以0.01%,他理性的选择就是不把这笔交易放入区块,于是最后A的交易就真的没有矿工愿意打入区块。A相当于上了比特币的黑名单,它再也无法使用比特币了。不过这种攻击也有前提,就是A需要把这种想法让绝大多数矿工知晓,而这是很困难的。另外如果出现这种攻击,同样会损害比特币的安全性,进而影响比特币的价值。对于以挖矿收益作为支撑其电费的矿工来说这也是难以接受的。

(5)分叉攻击

拥有一定算力的人可以这样做,连续打两个区块但不公布,然后在第一个区块已经公布而第二个区块尚未公布的情况下直接公布两个区块,使得两个区块所在的链成为最长链而被延伸。第一个公布的区块成为“孤块”而遭废弃。不过这样的收益并不大,而且概率很低。即使矿工拥有全网10%的算力,这样做成功的机会也只有1%。在剩余99%的概率中,矿工都要担负挖掘这两个块的成本,显然是得不偿失的。

(6)匿名性与透明性

我们常说比特币既具有匿名性,又具有透明性,这仿佛是一对矛盾。实际上,这是对比特币两个不同维度的刻画。匿名性是说自然身份与社会身份的割裂关系,透明性则是说自然身份在比特币体系中每笔交易的来龙去脉都向全部节点公开。这是在去中心化体系中做的一次取舍。节点需要公开一部分隐私,让其他节点相信并愿意帮它记录交易。这包括了交易的对象、金额、时间和频率。从这些信息我们也许能推测自然身份后面隐藏的真实身份,因此之后还专门有混币交易、零币、零钞等增强匿名性的改进方案。现实生活中我们可能把社会身份与交易细节向特定的中心化机构公开,因此在他们面前我们是完全可视的;比特币的世界中自然身份是可视的,社会身份则不是。匿名性与透明性都是比特币去中心化产生的特征。

(7)关于“双重支付”的安全性证明

其实我们不愿过多的涉及数学计算,但我们认为这段关于“双重支付”的安全性证明委实重要。它说明了尽管“双重支付”是事实上可能发生的,但概率上是不可能发生的。如果读者朋友们对数字实在不感兴趣,跳过这一部分即可。

如果我们只考虑最简单的情况,算力攻击可以抽象成如下问题:区块链体系中诚实者增加一个诚实区块我们称之为“成功事件”,需要给结果加1;而如果攻击者增加一个虚假区块我们称之为“失败事件”,需要给结果-1。由于攻击者需要重新伪造一个区块,所以可以假设他们先天就少一个块,而目标是赶上诚实节点增加区块的速度,从而是自己成为最长链。这与“赌徒破产理论”颇为类似。假设一个赌徒最开始先欠一定的钱,但是可以无限投掷,那么如果可以不限尝试次数的话,赌徒最终能够收支平衡的可能性是可以计算的。类比赌徒破产理论,在这里攻击者创造的链长(块数)超过诚实节点创造的链长(块数)也是可以计算的。

假设p为诚实节点成功打包下一个块的可能性;q为攻击者成功打包下一个块的可能性;qz为攻击者经历z个区块后最终赶上诚实节点的概率。

image.png

假定p>q(否则的话一个区块链中的诚实算力就小于攻击算力了,而这在正常的体系内不会发生),那么随着z增加,概率就会呈指数级下降。由于概率对攻击者不利,如果攻击者不能在早期靠运气赶上诚实节点的话,越往后机会越渺茫。

那么,现在我们进一步思考一下。对于收款人来说,一个交易打包进新块后需要等多久才能确认付款人就无法改变交易了呢?假定付款人就是那个攻击者,他希望收款人相信他已经完成支付了,然而他等会儿会把这笔钱再转给自己。一般来说,如果出现这种支付作废的情况时,系统会给收款人提个醒,所以付款人希望的是这个提醒最好是等来不及了的时候再发,比如等到收款人已经兑现了服务之后再说。

攻击的过程通常是这样的:收款人会为这个交易生成一对新秘钥,然后在付款人准备签名支付前才会把公钥发过去。这样就可以防止付款人预先准备好一系列合法的区块,并提前进行工作量证明从而能够瞬间执行交易。一旦这个要撤回的交易发送出去后,付款人同时悄悄建立一个(篡改了之前那笔交易的)并行链条分支。

收款人待交易加入一个区块之后还要再等z个块。他并不知道攻击者已经创建了多个块了,但假定诚实区块建立时间为平均建块时间的话,攻击者可能的进程就会符合带有期望值的泊松分布。

image.png

为了计算出攻击者从现在起仍然能够赶上正常链的概率,我们将他可能做的每一个步的泊松密度与他在那一步之后可能赶上正常节点的可能性相乘:

image.png

为避免将分布中的无限小项求和,可将公式化简为:

image.png 

转换成C语言代码:

image.png

运行代码后,我们可以看出随着z增加,概率会随着z增加而呈指数级下降:

q=0.1

z=0 sum=1.0000000

z=1 sum=0.2045873

z=2 sum=0.0509779

z=3 sum=0.0131722

z=4 sum=0.0034552

z=5 sum=0.0009137

z=6 sum=0.0002428

z=7 sum=0.0000647

z=8 sum=0.0000173

z=9 sum=0.0000046

z=10 sum=0.0000012


q=0.3

z=0 sum=1.0000000

z=1 sum=0.1773523

z=2 sum=0.0416605

z=3 sum=0.0101008

z=4 sum=0.0024804

z=5 sum=0.0006132

z=6 sum=0.0001522

z=7 sum=0.0000379

z=8 sum=0.0000095

z=9 sum=0.0000024

z=10 sum=0.0000006

如果限定攻击者攻击成功概率<0.1%的话,可以计算不同攻击者算力占比条件下的对应等待时间z:

image.png 

由此可以看出,当攻击者算力占比非常低时,等待六个块以上即可以达到非常安全的保障。而即使攻击者算力占比增大到一定程度,也可以依赖增加交易确认后延伸的区块数目使双重支付的风险被限定在很小的比例内。

来源:布洛克科技 

本文为布洛克科技原创,如需转载,请注明来源

——TheEnd——



关注“布洛克科技”

1538278595194158.jpg

领先的区块链社群媒体

© 布洛克科技——领先的区块链社群媒体 版权所有-洛阳强晋电电文化科技有限公司

豫ICP备18020747号-1         关于我们 | 版权声明 | 联系我们