51% 攻击
- 是指在区块网络中的打包权被优势节点连续获得
- 比如说比特币,某个矿工节点有很强的算力, 使得在一段时间之内,每一次打包全都是被它抢到
- 当发生这种情况的时候,具备很强算力的节点就可以发动51%攻击了
- 所谓51%攻击是指它能达到的算力,能达到全网的51%
- 这里51%一只是一种称呼,并不是说一定要正好达到51%的算力
- 实际上即便是达到10%,20%的算力,有时候也足以来对这个网络发动51%攻击
- 一旦打包权被某一个打包节点控制的时候,就可以篡改已发生未确认的事务实现双花或干扰
- 双花的举例:
- 买咖啡并不需要我转发的事务被打包以后,才会给咖啡,而是直接看着转账就可以提供咖啡了
- 由于一笔转账事务没有被打包,而我又掌握了打包权,我就可以把自己的转账事务删除
- 店家最终没有获得我的转账,如果一直使用这种方式买咖啡,就意味着这笔钱可以反复再花,也就是双花攻击
- 51%攻击无法来篡改历史数据
- 区块链里面的数据是需要经过其他节点的公正才能进入到主链的,如果篡改,难度很大
- 尤其是确认的区块数很多的时候,比如说我的交易事务是在第5号区块打包的,现在已经是第50号区块了
- 这个时候我就要往前窜改45个区块,而且要得到其它节点的验证通过才行,这样篡改的难度是非常大的
- 51%攻击无法去篡改用户的签名事务
- 因为并不知道用户的密钥,所以无法去篡改用户的签名事务,但可以破坏该事务,也就是干扰用户的转账打包
- 在打包过程当中,只要是打包权可以被某个节点连续获得,就会存在51%攻击
思考
- 51%攻击可以有哪些解决方案呢?
- 从技术, 经济模型的角度,以比特币为例,现在比特币的挖矿打包是比较中心化
- 为什么那些中心化的矿工没有去攻击比特币网络?
性能问题
- 通过区块链的原理事务数据的网络确认是需要一个可靠的时间
- 事务需要被节点验证,区块打包以后广播到其他的节点,也需要进行验证,这个需要可靠的时间
- 在p2p网络中是没有服务器的,彼此之间并没有信任关系,需要一个完全的严格的检验才行,并且达到一个一致性
- 为了达到这样一个最终一致性,它是需要等待一个周期的,这就导致区块链网络的性能比纯服务器化型的(中心化的)系统的效率是要低
- 如果极大的提高区块的生产速度,比如:一秒钟一个区块或者更小时间生成一个区块就会导致区块链网络的打包节点相对中心化,从而影响区块链本身的可靠性
- 我们需要去取得一个平衡点,能够达到可以接受的性能的同时也能够平衡这个中心化以及网络公证
- 其实区块的生产速度过快,还容易导致高孤块率,比如我在收到6号区块之前,7号区块先来了,就会导致7号区块是一个孤块
- 近些年,新的一些项目实现了一些新的共识机制来解决孤块问题和性能问题
- 当然还可以结合第三方的服务,比如专门的全节点服务器,专门的路由节点,兑换节点,为社区提供性能的补充,功能的增强
- 从技术角度来讲,随着5G网络,量子通信等的发展,它有可能从本质上提升性能的问题
- 比如整体基础网络性能的提升,量子通信这种可以远程实现量子纠缠等可以使性能达到一个质的提升,并且不用付出信任的代价
思考
- 区块链的性能可以有什么样的本质提升?
区块容量爆炸
- 区块链网络中需要维持相当的全节点,所谓的全节点就是它会维护完整的账本数据
- 从第1个创世区块开始到后来的不断增长的每一个区块它都会维护着
- 这样一来就使得这些账本数据不断的膨胀,无休无止的增长,进而导致区块的爆炸,导致区块整个存储容量的爆炸
- 这时,我们需要对区块数据进行分布式的保存,分割保存,或者说某种裁剪
- 而不同于我们的传统的中心服务器的做法,可以很直接的去对数据进行一个分表分库,分布式这类处理方式
- 对于区块链来说,它所收到的每一笔交易事务,都要在全节点上进行验证,才能保证安全,如果我们直接把数据分布式保存或分割的话
- 就可能导致在验证的时候找不到之前需要验证的前提数据,从而影响整个网络的一个可靠性
- 数据库领域里在物理层面上进行一些分割,而在逻辑层面上依然保持完整的数据已经存在了一些成熟的方案
- 这一点就目前的区块链系统来讲,暂时还没有很好的解决方案
思考
- 区块数据的存储有哪些优化方案?
网络层攻击
- 区块链本质上其实也就是一种网络软件,对于网络软件来讲它就是建立在互联网基础的tcp/ip网络协议之上的
- 既然如此,所有可以针对互联网的网络层协议来攻击的方式也都能够攻击区块链系统
- 比如进行一个网络劫持,网络分区,我在网络中通过一定的手段,或者付出一些成本来分割这个区块链节点的网络,干扰节点之间数据同步
- 由于网络被分区被分割,使得区块链这个区块在不断往下增长的时候,有可能会发生分叉,乃至长时间的分叉,严重干扰区块链系统的运行
- 这个问题对于区块链系统来讲是一直存在的
- 对于这种p2p网络来讲,它对这个问题也是有一些权衡,如果要容错网络分区,就只能去付出一些一致性的代价
- 也就是说每个节点之间的数据可能并不是强一致性的,只能是某种最终一致性,最终慢慢的达成一致。
- 如果说发生严重分叉的话,对于区块链网络来讲多少还是会是一个比较严重的问题
思考
- 网络分区会导致区块链网络发生什么?
私钥丢失
- 在区块链上,不管是转账也好,对智能合约的操作也好,都是需要私钥来进行一个签名才能广播到链上
- 一旦私钥丢失首先必然会导致无法签发交易,同时由于无法交易,也就导致所属的数据资产丢失
- 在保护好自己的私钥的同时,也可以考虑一下多重签名的安全方案,使得数据资产并不仅仅是靠一把私钥来进行管理,而是多个私钥共同管理
- 比如:某一笔数字资产由三个密钥签名,同时只要有两个密钥存在就能够签发
- 如果有一个人丢失私钥,只要还有两个人没丢,还能继续操作资产
思考
- 如何保护私钥存储的安全性?
脚本安全性
- 对于区块链网络来讲不管实行什么功能,转账也好,或者说是智能合约的某些业务也行
- 这些功能都是通过一些指令脚本来实现,比如:数据的调用,转移,确权等等操作
- 就安全角度来讲,外部触发机制是比较安全的,就转账来讲,必须使用私钥来进行签名,然后广播到链上才有效
- 对于链上的脚本本身而言不能自动的转账
- 对于图灵完备的智能合约系统或虚拟机系统,只要它是可以支持内部触发机制,也就是可以实现一个合约,通过合约来进行自动的转账,只要是内部触发机制的一般是不安全
- 脚本指令所构成的业务逻辑通过外部可验证,比如,我写了一个智能合约系统,但是这种智能合约系统,不提供源码,外部的程序或人,能不能去验证它的行为
- 如果不能很好的验证行为,那这个也是不安全,因为我们并不知道这个合约在部署的时候到底会包含哪些功能
- 对于区块链的脚本指令,应该是一个验证系统,而非执行系统,比如,人在吃东西的时,实物一般可以正常消化
- 如果不小心吃了一瓶毒药,我们的肠胃是一个执行系统,不是一个验证系统,也就是说对于肠胃来讲,它并不会来检验一下这个是食物还是毒药
- 它会直接执行相同的消化这个动作,所以这样的系统是不安全的,只有验证系统才是最安全的
- 当我们发现某个系统通过智能合约去执行一个脚本逻辑的时候,这种执行系统往往是不安全的
- 因为执行系统所执行的那些脚本到底是什么行为?通过虚拟机本身是不能很好的去验证的,它需要程序员本人去保证安全性
- 但是也不能保证程序员写出的程序是永远可靠的
思考
- 内部触发与外部触发的区别是什么?
来源:CSDN
作者:Johnny丶me
链接:https://blog.csdn.net/Tyro_java/article/details/104918717