区块链学习心得1:三个关于区块链数据安全性的重要常识性知识

☞ ░ 前往老猿Python博文目录

前面介绍了区块链的基础知识,包括什么是区块链、区块链类型、共识算法、Merkle树(默克尔树)和Merkle根、区块链的分叉、出块、最长链原则、主链等概念,在对这些概念理解较为彻底的基础上,老猿总结了几个常识性的问题和知识点,以供对区块链不太熟悉的人们了解区块链的相关特性。

一、为什么说区块链数据是不可篡改的?

区块链中已经在链上被过半数以上节点接受的区块,就称为区块链主链中的区块,后续新增的区块都是在该区块及其后的区块后面链接添加。由于区块链的区块头中的Merkle根不但是通过本区块的相关数据散列而成,而且也是这些数据与上一区块的Merkle根散列而成,同时会写入下一区块头中,因此任何一个区块的数据篡改会更改本区块的Merkle根,从而导致其后所有区块都不能识别该区块。

同时区块链中关于交易和区块数据的广播,仅限于未打包的区块的交易和新出区块的广播,历史已经打包交易和区块是不能再广播相关数据变化,这就导致篡改的数据无法广播出去,同时其Merkle根会发生变化,不能被链中后续区块所接受。因此已经打包上链被过半数节点接受的区块数据是无法窜改的。

二、以太币为什么要挖矿?

我们知道,以太币是靠挖矿来获得记账权,从而得到记账权的节点,可以根据区块链可以打包的最大交易笔数抽取未打包的部分或所有交易(需要看交易数据是否不超出新区块存储的交易数据空间)打包生成新的情况,从而得到区块链系统奖励的打包手续费。

新区块产生以后,需要在网络上进行传播,确保最后大多数节点都能接受该区块,因此在这种分布式环境中,新区块的产生速度不能太快,否则传播时会遇到多个新区块同时传播,而各节点接收顺序错乱,导致各节点记录的新区块不一致,从而出现区块链分叉导致的交易混乱,为此以太币规定了约10分钟左右产生一个新区块,以确保新区块能被网络中的大多数节点所接受。

对于10分钟的区块产生速度控制,以太币是通过共识机制POW来控制新区块的产生速度始终保持在10分钟左右一个区块。比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的工作量证明的迷题。这道题关键的三个要素是工作量证明函数、区块及难度值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了这道题的所需要的计算量。(具体请参考《区块链共识算法-POW》的介绍)。

挖矿的具体过程为:参与者综合上一个区块的Hash值,上一个区块生成之后的新的验证过的交易内容,再加上自己猜测的一个随机数X,一起打包到一个候选新区块,让新区块的hash值小于比特币网络中给定的一个数。为了满足条件,每个参与挖矿的节点通过不停调整随机数的值来进行hash运算,以期望获得的hash值小于比特币网络中给定的数。

系统每隔两周即经过2016个区块会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),调节生成区块的时间稳定在10分钟左右。

关于难度值的更多介绍,请参考《比特币工作量证明难度值及难度调整详解》、《简单解释 bitcoin 中的难度》。

三、为什么说51%算力攻击可以伪造比特币网络中的任何数据?

前面第一点介绍了区块链数据的不可篡改,为什么又说51%算力攻击可以伪造比特币网络中的任何数据?
这二者是否矛盾?

这个看似矛盾的问题其实并不矛盾,在第一个问题中,特别说明了新区块的确认需要网络过半数的节点同意,这样区块就会被整个网络所接受。但如果某方拥有整个系统50%以上的计算节点,则一方面可以控制只接收其认可的新区块,控制新区块的产生,另一个方面可以通过对某个区块K后面的区块的交易进行伪造,并在伪造区块后持续产生新区块导致区块链分叉,由于其拥有50%以上算力,因此能确保其控制的区块链长度超过原有的主链,从而替换掉原有主链K区块之后的所有区块,导致这些区块的交易失效,而这些失效的交易可能已经发生了比特币和现实货币、实物或其他代币的交易,从而导致这些交易的比特币接受方蒙受损失。因此比特币的伪造数据是通过控制算力来实现区块链的软分叉来实现的。

但这种伪造区块的情况并不能伪造所有数据,如不能凭空给自己增加比特币余额。更多51%算力攻击请参考《比特币51%算力攻击?》。

老猿认为,类似的,除了POW共识算法外,其他共识算法也存在类似的攻击可能性,这种攻击都是通过控制达成共识的要素来实现的。

更多关于区块链的内容请见老猿专栏《零基础学区块链》或《零基础学区块链专栏文章目录》。

跟老猿学Python、5G、区块链!

☞ ░ 前往老猿Python博文目录

posted on 2020-07-25 23:09  老猿Python  阅读(344)  评论(0编辑  收藏  举报