区块链兄弟社区问答精选:关于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 )

})

这是我们从源代码中提取处理的私钥生成算法,供你参考一下。

更多区块链技术问题,请上区块链兄弟社区,寻求解答!

(未完待续)

热文推荐

区块链兄弟——技术专业问答先行者,区块链爱好者聚集地

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171228G0ORLH00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区