摘要:公鑰加密是區塊鏈錢包和交易的基礎,加密Hash散列函數賦予了區塊鏈不變的特性,Merkle樹在組織交易的同時提高了區塊鏈的效率。本文將討論與區塊鏈技術相關的一些重要加密主題,包括 公鑰加密 、 Hash散列 和 Merkel樹。

大家都知道,區塊鏈是比特幣的底層技術,但區塊鏈技術的核心,又是什麼?

是密碼學。

密碼學是區塊鏈技術的核心。 所有的交易信息都會被編碼到區塊裏,而區塊鏈則是由這一個個區塊連接在一起而形成的結構。

密碼技術由來已久,主要經歷了古典密碼、機械密碼、現代密碼三個發展階段。隨着歷史推進,密碼技術不斷在演變,密碼學成爲了科學。而今天我們就要一起來看看,

區塊鏈技術當中的密碼學,與過去我們瞭解的密碼學有什麼不同? 它的作用在哪裏?

什麼是密碼學?

密碼學是開發防止第三方查看私人數據的學科。現代密碼學結合了數學、計算機科學、物理、工程等學科。一些重要術語的定義如下:

  • 加密:將文本編碼成不可讀的格式。

  • 解密:將混亂的信息轉換爲其原始形式。

  • Cipher密碼 一種用於執行加密或解密的算法,通常是一組可履行的、定義明確的步驟。

【密碼學】在以前是加密的同義詞,即把信息從可讀的格式轉換爲毫無意義的信息的過程。加密技術的歷史可以追溯到古埃及,歷史十分悠久。 舉例來說, Caesar Cipher 凱撒密碼是凱撒大帝用來與將軍們進行安全通信的一個著名的密碼。密碼將信息中的每個字母都移動了一定的距離(移位爲2),A變成了C,B變成了D,依此類推。

(http://practicalcryptography.com/ciphers/caesar-cipher/)

區塊鏈技術以多種不同的方式對錢包、交易、安全性和隱私保護協議進行加密。本文將討論與區塊鏈技術相關的一些重要加密主題,包括 公鑰加密 Hash散列 Merkel樹

公鑰加密

公鑰加密 (也被稱爲非對稱加密)是一種使用一對密鑰(公鑰和私鑰)進行加密的密碼系統。 公鑰可以廣泛分發,但是私鑰只有其所有者才知道。密鑰總是成對創建的,每個公鑰必須有一個相對應的私鑰。 公鑰加密經常被用於以安全的方式加密兩個人或兩臺計算機之間的消息。 任何人都可以使用某人的公鑰來加密信息,但是信息一旦被加密,只有使用相對應的私鑰才能解密該消息。 假設Alice想要向Bob發送一條加密消息,其工作原理是這樣的:

  • Alice使用Bob的公鑰來加密消息;

  • Alice將加密後的消息發送給Bob,如果被第三方攔截,那麼第三方只能看到隨機的數字和字母;

  • Bob使用他的私鑰來解密和讀取收到的消息;

這個過程可以用下面這個圖表來表示:

來源:   Wellesley College

公鑰加密是區塊鏈技術的一個基本組成要素,是錢包和交易的基礎技術。 當用戶在區塊鏈上創建錢包時,就是在生成公私密鑰對。

錢包的地址,或者其在區塊鏈上的表示方式,是由公鑰生成的一串數字和字母的組合。 由於區塊鏈技術本身的性質,這個地址對所有人來說都是公開的,可以用來檢查錢包裏的餘額或向其發送代幣。

與錢包相關聯的私鑰證明了錢包的所有權和控制權。這是唯一能把代幣發送出去的方法,如果私鑰丟失,那麼裏面的代幣將被永遠封存。

區塊鏈上的交易不過就是一條廣播信息,其本質是在說,“從我的錢包裏取出X枚代幣,並將X枚代幣存入另一個錢包”。 一經確認,交易就會被不可更改地寫入分類賬簿,並更新雙方餘額。

然而,此交易消息需要發送錢包的密鑰簽名纔有效,消息廣播後,任何人都可以使用錢包的公鑰來確保來自私鑰的數字簽名是真實的。這是區塊驗證者們在向區塊鏈添加交易(即消息)前要承擔的一個角色。

加密Hash散列

加密Hash散列是區塊鏈技術的另一個基本要素,它直接保障了區塊鏈的不可變性,這是區塊鏈最重要的特性之一。

Hash是計算機科學中的一個術語,意思是輸入任意長度的字符串,然後產生一個固定長度的輸出。 無論某個Hash散列函數的輸入是3個字符還是10個字符,其輸出的長度始終是相同的。

加密Hash散列函數具有以下幾個關鍵特性:

  • 確定性:無論給函數多少次特定的輸入,它都始終會得到相同的輸出;

  • 不可逆性:無法根據函數的輸出來確定輸入的內容;

  • 抗衝擊性:沒有任何兩個輸入可以得到相同的輸出;

加密Hash散列函數的另一個重要特性是改變輸入中的任何一位數據都將極大地改變輸出結果。舉例來說,111111和111112的Hash散列輸出將會是絕對唯一的,且彼此間沒有任何聯繫。

加密Hash散列函數最爲廣泛的用例是密碼儲存。 大多數網站不會儲存用戶的原始密碼,它們會儲存用戶密碼的Hash散列,並在用戶訪問給定的站點並輸入密碼時,檢查散列是否匹配。 如果黑客入侵了他們的數據庫,也只能訪問不可逆的密碼Hash散列。

那麼,加密Hash散列又是如何實現區塊鏈技術不變性的呢?答案就是每個新的數據塊都包含前一個區塊中所有數據的Hash散列輸出。

想象一個剛剛添加了第1000個區塊的區塊鏈。 來自區塊999的數據作爲Hash散列函數輸出存在於第1000個區塊中。然而,包含在區塊999中的數據是區塊998中數據的Hash散列,區塊998中又包含了區塊997中數據的Hash散列。

這樣向前回溯,從第1000個區塊到第1個區塊就這樣通過加密Hash散列連在了一起。其結構圖如下所示:

來源:   Block Geeks

一直以來,這就是保證區塊鏈中數據具有不可變性的原因。如果有人想在前面的區塊中哪怕更改一位數據,那麼不僅會改變該區塊數據的Hash散列輸出,還會改變後面的每一個區塊。網絡上的礦工和節點會立刻注意到所產生的Hash散列與其鏈的版本不匹配,並拒絕此次更改。

供參考:比特幣使用的是名爲SHA-256的加密Hash 散列函數,Ethereum使用的是名爲 keccak256的加密Hash 散列函數。

Merkle 樹

上面的圖是區塊鏈的一種簡化版本,它省略了一些重要信息。圖中有三個向上的箭頭,表示每個區塊的交易都被儲存在一個Merkle根中,而這就是Merkle樹的根節點。

樹是計算機科學中的一個術語,代表以分層樹狀結構儲存數據, 其中,數據位被稱爲節點。 有一個根(頂)節點,下面連接着“子”節點(Child Node),子節點本身也有子節點,依此類推。下圖展示了一個典型的樹型數據結構:

來源: Tutorials Point

如圖所示,樹中的節點組被稱爲子樹(Sub-tree),沒有子樹的節點(其下沒有數據的節點)被稱爲 葉子節點 (Leaf Node)。

Merkle樹(或稱爲Hash散列樹)是一種使用加密Hash 散列函數來儲存散列輸出(而不是每個節點中的原始數據)的樹。 每個葉子節點由其原始數據的加密Hash散列組成,而每個父節點(Parent Node)是其子節點Hash散列組合的Hash散列。

Merkle根僅僅是Merkle樹的根(頂)節點,Merkle根表示其左右子樹組合的Hash散列輸出。下圖是一棵有着4個葉子節點的Merkle樹。

來源:   Shaan Ray

每個葉節點表示交易A、B、C和D的數據的Hash散列,然後將Hash A 和Hash B組合並求散列以生成Hash( A,B),並且以相同的方式生成Hash( C,D)。最終,Hash ( AB)和Hash ( CD)被組合到一起求散列Hash ( Hash ( A,B), Hash ( C,D)),最終形成樹的Merkle根。

那麼,爲什麼Merkle樹對區塊鏈技術來說是十分重要呢?

使用Merkle根並且應用加密Hash散列函數的性質,可以快速判斷給定區塊中的交易是否已被篡改,並識別正在被篡改的特定交易。

如果已確認區塊中的單個交易已經被更改,那麼Merkle根最終將與“正確的” Merkle根截然不同,並且改動是十分顯而易見的。

Merkle樹還允許用戶在不下載整個區塊鏈的情況下驗證他們的的交易是否被包含在區塊中。簡單支付證明技術可以掃掃描Merkle樹中的所有分支,並檢查某個特定的交易是否已經被散列存儲到該樹中。 如果不是在每個區塊中包含一個Merkle根,區塊鏈技術是不可能實現這種效率水平的。

下圖表示的是在區塊鏈中有4筆交易的Merkle樹 (在此圖中,Tx_Root表示Merkle根)

來源:   Block Geeks

結語

密碼學是區塊鏈技術內部工作的一個必要組成部分 。公鑰加密是區塊鏈錢包和交易的基礎,加密Hash散列函數賦予了區塊鏈不變的特性,Merkle樹在組織交易的同時提高了區塊鏈的效率。看完本文,你有什麼想法?歡迎留言區告訴我們~

相關文章