加密哈希函數(shù)與加密貨幣有什么聯(lián)系
對比特幣感興趣的人或多或少應該都聽說過“加密哈希函數(shù)(cryptographic hash function)”這個術語。但是它究竟是什么意思,與加密貨幣又有什么聯(lián)系?
哈希函數(shù)不僅是比特幣協(xié)議的重要部分,還是也是整個信息安全的重要部分。
我們將在下文中通過一些簡單的例子來展示哈希函數(shù)的工作原理。
什么是哈希函數(shù)?
從理論上講,哈希函數(shù)就是一種數(shù)學流程,將任意大小的輸入數(shù)據(jù)放入該流程,然后返回固定大小的輸出數(shù)據(jù)。
更具體地講就是,提取任意長度的字母序列作為輸入——我們將其稱為string——然后返回一個固定長度的字母序列。無論這個輸入string是一個單一的字母,單詞,句子還是整部小說,而輸出的長度——叫做摘要(digest)——永遠都是相同的。
這種類型的哈希函數(shù)的常見用例就是存儲密碼。
當你使用任何一種網(wǎng)絡服務創(chuàng)建一種需要密碼的用戶賬戶時。這種密碼都是通過哈希函數(shù)運行的,存儲的就是該密碼信息的哈希摘要。當你輸入密碼來登錄賬號時,然后相同的哈希函數(shù)就會去運行你輸入的密碼,然后服務器就會檢查其結(jié)果是否與存儲的摘要相匹配。
這就意味著即使黑客能夠訪問用于存儲哈希的數(shù)據(jù)庫,他們也不可能立即破壞所有用戶賬戶,因為無法輕易找到生成某一特定哈希的密碼。
Python簡單哈希函數(shù)
你可以使用Python(Mac和Linux操作系統(tǒng)在默認情況下安裝的編程語言)來實驗哈希值。(本教程假設使用了某種版本的OSX或者Linux系統(tǒng),因為Windows使用Python會更加復雜)
首先,打開終端,輸入python并點擊Enter。
然后你將進入Python REPL,在這種環(huán)境下,你可以直接試用Python命令,而不是在單獨的文件中編寫程序。
然后輸入以下數(shù)值,在每行之后敲擊Enter,并在標記處輸入TAB:
import hashlib
def hash(mystring):
[TAB] hash_object = hashlib.md5(mystring.encode())
[TAB] print(hash_object.hexdigest())
[ENTER]
這樣你就創(chuàng)建了一個函數(shù)——hash(),該函數(shù)將計算出某一特定的使用MD5哈希算法的字符串的哈希值。將字符串插入上述的括號()中便可運行該函數(shù)。例如:
hash(“CoinDesk rocks”)
按下Enter并查看該字符串的哈希摘要。
你將看到在同一字符串上調(diào)用該哈希函數(shù)將會總是生成相同的哈希,但添加或改變其中的某一個字符將會生成一種完全不同的哈希值:
比特幣哈希函數(shù)
在比特幣協(xié)議中,哈希函數(shù)是區(qū)塊哈希算法的一部分,區(qū)塊哈希算法可以用來通過挖礦流程將新的交易編寫到區(qū)塊鏈中。
在比特幣挖礦過程中,函數(shù)的輸入都是來自于最近的尚未確認的交易(以及一些與前一個區(qū)塊相關的時間戳和引用一些額外輸入)
在以上代碼示例中,我們已經(jīng)看到改變哈希函數(shù)中的一小部分會導致產(chǎn)生一種完全不同的輸出。這個屬性與挖礦過程中的“工作量證明(POW)”算法至關重要:為了成功“解決”一個區(qū)塊,礦工需要以這種方式將所有輸入與他們自己的輸入數(shù)據(jù)結(jié)合,由此產(chǎn)生的哈希將以某些0開頭。
作為一種基礎的演示,我們可以通過在“CoinDesk rocks!”后面手動添加嘗試感嘆號(?。源藝L試使用我們的Python哈希函數(shù)來進行“挖礦”,知道我們找到以單個0開頭的哈希。
當然,為比特幣區(qū)塊解決哈?!帉懺撐臅r,必須以18個0開頭——需要一個非常大的計算量(比特幣網(wǎng)絡的所有計算機處理能力結(jié)合在一起仍舊需要接近10分鐘才能解決一個區(qū)塊)。
需要大量的處理能力就意味著新比特幣的挖掘需要一個長期的過程才能完成,而無法一次性將所有的比特幣全部挖出。
為了能夠從挖礦中賺取比特幣,你需要投入大量的工作來解決區(qū)塊——通過獲得這種獎勵,你將所有的新交易鎖入?yún)^(qū)塊中,也就是添加到之前所有交易的永久性記錄中:區(qū)塊鏈。