高质量的文章,及时交货
来自:阮一峰的博客,作者阮一峰,微博@阮一峰
区块链是目前的热门话题,被新闻媒体广泛报道,声称将创造未来。但是通俗易懂的入门文章很少。很少有人解释什么是区块链,它有什么特别之处。
接下来,我会试着写一个最好理解的区块链教程。毕竟这不是一件困难的事情。核心概念很简单,三言两语就能说清楚。希望看完这篇文章,你不仅能了解区块链,还能了解什么是采矿,为什么采矿越来越难。
需要说明的是,我不是这方面的专家。虽然我已经关注了很长时间,仔细了解区块链仍然是从今年年初。本文中的错误和不准确之处,欢迎指正。
区块链的精髓
首先,区块链的主要功能是储存信息。任何需要保存的信息都可以写入区块链或从中读取,所以它是一个数据库。
其次,任何人都可以建立一个服务器,加入区块链网络,成为一个节点。在区块链的世界里,没有中心节点,每个节点都是平等的,整个数据库都是保留的。您可以向任何节点写入/读取数据,因为所有节点最终都会同步,以确保区块链的一致性。
区块链最大的特色
分布式数据库并不是什么新发明,市场上早就有这类产品了。然而,区块链有一个革命性的特点。
区块链没有管理员,它是彻底无中心的。其他的数据库都有管理员,但是区块链没有。如果有人想对区块链添加审核,也实现不了,因为它的设计目标就是防止出现居于中心地位的管理当局。
正因为无法管理,区块链才无法控制。否则,一旦大公司、大集团控制了经营权,就控制了整个平台,其他用户就不得不服从。
但是,没有管理员,每个人都可以写数据过去。如何才能保证数据的可靠性?万一坏人改了呢?请继续读下去。这就是区块链的美妙之处。
区块链由区块组成。块非常类似于数据库记录。每次写入数据时,都会创建一个数据块。
每个区块包含两个部分。
1.块头:记录当前块的特征值。
2.块主体:实际数据
报头包含当前块的许多特征值。
1:生成时间
2.实际数据的散列(即块主体)
3:前一个块的散列
4:
在这里,你需要了解什么是哈希(hash),这是理解区块链必需的。。
所谓‘哈希’,就是计算机可以对任何内容计算出一个长度相同的特征值。块的哈希长度是256位,也就是说不管原始内容是什么,最后都会计算出一个256位的二进制数。而且可以保证,只要原始内容不一样,对应的hash就一定不一样。
例如,字符串123的散列是
a 8 FDC 205 a 9 f 19 cc 1c 7507 a 604 C4 f 01 b 13d 11d 7 FD 0(十六进制),换算成二进制就是256位,只有123能得到这个hash。(理论上其他字符串有可能得到这个hash,但是概率极低,可以近似认为不可能。)
因此,这里有两个重要的推论:
1:每个块的hash不一样,可以通过hash来识别块。
2.如果块的内容发生变化,它的hash肯定会发生变化。
哈希的不变性
块和哈希是一一对应的,每个块的哈希都是为‘块头’计算的。也就是说,将块头的特征值连接在一起,以便形成一个长串,然后为这个串计算hash。
Hash=SHA256(块头)
以上是块哈希的计算公式,SHA256是区块链的哈希算法。注意,这个公式只包含块头,不包含块体,也就是说,哈希是由块头唯一确定的。
如前所述,块头包含了很多内容,包括当前块体的hash和前一块的hash。这意味着如果当前块体的内容发生变化,或者前一块的hash发生变化,那么当前块的hash一定会发生变化。
这对区块链来说意义重大。如果有人修改了一个块,该块的散列也会改变。为了使后面的块连接到它(因为下一个块包含前一个块的散列),该人必须依次修改所有后面的块,否则改变的块将在区块链之外。由于后面要提到的原因,哈希计算耗时,短时间内修改多个块几乎是不可能的,除非有人掌握了全网51%以上的计算能力。
正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史,发生的就是发生的,从此无法改变。
每个街区都与前一个街区相连,这也是“区块链”这个名字的由来。
我的
因为必须保证节点间的同步,所以添加新块的速度不能太快。假设你刚刚同步了一个块,准备基于它生成下一个块,但此时其他节点有新的块生成,你要放弃一半的计算,重新同步。因为每个块后面只能跟一个块,所以只能在最近的块后面生成下一个块。所以,你别无选择,一听到信号就同步。
因此,区块链的发明者中本聪(此为化名,其真实身份尚不得而知)故意刁难添加新的积木。他的设计是平均每10分钟,全网就能生成一个新块,一个小时只有6个。
这种输出速度不是通过命令来实现的,而是通过刻意设置海量计算来实现的。也就是说,只有通过大量的计算才能得到当前块的有效hash,从而将新块加入到区块链中。因为计算量大,所以不能快速起来。
这个过程叫做挖掘,因为计算一个有效哈希的难度就像在世界上寻找一粒合格的沙子。计算hash的机器叫矿机,操作矿机的人叫矿工。
难度
看完这个,你可能会有一个疑问。人们都说挖掘很难,但挖掘不就是计算机计算出来的哈希吗?这就是电脑的长处。怎么会变得很难计算呢?
原来不是什么hash都可以用。块链接只接受符合条件的哈希。这个条件特别苛刻,以至于大部分哈希都不符合要求,必须重新计算。
原来块头包含一个难度系数,决定了哈希计算的难度。例如,第100,000个方块的难度系数是14。58660.88868888671
区块链协议规定,用一个常数除以难度系数就可以得到目标值。显然,难度系数越大,目标值越小。
哈希的有效性与目标值密切相关。只有小于目标值的哈希才有效,否则哈希无效,必须重新计算。因为目标值很小,hash小于这个值的几率极小,可能要计算10亿次才算一次。这是采矿如此缓慢的根本原因。
如前所述,当前块的哈希由块头唯一确定。如果要对同一个块重复计算hash,就意味着块头必须不断变化,否则不可能计算出不同的hash。标题中的所有特征值都是固定的。为了改变标题,中本聪特意添加了一个随机术语,叫做Nonce。
Nonce是一个随机值,矿工的作用其实就是猜测Nonce的值,让块头的hash可以小于目标值,这样就可以写入区块链。随机数很难猜测。目前只能用穷举法一个个试错。根据协议,Nonce为32位二进制值,即最大值可达21.47亿。第100,000个块的Nonce值是274,148,111。可以理解为挖掘者从0开始计算2.74亿次得到一个有效的Nonce值,使得计算出来的hash满足条件。
幸运的话,也许我们很快就能找到Nonce。运气不好的话,可能已经计算了21.47亿次,但是还没有找到Nonce,也就是当前块不可能计算出满足条件的hash。此时,协议允许矿工改变区块并开始新的计算。
难度系数的动态调整
前面说过,挖掘是随机的,不可能保证十几分钟就能产出一个区块,有时候哪怕一分钟,有时候可能几个小时都没有结果。一般来说,随着硬件设备的完善,矿机数量的增加,计算速度会越来越快。
为了保持十分钟的输出速度不变,中本聪还设计了难度系数的动态调整机制。他规定每两周调整一次难度系数(2016块)。如果这两周积木的平均生成速度是9分钟,就意味着比法定速度快了10%,那么接下来的难度系数就要提高10%。如果平均生成速度是11分钟,就意味着比法定速度慢了10%,那么下一个难度系数就会下调10%。
难度系数越高(目标值越小),挖掘难度越大。
区块链分叉
即使区块链是可靠的,还有一个问题需要解决:如果两个人同时向区块链写入数据,也就是说两个块同时加入,因为都连接到前一个块,就形成了分叉。这个时候应该采用哪个区块?
当前的规则是新节点总是采用最长的区块链。如果区块链有分叉,它将看到哪个分支在分叉点后面,首先到达六个新块(称为“六个确认”)。按照10分钟区块计算,一个小时就可以确认。
由于新块的生成速度是由计算能力决定的,所以这个规则意味着计算能力最强的分支就是真正的区块链。
摘要
区块链作为无人分布式数据库,从2009年开始已经运行了8年,没有出现大的问题。这证明是可行的。
但是,为了保证数据的可靠性,区块链也有自己的成本。首先是效率,数据写入区块链至少需要十分钟。如果所有节点都同步数据,则需要更多时间。二是能耗,区块的生成需要矿工无数次无意义的计算,非常耗能。
因此,区块链的适用场景实际上非常有限。
3.采矿收入可以弥补其自身的成本,采矿收入可以弥补其自身的成本。
目前区块链最大的应用场景(可能也是唯一的应用场景)是以比特币为代表的加密货币。
-结束-