区块链兄弟社区问答精选:关于51%攻击,你了解有多少?
材料整合:小链
本文转载自区块链兄弟,区块链兄弟——技术专业问答先行者,区块链爱好者聚集地
本文约2400字,阅读(观看)需要16分钟
问题1:有没有谁能帮忙讲讲区块链的51%攻击问题!
区块链兄弟社区专家、区块链研究员于中阳回答:
首先,我们需要知晓区块链技术采用的是分布式总账技术。
在此,每个节点的权利是一样的,任意节点被摧毁都不会影响整个系统的安全,也不会造成数据丢失。其在整个系统中的权重都是一致的。系统每次都在链入这个系统的节点中选择记账者,于是,即使某个或者部分节点被摧毁、死机等,并不会影响整个系统的运作。
但是,正是因为每个节点的账本数据都是一模一样的,也就意味着单个节的数据篡改是没有任何意义的。因为如果系统发现俩个账本对不上,其就认为拥有相同账本数量相对较多的节点的版本才是真实的数据版本。那些少部分不一致的节点账本不是真实的,而是被篡改的账本。系统会自动舍弃这部分认为被篡改过的账本,也就意味着如果你要篡改区块链上的数据内容,除非能够控制整个系统中的大部分节点。
这,就是通常所说的51%攻击,才能发动对账本数据的更改(攻击)。
随着整个系统中的节点数量不断增多,篡改数据的可能性就会大大降低。这是因为,这些节点很可能分布在世界上每一个角落,理论上说,除非你能控制世界上大多数电脑,否则你没有机会去篡改区块链上的数据。
另外一种51%攻击发起就是拥有全网51%的算力,即需要构建出和原来一样的系统一样多的节点(算力)的方式来攻击这个区块链系统(要构建出足够大的算力,不仅仅是节点的数量的体现,但出于简化理解算力,在此姑且考虑念以节点数量做比喻)。
举例,原系统有100个节点,如果要发动51%攻击,那么攻击者就需要另外部署101个节点(以上亦可),然后加入到这个区块链系统中。由于攻击者已经获得了超过50%的控制权,当然能够发动攻击。
当然,这种攻击所付出的成本取决于系统原来的大小。原来系统节点越多,攻击者付出的成本也越大。由于比特币是目前最庞大的区块链网络,据统计要构建出一个和现有比特币同样大型的网络系统,所付出的成本也算是极大了。
其实,我们不谈获取全网51%的困难性,攻击者更深层次面对的是另外一个问题。那就是,一旦其成功发动了攻击,就会造成该系统的价值归零。即,攻击者一旦成功篡改了账本,由于全网能够立刻识别出账本数据不一致,导致所有人都意识到该系统账本已经是不可靠的账本,那么意味着该账本所记录的数据变得没有价值,该系统中代币也会变得毫无价值。再清楚点就是,攻击者将无利可图(有谁愿意这样做呢)。
而对于国家,似乎也完全必要通过这种方式来攻击比特币这样的网络,因为宣布比特币违法勒令禁止,就能更简单的达到这一目的。
问题2:求助:运行example/e2e.cli下的network_setup.sh出现问题!
区块链兄弟社区专家、区块链高级架构师冯翔回答:
看看你的命令中的chaincode的名字是否正确。 以下面的命令为例
peer chaincode query -C qklszzlchannel -n r_test_cc6 -c '{"Args":["query","a"]}'
-n 后面是chaincode名字,先查看这个名字是否正确。
问题3:关于Paxo算法,为什么会出现死锁或者效益效率不高的情况?
区块链兄弟社区用户、区块链技术开发李凤涛回答:
paxos协议效率不高,并且会出现死锁的原因如下:
效率不高的原因,在于多个提议者一起提议,先提出的协议会一直被拒绝,又会重新提议。
死锁的情况,举一个例子,提议者A提出协议1,接受者A,B,C同意了,进入执行阶段,这时候提议者B提出协议2,接收者C,D,E同意了,进入执行阶段,协议1的执行失败了,因为C不会同意,协议者A只有提出协议3,接收者A,B,C同意了,协议2的执行阶段失败了,因为C不会同意,然后一直循环。
问题4:Hyperledger Fabric 在Ca中注册的user私钥,应该如何保存?
目前在开发一个基于fabric的项目,学习了下IBM-Marbles以及Fabric samples,这两个项目都是把用户注册的私钥、证书保存在本地,如果在生产环境中,是不是应该把签名私钥存至用户本地?如果是的话,如何在服务器后端的SDK中获取呢?另外 SDK中的get/setUserContext 有大神可以给讲解下吗,感谢!
区块链兄弟社区专家、区块链高级架构师冯翔回答:
私钥其实是客户端在本地生成,并不是有CA服务器提供的,这也符合区块链的设计思路。
cryptoSuit.getKey('8a4ed8278fd021fddcad61d3691f086da70dc19c40d243a7da4029c88cdd9ae9').then(key=>{
console.info( key._key.prvKeyHex )
// console.info(key.getSKI())
varpkey=key.getPublicKey()
console.info(pkey._key.pubKeyHex )
}).catch(err =>{
console.info( err )
})
这是我们从源代码中提取处理的私钥生成算法,供你参考一下。
更多区块链技术问题,请上区块链兄弟社区,寻求解答!
(未完待续)
热文推荐
区块链兄弟——技术专业问答先行者,区块链爱好者聚集地
- Docker系列教程15-Docker容器网络
- 数据挖掘
- Docker系列教程14-Docker数据持久化
- Docker 学习系列二之基本管理
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- 使用Feign实现Form表单提交
- Ubuntu 16.04 Install OpenCV
- Spring Cloud各组件调优参数
- 手把手教你设置 IntelliJ IDEA 的彩色代码主题
- 实用技巧:Hystrix传播ThreadLocal对象(两种方案)
- OpenDaylight与Mininet应用实战之流表操作
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- thinkphp5框架实现数据库读取的数据转换成json格式示例
- phpfpm的作用和用法
- 浅谈PHP5.6 与 PHP7.0 区别
- laravel执行php artisan migrate报错的解决方法
- Laravel统计一段时间间隔的数据方法
- laravel withCount 统计关联数量的方法
- 使用laravel和ECharts实现折线图效果的例子
- Laravel 将数据表的数据导出,并生成seeds种子文件的方法
- Laravel Eloquent ORM 多条件查询的例子
- laravel5.5添加echarts实现画图功能的方法
- thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
- Laravel 创建指定表 migrate的例子
- Laravel find in set排序实例
- Laravel 对某一列进行筛选然后求和sum()的例子
- 关于laravel 数据库迁移中integer类型是无法指定长度的问题