比特幣是世界上第一種成功的加密貨幣,之前的嘗試都沒(méi)有像比特幣這樣有效解決有關(guān)貨幣的各種問(wèn)題。
比特幣本身是密碼學(xué)發(fā)展的產(chǎn)物,利用了密碼學(xué)中的很重要的“單向散列函數(shù)”以及數(shù)字簽名兩大技術(shù)來(lái)構(gòu)建,今天我們來(lái)集中精力講解單向散列函數(shù)的5種重要的特性,以及比特幣挖礦相關(guān)的技術(shù)原理。
下面我們先講哈希函數(shù)的特性:
單向散列函數(shù)(one-wayhash function),也就是通俗叫的哈希函數(shù)。
第一個(gè)特點(diǎn):輸入可以任意長(zhǎng)度,輸出是固定長(zhǎng)度
哈希函數(shù)不用知道輸入信息代表的是什么意思,也無(wú)所謂信息的長(zhǎng)度有多長(zhǎng),只要輸入hash函數(shù)出來(lái)的都是固定長(zhǎng)度的比特值。比如非常有名的SHA256 哈希函數(shù),輸入任何值出來(lái)的都是256比特的0和1. 輸入一本《三國(guó)演義》或者僅僅輸入一個(gè)字母a,出來(lái)的都是256位比特長(zhǎng)度的數(shù)據(jù)。
第二個(gè)特點(diǎn):計(jì)算hash值的速度比較快
這一點(diǎn)經(jīng)常被大家所忽略,似乎是習(xí)以為常的東西就不去在意,其實(shí)這一點(diǎn)同樣重要,因?yàn)閱蜗蚬5挠?jì)算很快,才能保證加密或者驗(yàn)證的速度。
第三個(gè)特點(diǎn),防碰撞特性(Collisionresistance)
X≠y,H(x)=H(y) 輸入空間遠(yuǎn)遠(yuǎn)大于輸出空間,比如256位的哈希值指的就是輸出空間是2^256這么多,輸入是無(wú)限可能的,輸出是固定長(zhǎng)度。
但是,目前沒(méi)有找到?jīng)]有好的方法去找出一個(gè)x能得到H(x)等于右邊的值。
遍歷所有輸入的可能能去找到這個(gè)值,叫做brute-force暴力破解嗎,也就是現(xiàn)在礦機(jī)所謂的“哈希碰撞”這個(gè)詞的來(lái)源。
哈希防碰撞用處是保證上傳和下載的數(shù)據(jù)是一樣的,就是改一點(diǎn)點(diǎn)出來(lái)的結(jié)果差很多。舉個(gè)例子,你輸入的信息是一部《紅樓夢(mèng)》(當(dāng)然電腦識(shí)別出來(lái)就是0和1),然后你在紅樓夢(mèng)的第100頁(yè)的第五句話(huà)把一個(gè)逗號(hào)改成句號(hào),然后輸出的hash值就完全不同了。這就是哈希函數(shù)一個(gè)非常重要的特性。
但是collision resistance目前沒(méi)有數(shù)學(xué)證明這個(gè)碰撞不會(huì)發(fā)生,MD5就是最好的例子,之前是很安全的,但是后來(lái)找到了破解方法。
第四個(gè)特點(diǎn):隱藏性(Hiding)或者叫做單向性(one-way)
哈希函數(shù)的計(jì)算過(guò)程是單向不可逆的。x推出H(x),但是反推沒(méi)有法子(單向性),也就是說(shuō),哈希值沒(méi)有泄露輸入的x的信息。也就是說(shuō)x的信息被隱藏了起來(lái),這也就就是隱藏性。
輸入空間要足夠大,取值是均勻的,這樣就很難暴力破解。
利用第三和第四個(gè)特性可以做出很有趣的應(yīng)用場(chǎng)景。
比如預(yù)測(cè)一個(gè)事情?,F(xiàn)實(shí)世界中預(yù)測(cè)和結(jié)果很多時(shí)候是有微妙的關(guān)系的,比如三國(guó)時(shí)期,曹操專(zhuān)門(mén)去找當(dāng)時(shí)的人物品鑒專(zhuān)家許劭,讓他看看自己是什么材料,許劭評(píng)價(jià)曹操是“治世之能臣,亂世之奸雄”,這個(gè)很難說(shuō)他評(píng)的準(zhǔn)不準(zhǔn),或許因?yàn)檫@個(gè)評(píng)語(yǔ),影響了曹操的心理,他就朝這個(gè)方向發(fā)展了,就成了自我驗(yàn)證的預(yù)言了。所以,很難判斷預(yù)測(cè)是否真的準(zhǔn)。
更簡(jiǎn)單例子是,有影響力的股評(píng)師,今天預(yù)測(cè)一下明天的股價(jià)是不是增長(zhǎng),那么,他如果公開(kāi)表明幣價(jià),可能會(huì)影響幣價(jià)。
所以如何表明他確實(shí)很準(zhǔn)確呢?讓他把股評(píng)信息寫(xiě)到紙上,或者存到電腦里,但是要求是第二天開(kāi)盤(pán)后,不能偷偷修改內(nèi)容,這樣就不用擔(dān)心預(yù)測(cè)影響股價(jià)了。那么現(xiàn)在需要做的只是一件事兒:保證他沒(méi)有篡改自己已經(jīng)寫(xiě)好的內(nèi)容。
那么,可以用hash算法,預(yù)測(cè)的結(jié)果(信息)是x,對(duì)x 哈希函數(shù)一下,公布hash值,第二天收盤(pán)再把x放出來(lái),如果你改了昨天的數(shù)據(jù),hash就變了。所有人都可以用hash算一下這個(gè)x和昨天公布的hash值進(jìn)行對(duì)比。
實(shí)際情況下,實(shí)際的輸入空間不是很大,輸入不夠隨機(jī),擔(dān)心有人對(duì)上升下跌這樣的詞匯語(yǔ)句進(jìn)行組合排列,找到這個(gè)x,為了保證安全性,會(huì)加入一個(gè)nonce隨機(jī)數(shù),公式表達(dá)如下。
H(x丨丨nonce) nonce是一個(gè)隨機(jī)數(shù)
意思就是預(yù)測(cè)的結(jié)果信息x后面加個(gè)隨機(jī)數(shù),一起得到hash。
第五點(diǎn):謎題友好(puzzlefriendly)
就是說(shuō)看x不知道H(x)是什么?這個(gè)無(wú)法從輸入數(shù)據(jù),判斷到底輸出是什么樣子。就是說(shuō),知道輸入的信息,無(wú)法一眼看出來(lái)輸出的hash值是什么,謎題友好性值得就是這一點(diǎn):你無(wú)法通過(guò)控制輸入值x來(lái)獲得想要的輸出值H(x)
所以,綜合隱藏性和謎題友好性?xún)蓚€(gè)特點(diǎn),知道輸入信息也不知道哈希值是什么,可以很快算出來(lái),但是無(wú)法預(yù)先判斷;知道哈希值也不能知道輸入值是什么,反向計(jì)算是非常非常困難的,只能暴力破解。
所以如果你想要輸出的值落在某一個(gè)范圍里,比如小于某個(gè)數(shù)值,計(jì)算機(jī)只能一個(gè)一個(gè)去試去猜答案,看哪個(gè)輸入算出來(lái)的輸出值正好是落在你想要的范圍內(nèi)。
你要得到一個(gè)hash值前面K位是0。你無(wú)法知道怎么得到前面是這么多0的x。
挖礦就是找nonce,就是這個(gè)隨機(jī)數(shù)。
H(block header + nonce)≤target
這就是比特幣挖礦的基本原理,就是哈希碰撞去找到這個(gè)nonce,讓他小于一個(gè)target(比如32個(gè)0等等)。Block header(或者block head)就是區(qū)塊頭包括的信息都是所有礦工都知道的信息(比如version,prehash,merkle root,ntimenbits等等信息),所以大家競(jìng)爭(zhēng)的是誰(shuí)先猜出來(lái)nonce。
備注:在二進(jìn)制的世界里,因?yàn)槊恳晃槐忍囟际?或者1,所以比大小,就是比前面的0的數(shù)量,前面32位是0,自然小于前面31位是0(第32位是1),這個(gè)target的所謂比大小也就是限定個(gè)范圍,因?yàn)閟ha256出來(lái)的數(shù)字都是256位的二進(jìn)制數(shù)字(哈希函數(shù)輸出值長(zhǎng)短固定的特性),比誰(shuí)前面的0多是很方便的劃定結(jié)果值的區(qū)域的方式。這一點(diǎn)大家忽略的人很多,其實(shí)是一個(gè)很基礎(chǔ)的數(shù)學(xué)知識(shí),值得注意。
挖礦的基本思想就是來(lái)自上述的信息。在比特幣中的挖礦的過(guò)程里實(shí)際上就是去找nonce也就是確定了輸出范圍后,去找輸入的值。H(block header + nonce)≤target
當(dāng)輸入的值(各種信息+nonce)進(jìn)行hash運(yùn)算后得到的值符合target的范圍,比如說(shuō)前面35個(gè)0就可以了,你猜出來(lái)的值輸入后得到hash值前面40個(gè)都是零,那么肯定符合要求,實(shí)際上前面35個(gè)0就滿(mǎn)足條件了嘛。
然后你把這個(gè)信息公布出去,別的礦工看到你的nonce值,也去hash一下,很快就知道你這個(gè)nonce是合適的,可以滿(mǎn)足target的要求。這里就用到了哈希函數(shù)的計(jì)算速度快的特性(第二個(gè)特性)。
本文總結(jié)了單數(shù)散列函數(shù)也就是哈希函數(shù)的特性,這就是很多區(qū)塊鏈應(yīng)用的基礎(chǔ)以及比特幣加密挖礦的基本原理。文章開(kāi)頭說(shuō)過(guò),比特幣運(yùn)用的密碼學(xué)除了函數(shù)函數(shù),還有一個(gè)非常重要的內(nèi)容是:數(shù)字簽名。這個(gè)我們很快就會(huì)講到。
目前世界上所謂的區(qū)塊鏈落地應(yīng)用,其實(shí)有時(shí)候用的是比特幣的數(shù)據(jù)結(jié)構(gòu)(默克爾樹(shù)等),有時(shí)候用的是UTXO模型來(lái)結(jié)算。有的時(shí)候說(shuō)是溯源,有的時(shí)候說(shuō)是合約。很多的應(yīng)用出來(lái),不管是什么樣的概念,多數(shù)都要用到哈希函數(shù),利用哈希函數(shù)5種特性中的一部分。
隨著文章講解的深入,關(guān)于比特幣,關(guān)于行業(yè)的信息都在展開(kāi),慢慢的大家更能明白,為什么說(shuō)哈希函數(shù)是比特幣和區(qū)塊鏈行業(yè)的基礎(chǔ)了。
來(lái)源: 加密二鍋頭?
評(píng)論