1. 起源
工作量證明(Proof Of Work,簡(jiǎn)稱POW),簡(jiǎn)單理解就是一份證明,用來(lái)確認(rèn)你做過(guò)一定量的工作。
通過(guò)對(duì)工作的結(jié)果進(jìn)行認(rèn)證來(lái)證明完成了相應(yīng)的工作量。
哈希現(xiàn)金是一種工作量證明機(jī)制,它是亞當(dāng)·貝克(Adam Back)在1997年發(fā)明的,用于抵抗郵件的拒絕服務(wù)攻擊及垃圾郵件網(wǎng)關(guān)濫用。
在比特幣之前,哈?,F(xiàn)金被用于垃圾郵件的過(guò)濾,也被微軟用于hotmail/exchange/outlook等產(chǎn)品中(微軟使用一種與哈?,F(xiàn)金不兼容的格式并將之命名為電子郵戳)。
哈?,F(xiàn)金也被哈爾·芬尼以可重復(fù)使用的工作量證明(RPOW)的形式用于一種比特幣之前的加密貨幣實(shí)驗(yàn)中。
2. 哈希函數(shù)
哈希函數(shù)(Hash Function),也稱為散列函數(shù),給定一個(gè)輸入x,它會(huì)算出相應(yīng)的輸出H(x)。哈希函數(shù)的主要特征是:
1)輸入x可以是任意長(zhǎng)度的字符串;
2)輸出結(jié)果即H(x)的長(zhǎng)度是固定的;
3)計(jì)算H(x)的過(guò)程是高效的(對(duì)于長(zhǎng)度為n的字符串x,計(jì)算出H(x)的時(shí)間復(fù)雜度應(yīng)為O(n));
而對(duì)于比特幣這種加密系統(tǒng)所使用的哈希函數(shù),它需要另外具備以下的性質(zhì):
1)免碰撞,即不會(huì)出現(xiàn)輸入x≠y,但是H(x)=H(y)
其實(shí)這個(gè)特點(diǎn)在理論上并不成立,比如,比特幣使用的SHA256算法,會(huì)有2^256種輸出,如果我們進(jìn)行2^256+1次輸入,那么必然會(huì)產(chǎn)生一次碰撞;甚至從概率的角度看,進(jìn)行2^130次輸入就會(huì)有99%的可能發(fā)生一次碰撞。
不過(guò)我們可以計(jì)算一下,假設(shè)一臺(tái)計(jì)算機(jī)以每秒10000次的速度進(jìn)行哈希運(yùn)算,要經(jīng)過(guò)10^27年才能完成2^128次哈希!甚至可以這么說(shuō),即便是人類制造的所有計(jì)算機(jī)自宇宙誕生開(kāi)始一直運(yùn)算到今天,發(fā)現(xiàn)碰撞的幾率也是極其小的。
2)隱匿性,也就是說(shuō),對(duì)于一個(gè)給定的輸出結(jié)果H(x),想要逆推出輸入x,在計(jì)算上是不可能的。
3)不存在比窮舉更好的方法,可以使哈希結(jié)果H(x)落在特定的范圍。
以上特點(diǎn)是比特幣的工作量證明系統(tǒng)可以正常運(yùn)行的基石。
3. 工作量證明的基本原理
工作量證明系統(tǒng)主要特征是客戶端需要做一定難度的工作得出一個(gè)結(jié)果,驗(yàn)證方卻很容易通過(guò)結(jié)果來(lái)檢查出客戶端是不是做了相應(yīng)的工作。這種方案的一個(gè)核心特征是不對(duì)稱性:工作對(duì)于請(qǐng)求方是適中的,對(duì)于驗(yàn)證方則是易于驗(yàn)證的。它與驗(yàn)證碼不同,驗(yàn)證碼的設(shè)計(jì)出發(fā)點(diǎn)是易于被人類解決而不易被計(jì)算機(jī)解決。
舉個(gè)例子,給定的一個(gè)基本的字符串"Hello, world!",我們給出的工作量要求是,可以在這個(gè)字符串后面添加一個(gè)叫做nonce的整數(shù)值,對(duì)變更后(添加nonce)的字符串進(jìn)行SHA256哈希運(yùn)算,如果得到的哈希結(jié)果(以16進(jìn)制的形式表示)是以"0000"開(kāi)頭的,則驗(yàn)證通過(guò)。為了達(dá)到這個(gè)工作量證明的目標(biāo)。我們需要不停的遞增nonce值,對(duì)得到的新字符串進(jìn)行SHA256哈希運(yùn)算。按照這個(gè)規(guī)則,我們需要經(jīng)過(guò)4251次計(jì)算才能找到恰好前4位為0的哈希散列。