什么是区块链?
区块链我们前面说了,它相当于是一个分布式的账本,和现实中的账本一样,它里面的内容也是一些数据,而存放这些数据的就是区块。
我们可以把区块看成是一个又一个的盒子,盒子里面放的就是我们想要保护的数据。
在现实生活中,一个东西一般都有一个标签。其实在区块链中,一个区块也有一个标签。一个区块上的标签通常包括:高度、时间、当前哈希、前一个区块哈希、默克尔树根、随机数等等。 这里面,高度和时间在上节课创世区块的诞生可以看到,哈希之类的我们在后面则有专门的文章表述,这里先不多说。总之,我们要知道的是,区块的标签就是它的一些身份信息,例如它的“商品”编号,它是什么时间“出厂”的。甚至还可以把它看成一个人,它有自己唯一的身份证号。
标签是区块外部的东西,区块内部只是数据。当然,具体是什么数据,就要看区块链应用在什么领域了。例如比特币中的区块,它存放的就是比特币的交易记录。
什么又是链?
有一点我要说的是。区块虽然有点像现实中的盒子,但是不同的是。现实中的盒子与盒子间可能没什么联系,但区块链中的区块却是一个一个串联起来的,每个区块都有一个块头,用来链接上一个区块的地址。
很多个区块通过块头串联起来,好像是链条,所以才有了区块链的说法。
区块的块头会记录上一个区块的身份证号(哈希值)和本区块的身份证号(哈希值),而本区块的身份证号,又会在下一个区块中呈现。一般来讲,一个区块中的数据放满了以后,它就会往下链到下一个区块,由此形成一个信息链条。
区块链将连续不断发生的数据分成了一个又一个的区块,无论数据先后,到达本地后就根据身份证号进行组装。而且,链条格式还有一个优点。它是一环扣一环的,我们很难从中间对它进行破坏。举个栗子。 如果有人想改变 2 号区块,那它是不是要把 2号区块后面的所有区块都改动才行,这样难度系数就大了吧。
什么是时间戳?
在上面的介绍里我们说过区块链都有时间标记,专业点来说就是区块的时间戳,也可以将它理解为区块的“出厂日期”。时间戳会精确到秒,即指格林威治时间 1970 年 1 月 1 日 0 时起到它出现的总秒数。
因为区块链是一个全球性的东西。而在现实生活中,世界上有不同的时区,北京时间只适合于中国人,对于外国人就不适用了,如果都用自己时区的时间,那这个时间戳就乱套了。因此用这样的时间来定义时间戳,全球的区块链就可以统一起来,一个区块一定有一个唯一的时间,不会有歧义。
时间戳可以让区块上的交易信息不能更改,而且能作为交易证明的一个重要信息。就像我们签合同,要签上一个时间一样,这个时间既是证明信息,也是不能擅自更改的哦。
不过有一点要说明的是,在区块链上,时间戳不是自己签的,有一个时间戳服务器可以帮我们完成申请。不然我们自己计算从 1970 年 1 月 1 日到现在的总秒数,那不累死。
什么是哈希值?
1.哈希值来源于密码学中的一种经典算法,它算出来的数字只能加密,不能解密。
2.它是根据文件的大小、类型、时间、创作者等用机器计算出来的,很容易就会出现变化,例如一个区块中储存的数据,就算只改了一个字母,它的哈希值也会发生变化。
3.因为容易变化,谁也不知道下一个区块的哈希值是多少,也没有更改它的软件。
哈希值的安全性非常高,伪造哈希值的难度非常高。
要想哈希值发生变化,只有更改数据。可是你想,假如一个区块链中共有 100 个区块,如果 10 号区块的数据变了,也就是哈希值变了,那它就不能与 11 号区块发生连接,这个区块链就断了。是不是篡改无效啊。
哈希值的主要作用就是检验区块中的信息是不是有效。
我举个栗子。
你平常上网都会输入密码吧,假如是123456。但是你登陆的网站如果将这个 123456 原原本本地保存下来,如果遇上黑客,你这个密码就很容易被窍取了,被窍取后黑客就可以用你的密码登陆。
反过来呢,如果网站不明文保存你的密码,而是将你登陆的密码变成一个哈希值储存下来。那么黑客就算拿到了这个哈希值,它也推导不出你原来的密码是 123456 啊。因为从 123456 得到哈希值比较容易,而从哈希值推到 123456 极其困难,几乎被视作不可能。
这样,你在登陆网站输入密码时,系统会生成一个哈希值,网站将这个生成的哈希值和它储存的哈希值进行对比,如果相同那就证明你是真正的用户,可以使用了。这特别是在有价值的系统中更是如此。比如银行,银行是肯定不敢明文保存用户密码的,它只会保存用户密码的哈希值。
当然,区块链中的哈希值是经过那一套哈希算法后压缩成的固定长度的二进制值,用户可以通过哈希值访问原来的数据。
什么是随机数?
在区块的那些标签中,大多数都是固定的值,但只有一个值是不固定的,这就是随机数。
随机数的工作原理如下:
随机数算得上是创建新区块的一把“钥匙”。区块链要串联下去,新区块只有创造出满足条件的哈希值才能被系统接受。但这道数学题的解答非常困难,以致于计算机都不能轻易办到。这么说吧。 区块头其实是有一个难度系数的,正是这个值决定了计算哈希的难度。使用常量来除以难度系数,可以得到一个目标值,难度系数越大,目标值越小。要创建新区块要做的工作,就是新区块的哈希值一定要小于目标值。因为目标值小得吓人,所以计算难度就大得吓人,有可能要算 10 亿次才算得出来 1 次。
我们前面讲过,一个区块只有一个哈希值,一个区块内部发生的任何微小的变化就会改变它的哈希值。这个随机数就是用来改变哈希值的。随机值发生了变化,很自然地哈希值就会发生变化。为了让新区块能对应上一个区块,计算的计算机就需要不断改变随机数,以使哈希值发生变化,让区块头的哈希值能够小于目标值,从而让这个新区块能够链入区块链。
要找到正确的随机数可不简单,根据协议,随机值是一个 32 位的二进值制,也就是最大可以到 21.47 亿。要是你运气好,你可能一下子就找到了符合条件的随机值,如果你运气不好,可能你算了 21.47 亿次也找不到这个随机值。这时协议可能会让你改变区块体,然后从 0 开始重新计算。
什么是 Merkle Tree?
前面我们说到了默克尔根,要理解默克尔根,就要先理解默克尔树,默克尔树的英文名称是 Merkle Tree,就是我们标题中这个。
我们以比特币为例,看一下它的区块内部的样子。
为它是一个叫默克尔的人发明的,所以就叫默克尔树。
1.最上面是个橘黄色的框,中间是两个绿色的框,最下面是白色的交易记录。
2.想象一下,如果交易记录 2 的数字改变了,那它首先会影响上面绿色框“1,2 的信息”的数据,接着又会影响最上面那个橘黄色的“交易记录根”框的数据。交易记录 1、3、4数字的改变同样如此。由此也可以看出,最底层任意一个框的数据改变以后,都会影响到最上面那个橘黄色的框,使它的数据发生变化。
3.这样,一个区块的数据装满以后,我们是不是只要记住最上面橘黄色框的信息就可以了。这样,框里的任何数据发生了变化,这个橘黄色框的信息就会发生变化。
这种设计是很精妙的。最上面那个橘黄色的框我们可以把它看成这颗树的根,所以就是默克尔根。而在一个区块的标签中,只要标明了默克尔根的信息,我们就可以校对区块中的内容是不是安全的了。
来源:公号 项目观察
领取专属 10元无门槛券
私享最新 技术干货