跳至主要內容

雜湊函數 — ETH.BUILD

使用 ETH.BUILD 教育工具示範密碼學雜湊函數。了解雜湊函數的運作原理,以及為什麼它們是以太坊帳戶和資料完整性模型的基礎。

Date published: 2021年1月14日

奧斯汀·格里菲斯製作的教學,示範如何使用 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。讓我們做一些很酷的東西,並在過程中學到很多。

這個頁面對您有幫助嗎?