大致了解区块链
从某公众号偶然看到关于区块链的文章,很早就听说过区块链的大名,现在就把自己理解到的东西记录一下。
区块链的本质是一种特殊的分布式数据库。
区块链的最大特点是彻底无中心的,区块链没有管理员。
区块链由一个个区块组成。每次写入数据就是创建一个区块。每个区块包含两部分
区块头(Head):记录当前区块的元信息 区块体(Body):实际数据
- 区块头包含了当前区块的多项元信息
生成时间 实际数据(即区块体)的Hash 上一个区块的Hash ...
如何理解Hash?Hash就是计算机针对任意内容计算出的一个长度相同的特征值。区块链的Hash长度是256位。计算出来的Hash值可以保证只要原始内容不同,Hash值一定不同
- 推论1:每个区块的Hash都是不一样的,可以通过Hash标识区块。 - 推论2:如果区块的内容变了,它的Hash一定会改变。
Hash的不可修改,前面说过区块头包含很多内容,其中有当前区块体的hash和上一个区块的hash。这意味着,如果当前区块的内容变了,或者上一个区块的 Hash 变了,一定会引起当前区块的 Hash 改变。所以假设有人修改了一个区块,那么他就必须修改后面所有的区块,否则这个被修改的区块就脱离区块链了。再加上hash的计算很耗时,所以要同时修改多个区块几乎不可能发生。正是因为这种机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改
采矿
由于必须保证节点之间的同步,所以新区快添加的速度不能太快。所以区块链设计者故意让添加区块链变得很困难,他的设计是平均每10分钟全网才能生成一个新区块。
这种产出速度是因为故意设置了海量的计算,才得到当前区块的有效hash。从而把新区快添加到区块链。
这个过程就叫做采矿。计算hash的机器就叫做矿机,操作矿机的人就叫做矿工难度系数
只有满足条件的hash才会被区块链接受,而且这个条件非常苛刻,使得绝大部分Hash都不满足要求。
区块头包含一个难度系数(difficulty),这个值决定了计算Hash的难度。区块链协议规定,使用一个常量除以难度系数,可以得到目标值(target)。所以,难度系数越大,目标值越小。
target = targetmax / difficulty
而hash的有效性跟目标值密切相关,只有小于目标值的hash才算有效的,并且由于目标值非常小,hash小于该值的机会就极其渺茫。这就是采矿如此之慢的原因
区块头里面还有一个Nonce值,代表了计算hash重算的次数。
eg:第十万个区块的难度系数是14484.16236122
,它的Nonce值为274148111
。也就是说明了在1W4左右的难度系数下,计算机计算了2.74次才得到一个有效的Hash,改区块才能加入区块链。难度系数的动态调节
由于采矿很难,所以无法保证正好十分钟产出一个区块,因为有时一分钟就算出来了,有时几小时可能也没结果。
为了将产出速度恒定,区块链设计者(中本聪)设计了难度系数的动态调节机制–难度系数每两周(2016和区块)调整一次。如果这两周内,区块的平生产出速度是9分钟,那么难度系数就要提高10%;如果平均生成速度是11分钟,就意味着难度系数要降低10%。 难度系数越来越高(目标值越来越小),导致采矿越来越难
总体来看,随着硬件设备的提升,以及矿机的数量增长,计算速度一定会越来越快。区块链的分叉
如果两个人同时向区块链写入数据(同时有两个区块加入),因为他们同时都连着前一个区块,就形成了分叉。这时应该采纳哪一个区块呢?
现在的规则是,新节点总是采用最长的那条区块链。如果区块链有分叉,将看哪个分支在分叉点后面,先打到6个新区块(称为”六次确认”)。按照10分钟一个区块算,一个小时就可以确认。
由于新区快的生成速度有计算能力决定,所以这条规则就是说:拥有大多数就算能力的那条分支,就是正宗的比特链总结
区块链是无人管理的分布式数据库。2009年至今已经运作了8年多。没出现大的问题证明了它的可行性。
为了保证数据的可靠性,区块链的代价一就是效率,数据写入区块链,最少要等待十分钟,所有节点都同步数据,则需要更多的时间;二是能耗,区块的生成需要矿工进行无数无意义的计算,这是非常耗费能源的。
导致区块链的适用场景非常有限。
1. 不存在所有成员都信任的管理当局 2. 写入的数据不要求实时使用 3. 挖矿的收益能够弥补本身的成本
如果无法满足上述的条件,那么传统数据库是更好的方案。
目前区块链的最大应用场景(也可能是唯一应用场景),就是一比特币为代表的加密货币。
以上内容均总结于阮一峰大神的博客。