好的哈希算法有什么特点?
注意,有许多散列算法,如MD5、SHA-1、SHA-2等。、SHA-256和BTC的RIPEMD-160等。
至少有两个特点:
1.对于任何两个不同的输入,应该产生不同的输出。(这叫防撞)
2.向前计算很容易,而从输出向后输入非常困难。只能靠暴力猜测。(这被称为不可逆性)
看第一个特点:防撞。
一个好的哈希算法应该为任意两个不同的输入产生不同的输出。
事实证明,MD5和SHA-1并不是好的哈希算法,因为王小云院士等人已经能够找到两个不同的输入,并产生相同的哈希输出。详见相关第1、2条。
如何直观的理解这个特性?
首先,这个哈希算法的输出必须有一定的长度。如果长度不够,肯定会有重复的。比如假设一个哈希算法,输出只有1位,输出不是0就是1。在运行两三次后,是否可能找到输入不同但输出相同的结果?如果输出只有两位数,那么这个哈希只有四种可能的输出,00、01、10和11。在四次或五次运行后,有可能找到不同输入的相同输出吗?
所以MD5是128位长,SHA-256是256位长!
其次,需要保证哈希值在整个输出空中随机均匀分布。而如果输入稍有不同,输出就会完全不同。
这样就有了ID效应,哈希就像每个输入的不同“指纹”。例如,如果您散列1000万个不同的文件,并且每个文件都获得一个唯一的散列值,您可以将此视为文件的ID。每个ID指的是一个唯一的文件。如果你遇到了另一个ID相同的文件,说明你遇到了相同的文件。
还是那句话,要明白输出空很大。
对于RSA-256这样的算法,输出位数是256,所以会有10 ^ 78个可能值(也就是2 ^ 256)。这是一个多大的数字?
有些人估计整个地球(不仅仅是海滩上,而是所有的)的沙量大约是7 * 10 ^ 21,不到10 ^ 22。
宇宙中行星的数量大致不超过7 * 10 ^ 22,但少于10 ^ 23。
如果给它两个不同的输入,它产生相同输出的概率比下面的例子小得多:
你随机选择了一颗星球上的一粒沙子,另一个人随机选择了一颗没有你影响的星球上的一粒沙子。结果你们俩都选择了同一粒沙子!那么你们都选择了沙子里的同一个原子!
现在看看第二个特征:不可逆性
一个好的哈希算法需要快速的正向计算,而逆向计算几乎是不可能的。
例如,我现在有一个BTC私钥,其形式为:
5 hvrdrdq 9 epjtcjhxuctu 9 vujydzuz 1????????????????***
为了保密,我用16个字?相反。
该私钥的MD5值计算为
630 a 0 ccec 43d 49095027 b 224 ea 0 F2 b 317。
那么全世界的黑客都可以通过破解MD5得到我的私钥吗?
答案是:按照现在的能力,没有。
黑客的做法只能是,继续尝试这16个?可能的数字组合,计算其MD5值,希望有一天也能计算出同样的MD5值。
但这种暴力猜测需要很长时间。(粗略估计,以现在的技术,如果全世界的黑客联合起来,拥有全世界BTC矿业一样的计算能力,至少需要5年时间。)
那么,你在做什么采矿?
2021年6月13日18时09分30秒,BTC矿工挖出一个哈希:
000000000000000000009813 c8 a3 b 95 E3 a 75d 878419547 b 7 Fe 4 DD 71 f 9 DC 71 da 72
看这杂碎多漂亮!它前面有多少个零!
上面是用十六进制表示的,所以,每个0其实都是二进制的0000,所以上面的哈希前面是19*4=76个二进制的0!
这个HASH是一个块的HASH(严格来说是这个块头的HASH)。
这个漂亮的最近10分钟出一个。
矿工们哈希了多少次才做出这么漂亮的哈希?
我不知道。反正一个出现平均要2.76次。你觉得做了多少次了?
他们想挖这个干什么?
图BTC由此块授予。
挖到这一块的矿工(大概是很多人一起挖的)拿到了6.541***549 BTCs,其中6.25是系统奖励,其余是赚来的费用。
哦,我大概理解HASH。什么是街区?
现在让我们来谈谈区块链的始祖——BTC的工作原理。
一遍看不懂,就看两遍。如果第二遍听不懂,第三遍就大声读。
一般都能看懂。
1.互联网中的几个节点(节点就是电脑!)同时运行BTC软件。这些软件都是开源的,任何人都可以下载运行(本文提到的节点是指全功能节点,目前全球大概有1000个左右)。
2.如果人们要发起BTC转移(即交易),让一个节点在互联网上广播转移信息,这个交易很快就会扩散到整个网络的每一个节点。每个节点都会检查自己收到的事务是否符合逻辑(比如有没有那么多钱要转),如果不符合,就会丢弃事务。
转会是:张三送1 BTC给李四,王五送0.1 BTC给刘钊,以此类推。差不多就是这个意思。每一次转移也称为一次交易。
3.平均每隔一段时间(平均10分钟),网络中的一个节点就会率先打包一个块,里面包含了这段时间的所有交易数据。这个块会广播到全网,每个节点都会收到这个块(大小约1M)。
3a:打包是有条件的,这个块头的HASH值一定要好看。
3b:平均10分钟才出一个,这是挖矿难度造成的。难度动态调整,两周一次,让全网平均每10分钟就能挖出一块。
在完全去中心化的网络中,难度调整是如何进行的?方法是:每2016块,所有节点会自发调整难度(写在代码里)。新难度通过对比最后2016块和20160分钟(两周)进行调整。如果用时少于20160分钟,调高难度,反之,调低难度。难度可以简单理解为哈希值前面需要多少个零。
3c:每隔10分钟,世界上就会有很多交易,都在等着打包(最后只有分块打包的交易才会被人认可)。每一个尝试打包的矿工,把自己收到的尚未打包的事务放在一个块中(由于块大小的限制,一个普通的块可以容纳2000多个事务),然后通过填充块中的随机数区域来计算HASH,以求找到一个好看的HASH(如果满足难度,就叫好看)。如果找到了,就叫打包成功(也就是挖矿成功),赶紧播。
3d:每收到一个广播块,每个节点检查该块是否满足块的要求(至少哈希要好看!),如果是,保存这个块,然后开始尝试获取下一个块(也就是继续挖掘),将接收到的但尚未打包的事务打包到下一个块中取出。
4.所有节点都在争先恐后地打包,因为谁能正确打包就能获得BTC奖励。
4a:每成功一次,包装商将获得几个BTC奖励。刚开始是50块奖励,每21万块(4年左右)奖励减半,所以后来是25,12.5,现在是6.25。到2140年,就没钱挖了。
4b:其实矿工不仅可以获得系统奖励,还可以分块获得手续费。
5.每个节点收到该块后,如果验证正确,它将接受该块并将其附加到自己的区块链。
5a:由于每个节点都在不断地与其他节点同步,所以每个节点(全功能节点)都保存着从第一块到当前块的数据(目前已经生成了近70万块)。
5b:块头会包含块内所有事务的merkle根(其实也是哈希计算)。如果块中的事务被篡改,您可以通过计算merkle根并将其与标头的merkle根进行比较来找到篡改。
5c:一个块的头也会包含前一个块的头的HASH值(可以简称为块的HASH)。这样可以验证最后一个块是否完整正确(因为任何数据错误,都做不出好看的HASH)。您可以从最新的块一直追溯到创建块(第一个块),以确保没有数据被更改。
5d:在整个区块链上,任何一个块被篡改一点点,这个块的HASH值就不再是好看的HASH,后续块的HASH也不再好看。任何明眼人都会知道数据是错误的。而每一个好看的HASH都是由全世界的若干矿工挖出来的,用了若干矿机,花了若干电费。试图篡改区块的个人或组织不具备如此强大的能力。
标签
现在,你了解哈希,挖掘和为什么区块链是如此防篡改吗?
让我简单总结一下:
HASH容易计算,反过来就不容易了;投入变化小,产出变化大;对于一个好的哈希算法,不同的输入肯定会是不同的输出,不用担心碰撞;哈希值可以被视为ID;通过比较HASH,可以判断输入是否被更改过。
挖掘的目的是为了给一个块找一个好看的HASH,也就是前几位为0的HASH;无论挖掘多少个节点,难度都可以自动简单调整,这样10分钟左右就能找到一个好看的HASH;每个块都将其漂亮的散列放在下一个块的开头;每个节点记录所有块的数据,它可以很容易地验证所有块没有被改变;如果有人想更改历史街区的数据,那就要用老鼻子了!
本文来自傲娇小伙子投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/635834.html