深度学习
我们知道,所谓区块链,就是一个个的区块数据,通过区块的哈希值(相当于区块的身份证号)串联起来,如此而形成一个链条般的账本数据。
在这里先问大家一个问题,假设在区块增长到2号的时候,此时软件升级了,增加了之前版本中不能识别的一些数据结构,会发生什么?在传统的中心化软件体系中,似乎并没有什么问题,无论是微信、支付宝、美团等,隔三差五就升个级,能有什么问题呢。
这是因为这些中心化的系统,数据存储都是集中的,版本管理也是集中的,如果是重大的升级,完全可以设置为若不更新 到最新版就不能进行登录操作,从而确保用户使用的总是正确的版本。然而区块链先天是去中心的使用方式,一旦有新的软件版本发布后,是不是每个人都会去升级 到新版本是很难控制的,这就可能导致如下图所示的问题。在2号区块生成的时候发布了新的版本,且新的版本增加了之前版本不能识别的数据结构,此时部分用户 升级了新版,部分用户还没有升级,这些新旧版本的软件仍然在各自不停的挖矿、验证、打包区块,一段时间过后就会变成这样:
这个就叫分叉,现在读者应该很容易理解了吧,实际上根据不同情况,分叉的情况可以继续细分为如下两类。
1.新版本节点认为老版本节点发出的区块/交易合法
此时对于新版本来说,仍然是可以保留之前的区块链数据的,因为完全兼容,但是老版本的节点是否能依然接受新版本节点发出的区块就不一定了。
问:新版本能兼容老版本的区块,这个我能理解,但是老版本不一定是什么意思?难道说老版本还能继续识别新版本?新版本升级之后既然增加了新的数据结构,老版本肯定不能识别呀?
答:这个确实是需要分情况的,比如老版本中有一个备用的数据字段,这个数据字段一直都是闲置的,在老版本中也没起什么作用,而新版本使用了这个备用的字段,此时由于老版本本来也没使用这个备用字段,因此对于新版本发出的区块是依然能接受的,相当于欺骗了老版本节点。
这种情况下,区块链的生成如下图所示:
可以看到,此时在区块链中,无论是老节点维护的区块链数据还是新节点维护的区块链数据,都有可能既包含老版本的区块也 包含新版本的区块。不过实际上,在区块链应用程序进行重大升级时,都会事先取得社区的投票同意,保证大部分的运行节点都愿意升级到新版本,这种情况下,由 于新版本节点的算力要大于老版本的节点,所以一旦完成升级后,后续的打包区块基本都是新版本节点发出来的,也就不太会发生老版本区块和新版本区块交错链接 的情况。
2.新版本节点认为老版本节点发出的区块/交易不合法
这种情况下,新版本节点基本上就是另外一套区块链程序了,如下图所示:
、
老节点如果还能接受新节点发出的区块,那么在老节点维护的区块链数据中,还有可能会插入新版本的区块,但是对于新节点 来说,不再会有老版本的区块了。不但不接受新产生的老版本区块,对于之前的老版本区块也不再认可,因此这种情况下等于新版本的节点单独另外开辟了一条区块 链。
上述解释了区块链程序由于版本升级的原因导致的几种可能的分叉情况,实际上站在老节点的角度,无非就是新版本节点产生的区块自己还能不能认识,通过能不能认识,导致两种类型的分叉:软分叉和硬分叉。
(1)软分叉
老节点不能发现新协议的变化,从而继续接受新节点用新协议所挖出的区块,这种情况称为软分叉,此时老节点矿工将可能在它们不能完全理解和验证的新区块上继续添加区块。
(2)硬分叉
当系统中出现了新版本的软件,并且和之前版本软件不能兼容,老节点无法接受新节点挖出的全部或部分区块,导致同时出现两条链,这种情况称为硬分叉。
无论是软分叉还是硬分叉,对于区块链应用来说都是一件重大的事情,如果新版本在没有取得社区(主要是占据主要算力 的矿池用户)一致认可的情况下就强制推行升级,很有可能就会导致严重的分叉问题,分叉后会发生些什么是很难预料的,目前比特币就出现了数个不同的版本,包 括BitcoinCore,还有新推出的BitcoinClassic、BitcoinXT以及BitcoinUnlimited(无事务块大小和费用限 制)。而以太坊在经历了著名的TheDAO合约漏洞攻击事件后直接就进行了硬分叉,分为了以太坊经典(ETC)和以太坊(ETH),这其中又纠结了各种价 值观问题、利益问题等。
那么,除了上述的版本升级会导致分叉问题,还有别的什么场景吗?假设版本都是统一的,还会有分叉产生吗?当然有, 大家要知道,区块链应用程序是没有一个固定的服务器来作为数据的一致性保证的,它靠的是网络共识算法,在异步网络环境下(我们的互联网就是属于异步网络环 境),任何一个节点都是独立工作的,它可能会被关机,可能处于网络不良好的环境,而在接受其他节点发过来的区块数据时,也有可能会收到多个临时版本,需要 裁决到底使用哪一个,等等。所有节点都只能进行“最终一致性”,最终一致性就是现在还不一致,但是过段时间大家就会依靠规则互相同步达成一致!
在这些情况下导致的分叉属于临时性分叉。这里解释一种情况,在一个节点接收其他节点发送过来的区块数据时,假设当 前区块号是10号,下一个是11号区块。以比特币为例,要等待矿工发送11号区块出来,而此时,可能会有多个矿工都挖矿成功,也就是说会发送多个11号区 块过来,这个时候节点对于接收到的多个区块会都存储下来,等待以后的筛选,最终会淘汰掉其他只剩下其中一个纳入主链接收(网络会以最终最长的那条链为准, 这也是为什么在比特币中,会建议交易至少等待6个区块确认后才算是确定了),在没有决定哪个区块会进入到最长的那条链时,就会临时性产生分叉,如下图所 示:
事实上,这种情况的分叉仅仅是一种竞争过程的中间产物。
接下来让我们来设想另外一种情况。假如某个人,比如Bob,他组了一个大型的局域网,这个局域网很大,横跨了大江 南北,同时这个局域网不与外网相通。现在在这个局域网中安装了大量的比特币节点程序,这些节点程序可以正常挖矿、验证、交易等,但数据就是不能与外网相 通。这种情况下,如果过了很长时间,某一天突然让这个局域网能够与外网相通了,能够发现到外网的其他比特币节点了,会发生什么?当这个局域网封闭足够长的 时间后再与外网相通,网内和网外的节点还能正常同步吗?实际上这种情况会对比特币的主链网络产生比较大的影响。假如把这个封锁与外网连接的局域网作为一种 攻击手段,实际上就是一种针对比特币的“分割攻击”。将一批比特币节点与主网络分割出来的攻击行为称为分割攻击,如果只是延迟一下新区块的广播,则称为 “延迟攻击”,这些情况导致的问题并不是分叉那么简单了,而是会引起其他问题,比如重复支付或者浪费大量矿工的资源。
当然,这些问题并不只是比特币会有,只要是区块链应用,都会面临这些问题。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=65
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区