了解区块链哈希如何工作非常重要。但为了做到这一点,我们需要先了解区块链创建的核心原则之一。区块链技术是上个世纪最具创新性和时代特征的发现之一。看到过去几年的影响力和未来的影响力,这样说肯定不为过。为了解各种加密货币如以太坊和比特币的功能。
那么什么是哈希?
简而言之,哈希表示采用任意长度的输入字符串并输出固定长度的输出。在像比特币这样的加密货币的情况下,交易被视为输入并通过散列算法(比特币使用SHA-256)运行,该算法提供固定长度的输出。
让我们看看哈希过程是如何工作的。我们将投入某些投入。在本练习中,我们将使用SHA-256(安全散列算法256)。
正如你所看到的,在SHA-256的情况下,无论你的输入有多大或多小,输出总是有一个固定的256位长度。当你处理大量的数据和事务时,这变得至关重要。所以基本上,不是记住可能很大的输入数据,而是记住哈希并保持跟踪。在我们继续前进之前,我们需要先看看哈希函数的各种属性以及它们在区块链中的实现方式。
加密散列函数
密码散列函数是一类特殊的散列函数,具有各种属性,非常适合密码学。为了被认为是安全的,密码散列函数需要具有某些属性。我们一个接一个地看看它们。
属性1:确定性
这意味着无论您通过散列函数对特定输入进行多少次分析,您都会得到相同的结果。这是至关重要的,因为如果每次都得到不同的哈希值,就不可能跟踪输入。
属性2:快速计算
散列函数应该能够快速返回输入的散列。如果这个过程不够快,那么这个系统就不会有效。
性质3:前像电阻
什么预映像电阻状态是给定H(A),确定A是不可行的,其中A是输入并且H(A)是输出散列。注意使用“不可行”一词而不是“不可能”。我们已经知道从它的散列值中确定原始输入并不是不可能的。我们举个例子吧。
假设你掷骰子,输出是骰子出现的数字的散列。你将如何确定原始号码是什么?很简单,你所要做的就是从1-6中找出所有数字的哈希值并进行比较。由于散列函数是确定性的,所以特定输入的散列总是相同的,因此您可以简单地比较散列并找出原始输入。
但是,只有在给定的数据量非常少的情况下,这才有效。当你有大量的数据时会发生什么?假设你正在处理128位散列。唯一必须找到原始输入的方法是使用“ 强力方法 ”。蛮力方法基本上意味着你必须选取一个随机输入,对其进行散列,然后将输出与目标散列进行比较并重复,直到找到匹配。
那么,如果你使用这种方法会发生什么?
最佳案例场景:您可以在第一次尝试时获得答案。你会认真地成为世界上最幸运的人,因为这会发生。这种情况的可能性是天文数字。
最坏的情况:你在2 ^ 128 - 1次之后得到答案。基本上,这意味着你会在所有数据的末尾找到你的答案。
平均情景:在2 ^ 128/2 = 2 ^ 127次之后,您会在中间的某处找到它。从这个角度来看,2 ^ 127 = 1.7 X 10 ^ 38。换句话说,这是一个巨大的数字。
所以,虽然可以通过强力方法来打破前置图像电阻,但这并不重要。
属性4:输入中的小改动改变哈希。
即使您对输入进行了小改动,散列中所反映的更改也将非常庞大。让我们使用SHA-256对其进行测试:
你看到了吗?即使你只是改变了输入的第一个字母表的大小写,看看它对输出哈希值有多大影响。这是一个关键的功能,因为哈希的这个特性导致了区块链的最大特质之一,它的不变性(稍后更多)。
性质5:防碰撞
给定两个不同的输入A和B,其中H(A)和H(B)是它们各自的散列,H(A)等于H(B)是不可行的。这意味着大多数情况下,每个输入都会有自己独特的散列。为什么我们说“大部分”?我们来谈谈一个有趣的概念,叫做“生日悖论”。
什么是生日悖论?
如果你在街上碰到任何一个陌生人,那么你们都有相同的生日,所以你们都很低。事实上,假设一年中的所有日子都有生日的可能性,另一个人分享你的生日的机会是1/365,这是0.27%。换句话说,它非常低。
不过,话虽如此,如果你在一个房间里聚集20-30人,那么两个分享完全相同生日的人的几率会以天文数字上升。事实上,在这种情况下,有两个人共享同一个生日的机会有50-50个!
图片来源:(YouTube)
为什么会发生?这是因为一个简单的概率规则如下。假设你有偶然发生的N种不同的可能性,那么你需要N个随机项的平方根,以使它们有50%的碰撞几率。
因此,将这个理论应用于生日时,你有365种不同的生日可能性,所以你只需要Sqrt(365),这是〜23〜,随机选择两个人分享生日的可能性为50%。
这在哈希中的应用是什么?
假设你有一个128位散列,有2 ^ 128种不同的可能性。通过使用生日悖论,你有50%的几率在sqrt(2 ^ 128)= 2 ^ 64的情况下打破碰撞抵抗。
正如你所看到的,打破抗碰撞要比打破前像抵抗要容易得多。没有散列函数没有碰撞,但通常需要很长时间才能找到碰撞。所以,如果你使用的是SHA-256这样的函数,假设如果H(A)= H(B),那么A = B是安全的。
物业6:益智友好
现在,这是一个非常吸引人的属性,这个属性在加密货币上的应用和影响是巨大的(后面我们将介绍挖掘和加密谜题时的应用和影响)。首先让我们定义属性,之后我们将详细讨论每个术语。
对于每个输出“Y”,如果从具有高min-entropy的分布中选择k,则找到使得H(k | x)= Y的输入x是不可行的。
这可能会让你头脑发热!但没关系,让我们现在明白这个定义的含义。
“高分熵”的含义是什么?
这意味着选择价值的分布非常分散,以至于我们选择一个随机值的概率可以忽略不计。基本上,如果您被告知要选择1到5之间的数字,那么这是一个低的最小熵分布。但是,如果要选择1到1的数字,那么这是一个高的最小熵分布。
“k | x”是什么意思?
“|”表示串联。连接意味着将两个字符串加在一起。例如。如果我将“BLUE”和“SKY”连接在一起,那么结果将是“BLUESKY”。
所以现在让我们重新回顾一下这个定义。
假设你有一个输出值“Y”。如果从广泛的分布中选择一个随机值“k”,找到一个值X以使得k和x的连接的散列将给出输出Y是不可行的。
再次注意“不可行”这个词,这不是不可能的,因为人们总是这样做。事实上,整个挖掘过程就是在这个基础上进行的(后面会详细介绍)。
加密散列函数的例子
MD 5:它产生一个128位散列。在~2 ^ 21哈希后,碰撞阻力被破坏。
SHA 1:生成一个160位散列。经过2 ^ 61次哈希后,碰撞抵抗力破灭。
SHA 256:产生一个256位散列。这是比特币目前正在使用的。
Keccak-256:产生256位散列,目前由Ethereum使用。
散列和数据结构
数据结构是存储数据的专用方式。如果您想了解区块链的工作原理,有两种数据结构属性非常重要。他们是:
指针。
链接列表。
指针
指针是存储另一个变量地址的编程变量。通常任何编程语言的普通变量都会存储数据。
例如。int a = 10,表示存在一个存储整数值的变量“a”。在这种情况下,它存储的整数值是10.这是一个正常变量。
然而,指针不是存储值而是存储其他变量的地址。这就是为什么他们被称为指针,因为他们字面上指向其他变量的位置。
链接列表
链表是数据结构中最重要的项目之一。这是一个链表:
它是一系列块,每个块都包含通过指针链接到下一个块的数据。在这种情况下,指针变量包含其中下一个节点的地址,因此进行连接。如你所见,最后一个节点有一个空指针,这意味着它没有任何价值。
这里需要注意的一点是,每个块内的指针都包含下一个块的地址。这就是指向如何实现的。现在你可能会问清单中第一个块的含义是什么?第一个区块的指针在哪里停留?
第一块被称为“生成块”,它的指针位于系统本身。它看起来像这样:
图片提供:Coursera
如果您想知道“哈希指针”的含义是什么,那么我们会稍微达到这一点。
正如您现在可能已经猜到的那样,这是区块链结构的基础。块链基本上是一个链表。让我们来看看区块链结构的样子:
区块链是一个链接列表,其中包含数据和指向其前一个区块的哈希指针,因此创建链。什么是散列指针?散列指针与指针相似,但不仅包含前一个块的地址,而且还包含前一个块内的数据的散列。这一小小的调整让区块链变得如此可靠和开创性。
想象一下,黑客攻击第3块并尝试更改数据。由于散列函数的属性,数据的轻微变化将大大改变散列值。这意味着在块3中做出的任何细微改变都会改变块2中存储的散列,现在又会改变数据和块2的散列,这将导致块1中的变化等,等等。这将彻底改变这个链条,这是不可能的。这就是区块链如何实现不变性。
那么块头是什么样的?
块头包含:
版本:块版本号。
时间:当前时间戳。
目前的困难目标。(稍后更多)。
前一个块的哈希。
Nonce(稍后更多)。
梅克尔根的哈希。
现在,我们来关注Merkle Root的哈希。但在此之前,我们需要了解Merkle树是什么。
什么是梅克尔树?
图片提供:维基百科
上图显示了梅克尔树的外观。在梅克尔树中,每个非叶节点都是其子节点值的散列。
叶节点:叶节点是树最低层中的节点。那么对于上面的图,叶节点将是L1,L2,L3和L4。
子节点:对于一个节点,馈送到它的层下的节点是其子节点。在图中,标记为“Hash 0-0”和“Hash 0-1”的节点是标记为“Hash 0”的节点的子节点。
根节点:标记为“Top Hash”的最高层上的单个节点是根节点。
那么梅克尔树与区块链有什么关系?
每个块包含数千和数千个事务。将每个块内的所有数据作为一系列存储将是非常低效的。这样做会使查找任何特定事务非常繁琐且耗时。但是,如果您使用梅克尔树,您将大大缩短查找特定交易是否属于该区块所需的时间。
我们来看一个例子。考虑下面的梅克尔树:
图片提供:Coursera
现在假设我想知道这个特定的数据是否属于这个块中:
我可以简单地通过跟踪导致数据的散列来追踪它,而不是通过查看每个单独的散列并查看它是否属于数据的麻烦过程,而只是简单地追踪它:
这样做显着减少了所花费的时间。
采矿中的散列:加密谜题。
当我们说“挖掘”时,它基本上意味着在区块链中搜索要添加的新块。来自世界各地的矿工正在不断努力,以确保链条不断增长。早些时候,人们使用笔记本电脑很容易,但随着时间的推移,人们开始形成采矿池,以便更有效地集中计算机的能力和采矿。
然而,这可能是一个问题。每种加密货币都有一个上限,例如。对于比特币来说,它只有2100万。那里只有2100万个比特币。如果允许矿工以这个速度继续进行,他们将会淘汰所有存在的比特币。最重要的是,在创建每个块之间需要有一个特定的时间限制。对于比特币,创建块之间的时间限制为10分钟。如果允许更快地创建块,则会导致:
更多的碰撞:将产生更多的散列函数,这将不可避免地导致更多的冲突。
更多的孤儿块:如果很多矿工过度开采,他们会同时提出新块。这将导致一个或多个街区无法成为主链和孤儿街区的一部分。
因此,为了限制块创建,设置了特定的难度级别。采矿就像一场游戏,你解决了难题,你会得到奖励。设置难度使得这个难题难以解决,因此耗费更多时间。WRT比特币难度目标是64个字符的字符串(与SHA-256输出相同),以一串零开始。随着难度级别的增加,一些零点会增加。每隔2016个街区后,难度级别会发生变化。
采矿过程
注意:我们主要在这里讨论比特币挖掘。
当比特币挖掘软件想要为区块链添加一个新区块时,这是它遵循的程序。每当新块到达时,块的所有内容首先被散列。如果哈希小于难度目标,则将其添加到区块链中,并且社区中的每个人都会确认新区块。
但是,它并不那么简单。你必须非常幸运才能像这样获得新的区块。这是nonce进来的地方。nonce是一个任意字符串,与块的散列连接。之后,这个串联的字符串再次被散列并与难度级别进行比较。如果它不低于难度等级,则随机数发生变化,并持续重复数百万次,直至最终达到要求。当发生这种情况时,块被添加到块链中。
回顾一下:
采用新块的内容的散列值。
随机数(随机字符串)被附加到散列。
新的字符串再次散列。
然后将最终的哈希值与难度级别进行比较,并查看它是否实际上小于或等于该值。
如果不是,则随机数被改变并且该过程再次重复。
如果是,则将该块添加到链中,并更新公共分类帐并提醒添加。
负责此事的矿工将获得比特币奖励。
记住散列函数的属性号码6?难题友好吗?
对于每个输出“Y”,如果从具有高min-entropy的分布中选择k,则找到使得H(k | x)= Y的输入x是不可行的。
所以,当谈到比特币挖掘时:
K = Nonce
x =块的散列
Y =难度目标
整个过程是完全随机的,在随机选择背后没有思考过程。这只是纯粹的蛮力,软件会随机生成字符串,直到达到目标为止。整个过程遵循Proof Of Work协议,这基本上意味着:
解决难题应该很困难。
然而,检查答案应该对每个人都很简单。这样做是为了确保没有不合格的方法被用来解决问题。
什么是散列率?
哈希率基本上意味着这些哈希操作在采矿过程中发生的速度有多快。高哈希率意味着更多的人和软件机器参与挖掘过程,因此系统运行平稳。如果散列速率太快,则难度级别增加。如果哈希率变得太慢,那么难度级别会降低。
结论
散列在创建区块链技术方面确实是最基础的。如果您想了解区块链是什么,他们应该明白哈希的含义。