本文章配套视频:链接:https://pan.baidu.com/s/1gS3OhQ7xX6tds5bD8P54Aw 密码:s6af
哈希函数的特点为:
1、输入无限的字符会输出给我们固定长度的字符,如下面的例子中,我输入了一串字符:
我输入了一串很长的字符,最后都会返回同样长度的哈希值:
2、输入的函数的微小变化最后都会带来哈希函数返回值的巨大变化
多加了一个句号,带来哈希函数的巨大变化:
3、哈希函数的特点是不能根据哈希函数的返回值倒推出我们输入的数据是什么。同样的,我们在计算哈希函数之前,也不能够判断出数据回输出什么样的哈希值。
一个抽象的区块如下:
每一个区块同样的有一个哈希值,和前面不同的是,区块的哈希值是由区块的很多信息组合在一起共同生成的,在这里,区块数量Block、随机数Nonce、数据Data共同的生成了这个哈希值。
我们注意到,当前的Hash值有点特别,它的前4个哈希值都为0。我们在这里我们在这里定义一种规则,只有满足了哈希值前4个都为0的区块才是有效的区块。当我改变data数据的时候,区块的哈希值会发生变化。不再满足我们的假设条件:哈希值前4个都为0,因此当前的区块是无效的。为了让当前的区块生效,我们需要改变区块 中的随机值Nonce。
我们从Nonce=1开始一直执行下去,我们可以看到,我们计算到天荒地老也计算不出结果:
这就是挖矿的概念,我们需要找到一个随机的Nonce值,使得区块有效,在这里就是计算出哈希值前面4个等于0.
我们点击下方的挖矿按钮,然后计算机会为我们从1到无穷计算。
计算完成后,我们挖到了一个有效的区块,这个区块的Nonce值为119485.多么庞大的一个值,手动计算要到天荒地老吧。现在我们计算出了一个有效的区块。
区块链顾名思义就是由很多很多有效的区块构成的:
在下面的图片中,我们可以看到每一个区块和之前的区块没有什么差别,只是它多了一个Prev的成员,这个成员其实就是前一个区块的hash值。区块链上的第一个区块叫做创世区块(genesis block),他没有前一个区块,所以他的prev哈希值为0.区块链通过prev这个值将区块链连接在一起。
我们可以看到:每个区块都有prev连接着上一个区块的哈希值:
一旦我们改变第3个区块的数据,第三个区块的哈希值也会发生变化,代表区块失效了:
这个时候我需要重新的挖矿、获取到一个新的Nonce值。挖矿成功。
但是我一旦试图修改第2个区块的数据,那么后面的区块都会失效:
当我为第2个区块重新挖矿之后,我们可以看到:第三个区块仍然失效,因为Prev值已经发生了变化。Hash值也会相应的发生变化。
所以我们需要为第3个区块重新挖矿:
想象一下,现在的比特币的区块有50多万个,如果我修改了第一个区块,那么后面所有的区块都会失效。这就是为什么前面的区块会更加安全的原因。
如果你喜欢我的文章,鼓励我写出更多优质的内容、录出更加优质的视频
以太坊地址:0xBe1f4C34C002cEc07A7F41dCb592c1379Afd1FEB
EOS地址:EOS7j1QopSEV4BhjiP4T3SuPhNSgghCZ4nfaxw7CF85D4AqisDFcQ
加我本人微信拉你进群交流: