各位朋友大家晚上好我们又见媔了。今天和大家分享的主题是《如何做区块链链是如何做到交易数据防篡改的》这个话题属于数据安全领域的问题,如果完全展开来說涉及到的面非常广;那我们依然按照之前的原则,一次只讲一个核心点掰开了揉烂了说;在讲解的过程中呢,我会结合一小部分代碼但我会尽量讲的浅显直白一些,让大家不仅感到到如何做区块链链防篡改的特性也展示一下它到底是如何实现的,是不是真的如他┅直宣称的那样实现了数据的防篡改下面就让我们开始;
在这之前,让我们先回忆下在传统互联网或移动互联网行业大家是怎么存数據的?
通常的做法是使用关系型数据库,例如mysql、oracle建一条数据记录,将我们的各种属性值存在里面现在我们挑一个大家最敏感的字段,账户余额来聊;
现在给大家举两个可怕的例子第一个是:如果有人在后台程序里,留了后门可以直接注入一段脚本代码,操作数据庫修改账户余额,然后进行非法提现或者商品买卖;第二个公司里有的同学有数据库权限,可以直接登进数据然后直接update操作,把账戶余额改掉;这两个例子是不是非常刺激?
如果是使用如何做区块链链系统,来存储数据资源就不会出现这种情况。即使出现了这種情况也会被如何做区块链链系统自动检测到,然后把这笔被篡改的记录从链上踢掉然后从其他的存储节点,把健康的交易数据同步過来;
下面我们看下如何做区块链链是如何做到的?我们还是以比特币系统为例来说
在这之前,先给大家介绍下比特币系统的账户模型;在比特币里它是没有用户资产记录这样的概念,不会像在mysql里那样用一条数据存储记录表达;它的资产,是通过把所有的交易记录串联聚合之后得到的;而且,如何做区块链链系统明确表达了账户里的资产来源,你可以一直向上追溯一直追到创世块,也就是挖礦时的所得;
例如你收到了小张50元的转账;小张转给你的50元里,有20元是来自小李的30元是来自小王的,小李的20元有3元是来自小刘的17元昰来自小孟的……,这个资金的流动传递会在链上完整的表达出来;下面看下如何做区块链链系统是如何做的:
所谓资金流转就是一次交噫因此比特币系统,设计了一个非常核心的数据结构大家看下下面这张截图:
MsgTx就是表达一次交易,这个交易结构体里有个切片字段TxIn,完整的定义是紧挨着MsgTx的下一个结构体这个结构体里,有个PreviousOutPoint它表示的意思,就是这笔输入的来源地址;这样一笔交易信息会先封到┅个block结构体里,然后经过验证存到数据库里;前一个交易记录里同样也会有一个PreviousOutPoint继续向前指;这样是不是就比较清楚每笔资金的具体从哪里来的了,如果你比较感兴趣可以在数据库里一直向上追溯,直到创世块;
下面来看下防篡改;就以上面小张账户的50元说起;在这里偠把P2P网络提一下这是如何做区块链链的运转起来的基础;如何做区块链链系统是一个完全松散自治的P2P网络,这个网络每时每刻都会有節点加入,有节点离开;而且没有中心节点来管理每一个节点都靠算法来维护自身的数据块信息;
现在来看小张的账户;如果小张想把洎己的50元账户,改成50万;他要做的第一件事情是控制全网51%以上的节点这个从概率上来推算基本是不可能的,可以认为失败是必然的(概率上的极大似然估计法);假设一个人的运气非常好他真的控制了全网51%的节点;下面有另外一个更严峻的挑战:拿到用户的私钥;上面峩们说了,小张要把这50改成50万需要把小张之前的小李的,小王的小刘的,小孟的…总之和这50元相关的所有的人的私钥都窃取到然后紦数据篡改掉,才能骗过如何做区块链链系统;
这里面有两个问题:1 为什么需要改这么多人的数据这是由于,前面说了如何做区块链鏈系统会记录每笔自己的详细来源,在交易验证的时候发现数据不对,会不断向前回溯验证的; 2 为什么要私钥这个我们需要配合交易嘚数据结构来说,还是看下面这张图的最后一个数据结构TxOut
该数据结构表示用户的交易输出,例如小张50元的来源是小李的20小王的30,那这20囷30分别对应的是小李的交易输出;大家注意了这个TxOut里有个PkScript字段,专业的说法是锁定脚本;意思是如果想花掉这笔钱,或者动这笔钱需要有相应的解锁脚本和锁定脚本做匹配;否则就会失败,就会被系统发现;这个锁定脚本通常是用户的公钥,解锁脚本是用户的私钥;简单理解就是非对称加密验证的意思;所以说,如果用户想篡改资金额度不仅要控制全网51%以上的节点,还要窃取很多相关人的密钥其难度可想而知;
说到这里,我认为基本上是说清楚了如何做区块链链是如何做到数据防篡改的了;虽然我尽量想着白话一点,这个過程中还是不可避免的掺进了一些专业术语;如果没有说明白的地方,欢迎大家给我留言我们可以做进一步的沟通交流;谢谢大家,晚安;