码迷,mamicode.com
首页 > 其他好文 > 详细

区块链与比特币

时间:2018-01-23 23:20:50      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:logs   签名   分布   方案   同步   注意   协议   入门   一个   

一开始只是想了解SSH的安全机制,结果把区块链技术和比特币这两个新技术了解一边。既然学习了,就谈谈自己的理解。在文末我推荐几篇浅显易懂的博文,有兴趣可以继续阅读。

我对比特币的理解分为两个方面,既是一种交易体系,也是货币单位。而区块链是是一种分布式数据库,具有高度安全性。我先从区块链谈起,再介绍比特币。

区块链

区块链技术是一种分布式数据库。我们生活中经常与分布式数据打交道,例如云端存储,服务器架构等等。对于这种应用,安全性的考量都是出自于硬件安全,例如一台服务器崩了,数据要保正安全。所以数据一般是多个服务器冗余存储,但不会要求全网每台服务器都要求存储一份。这种方式可以规避硬件风险,但对于人为攻击就会产生漏洞。如果我想要破坏数据,可以采用两种方案。一种是针对数据存放的位置,也就是攻击少数几台服务器,把这些数据全部毁坏,或者修改部分数据,让数据发生混乱。另一种是针对数据传播的途径。我可以在你想要获取数据时截获你的包,或者发动中间人攻击,冒充服务器发送虚假的数据。

区块链技术可以解决第一种攻击模式。区块链的数据单位是block,每个block采用链表的结构彼此相连,同时保证全网的数据一致。也就是每一台加入区块链网络的服务器都保留有一份完整的全网信息。block分为head和body。body通过哈西运算获得hash编码,head会加入body的hash以及上一块block的head的hash,当然还有时间等一些重要信息,然后生成自己的hash以供下一块block调用。这样的结构保证了区块链中的数据都是完整的,相互联系。

说完了数据结构,我们谈谈区块链数据的产生方式。区块链的数据是竞争产生的!注意,区块链和互联网不同,对数据的发布有严格的要求,必须通过大量的计算得到符合要求的hash后才能向全网发布。假设我想向整个网络写入一个信息,例如“明天是我的生日,大家要送礼物给我哟!”。那么我先获取上一个block的hash,再计算内容body的hash,再计算head的hash。看这个结果是不是满足网络中的发布要求,如果不满足那么重新计算。可是如果我的计算机没别人的快,也就是我还在计算时有人已经发布了一个新的block!不好意思,已经做的计算白费了,你得用新的block的hash重新计算。同时还要说明这个网络对hash计算难度是动态调整的。当初设计是控制在每十分钟产生一个新的block。也就是如果最近一段时间,加入网络的服务器性能强进,导致8分钟或者9分钟就能有一个block产生,那么网络会加大难度,让这个时间回归到10分钟。所以hash算法难度和全网的计算资源相关,你不太可能超越全网的计算能力,在短期内计算出结果。

区块链技术之所以要设定必须做出大量计算之后才能发布block,主要是为了给处理分布数据的同步留出时间。假设在区块链中很简单就能计算出满足要求的hash,那么信息的传递就像幼儿园一样嘈杂,每个人都在发布自己的信息。A的话还没等到B,C......接收到,H已经发布了新的信息,听谁的?先做一些计算再去发言,且严格控制计算难度,一定程度避免了信息同时发布,也为全网信息同步留出了处理时间。

但是如果有两台服务器同时发布了结果,要知道一个数据包全网传递时需要时间的,等到所有服务器都拿到数据,应该也是有两份满足要求的block。那么这个时候就产生了分叉,解决方案是让这两个分叉自由增长,看谁先达到6块,就确定保留谁的。那么这时候计算新block就像是赌博,有的从A分叉的hash计算下一个block,有的从B分叉的hash计算下一个block。等到A方达到6个block,保留A,删除B。押B的服务器所做的计算全部作废。

现在假设有一台服务器出了问题,没关系,数据大家都有,等这台服务器修好了加入进来copy其他人的就行了。再假设其中随机一块block坏了,或者数据“莫名其妙”变了。没关系,解算第一个block的hash一直到最新的block,看hash能不能前后相依,如果不能,那么数据被修改了,再从其他人那里copy一份就好了。再假设机缘凑巧,数据“莫名其妙”变了,但是hash还能连在一起。那么全网公投,少数服从多数!

以上就是区块链的技术介绍。现在我们来攻击这个网络。我们不需要偷取数据,因为区块链中的数据是全网透明的。但是我们想修改其中一份数据,那么我们得过两个关口。第一,我们要计算从修改的block到最新block的全部hash,使得自己的数据满足规则。我们也知道,hash的计算难度是全网最好的计算平台用10分钟计算出来的!假设你有钱,把神威-太湖之光买下来了。那么可以修改全部数据,还要第二个关口——全网公投。你得想办法把整个网络中51%的服务器都黑了,才能赢得这场投票!如果这个网络足够大,那么能做到这一点的无论是计算能力还是网络技术,应该没有人能把它怎么样了!

至此我想你明白这个网络中的数据为什么是安全的了吧。但是用神威-太湖之光计算出来的hash只是为了告诉大家给我送礼物,恐怕太奢侈了!这种网络现在最大的用途是构建去中心的交易平台,此时的block里存储的是平台中所有的交易信息,而比特币是网络规模最大的一种实例。

比特币

区块链是比特币的基础架构,它保证了已经生成的数据是安全的。如果有人想修改某笔交易的信息必然要花费巨大的代价。可是在数据传递的过程中?也就是第一种攻击模式失败,尝试第二种攻击模式,我截获正在传递的交易信息或者向平台发布虚假的交易信息!要处理这种问题就要应用信息加密技术!

双钥加密,就是同时生成两个对立的数字密钥(两串数字)——公钥和私钥。如果用公钥加密的内容必须用私钥才能解密,用私钥加密的内容必须用公钥才能解密。公钥是公开的,私钥只有个人知道。现在假设A生成了这对密钥——公钥x和私钥y,并把x交给了B,C,D三个人。现在B用x加密信息发给A,只有用y才能解密信息,所以其他人即使截获信件也不知道信件内容。可是A不能也用x加密回信,那么B也不能解读。所以A只能用y加密,可是C,D就能知道回信内容。这没办法,所以A干脆不加密了。但是A留了一手,他把信件内容生成了一个hash,而且用y加密了(这个加密的hash就是数字签名),和信件一起送给B。这样C和D即使知道了信件也不能修改信件,因为内容一旦修改,B用x解算出来的hash和信件内容就对不上了。即使C和D想连同hash一起修改也不可能,因为没有私钥y,无法加密hash。这种加密机制能保证B向A是加密不可见,A向B是可见但不可修改的。通过对信息内容的特殊处理就能保证整个通讯过程是不可见的(例如B提问,A只回答是还是不是)。

双钥加密技术从上世纪提出后在各种场合广泛应用,网络通讯的https协议,linux上的SSH都是采用这种这种技术传递信息。为了防范公钥伪造的问题,还建立了专门机构提供数字证书(就是用该机构的私钥加密其他人的公钥和相关信息,例如网址)。

比特币交易平台也是采用双钥加密技术确保每笔交易信息都是真实有效的。首先加入比特币交易平台,都会生成一对私钥公钥,公钥太长了不便与传播,又用哈西计算得到对应的hash,称为公钥指纹或者钱包地址。你的公钥或者公钥指纹大家都能获取。

现在假设A和B发生了一笔交易,用比特币解算,A要支付B一个比特币。如果这个交易要生效必须让全网都知道。那么A和B必须把这个信息写进下一个block里面才行。可是凭我们的笔记本根本跑不过神威-太湖之光,所以A和B把自己的交易信息发布到网络上,承诺如果谁能把他们的信息写进下一个block里,就支付一笔手续费。刚好C是个土豪,有十台超算,没事就帮人算hash。C接到消息,先是让A用私钥加密信息的hash发送过来(数字签名),自己用A的公钥解密,确认这个消息是A发过来的。再在全网数据中检查以往的交易记录,确认A有这么多的比特币可以支付。现在支付人和支付能力都确认了,所以C把A和B的交易信息以及数子签名还有其他几千笔同样的信息都写进block并第一个发布到网络上了。之后C得到了几千笔手续费,还根据规则凡是发布block的人都可以获得10个比特币。其中C我们称之为”矿工“,这种帮其他人算hash的行为成为”挖矿“。

现在我们想在信息传递中造假,例如向矿工传递虚假交易。但是我们没有支付方的私钥,这条信息根本不成立,矿工直接就能辨识。而且我们也没傻到用自己的私钥,那等于送钱给别人。所以一个普通人是不能在比特币交易平台中作弊的。那么假设我们是矿工,且算出了下一个block,那么我们能不能加入虚假的信息呢?注意矿工算出了hash,不代表这个block就能被别人认证。因为block含有支付方的数字签名,矿工也没有私钥,不能伪造。而且如果随意编造,其它的服务器也很容易辨识这个block是一个虚假交易,不采用这个block。这意味着造假的矿工损失了一次赚钱的机会!

所以这个网络中如果没有掌握绝对优越的计算资源是不可能造假的!


区块链入门教程
比特币入门教程
数字签名是什么
加密货币的本质

区块链与比特币

标签:logs   签名   分布   方案   同步   注意   协议   入门   一个   

原文地址:https://www.cnblogs.com/sgdd123/p/8338049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!