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