哈希函数 — ETH.BUILD
使用 ETH.BUILD 教育工具演示密码学哈希函数。了解哈希函数的工作原理以及为什么它们是以太坊账户和数据完整性模型的基础。
Date published: 2021年1月14日
由 奥斯汀·格里菲斯 (Austin Griffith) 制作的教程,演示了如何使用 ETH.BUILD 可视化编程工具来了解密码学哈希函数的工作原理,涵盖了确定性、固定长度输出、单向属性和默克尔树。
本文字稿是奥斯汀·格里菲斯发布的原视频文字稿 (opens in a new tab)的无障碍副本。为了提高可读性,对其进行了轻微的编辑。
哈希函数简介 (0:00)
这是名为 ETH.BUILD 系列的第一个视频。你可以访问 eth.build 来使用这个工具,但它只是用来随便玩玩,让你了解在以太坊上构建时事物是如何运作的。
我们要看的第一个模块是哈希函数。哈希函数到底是什么?嗯,它有点像指纹。你有一个输入——它可以是任何东西——但现在我们只使用文本“hello world”。在另一边,你会得到一个输出,这个输出是一个 64 个字符的十六进制字符串。它显示为 66 个字符是因为有“0x”前缀,但它实际上是一个 64 个字符的十六进制字符串。
将哈希可视化为颜色 (0:50)
如果你看着十六进制,它看起来有点像颜色,如果我们直接把它变成颜色,可能更容易描述我们在这里看到的东西。所以我们要做的就是抓取任何字符串的前六个字符,并将其显示为一种颜色。如果我们看一下,会发现它是一种漂亮的紫色。
让我们看看我的名字是什么颜色——看,是一种漂亮的森林绿。现在让我们回到“hello world”——它又变成了那种紫色。
确定性和固定长度输出 (1:38)
我们刚刚发现的是,它是确定性的。基本上,无论我们输入什么,我们在另一边总是会得到相同的结果。
第二个属性是你可以输入任何任意大小的内容。我可以在键盘上乱敲,看到颜色发生变化,但那个字符串始终保持在 66 个字符的长度。无论你在这里输入什么——甚至是一个文件——我都可以把我的孩子 Leo 的这个文件拖进来,把它作为哈希输入,得到一种漂亮的橙色。然后我可以拖入一个 BIP 词表文本文档,它变成了这种漂亮的浅蓝色。如果我把 Leo 的文件再放回来,猜猜它会是什么颜色?我们知道它会是那种橙色。你会得到你输入内容的这种确定性指纹。
单向属性 (2:37)
下一个最重要的属性是它是单向的。如果我再次输入“hello world”,我们将得到这个“4717”哈希。如果我们把这个哈希发给某人并说“这是我秘密的哈希——如果你能猜出我的秘密,我就给你一百块钱”,他们根本无法接近正确答案。
假设哈希以“4717”开头,他们开始四处摸索试图找到匹配项。你不能只是改变几个小字符就能接近答案——你要么猜中,要么猜不中。你基本上必须暴力破解来猜测它。如果他们碰巧猜到了“hello world”,他们就会得到答案,但如果他们没猜到,他们就永远得不到。没有办法知道你是否越来越接近答案。
你会发现,在密码学中,作为一名开发者有时会感到沮丧,因为它要么有效,要么无效——你得不到任何关于你是否接近答案的提示。但这是一件好事。这正是我们希望哈希函数具备的属性。
哈希函数属性总结 (3:43)
所以我们得出结论:任何大小的任何东西都可以输入到哈希函数中,它会输出一个精确的 64 个字符的十六进制指纹,代表该数据是什么。它是确定性的。它是单向的——你不能反向推导。生成哈希非常容易,但要猜出哈希的秘密却非常困难。
默克尔树和组合哈希 (4:06)
我们可以用它做一些非常巧妙的事情,比如默克尔树。我们有三个输入,我们可以把它们连接在一起。我们可以组合所有这些哈希,然后对这个组合进行哈希处理。
这里的这种颜色——那种紫色——代表了所有这些哈希的哈希。如果我把“hello world”改成“hello world one”,那种紫色就会改变。对任何这些输入的任何微小改变都会导致最终的哈希发生变化。你可以以各种不同的方式引入各种数据——甚至可以有一个哈希树,即默克尔树——或者有一排区块,而这个最终的哈希将基于所有这些东西。如果在这个过程中的任何地方发生任何微小的变化,最终的哈希都会改变。
关键要点 (5:53)
关键要点是,哈希函数基本上就像指纹。如果我输入一些东西,它会确定性地给我预期的输出。这就是哈希函数——欢迎来到 ETH.BUILD。让我们做一些很酷的东西,并在这一过程中学到很多。