什么是hash值與比特幣之間又有什么關(guān)系
這篇我們要先介紹比特幣使用到的密碼學(xué)技術(shù):Hash(哈希)。hash是什么,有點(diǎn)類似「洗牌」把牌洗亂的概念,只是洗的不是牌,而是一筆數(shù)據(jù),這個(gè)「洗」的過程是經(jīng)過嚴(yán)謹(jǐn)定義的,且產(chǎn)生的結(jié)果會(huì)是固定長(zhǎng)度的。常見的hash算法有MD5、RIPEMD-160、SHA1、SHA256等,不同hash算法「洗」的過程都不同,產(chǎn)生出來hash值長(zhǎng)度也不同,像是MD5不管喂進(jìn)去的數(shù)據(jù)多大,最終都會(huì)產(chǎn)生128 bits的結(jié)果,而SHA256產(chǎn)生的hash值則會(huì)是256 bits。一個(gè)好的hash算法通常需要具備以下這些特性:
1.輸入任意長(zhǎng)度的數(shù)據(jù),產(chǎn)生的hash值是固定長(zhǎng)度的
2.取得hash值的計(jì)算過程是快速的
3.輸入的數(shù)據(jù)有任何一點(diǎn)改變,產(chǎn)生的hash值會(huì)有很大的差異
4.具有單向性,可輕易輸入數(shù)據(jù)取得hash值,但無法從hash值得知原始數(shù)據(jù)的內(nèi)容
hash可以拿來做什么呢?假如今天阿牛在下班前打了一份500頁的重要文件,因?yàn)槲募苤匾荒軒щx公司,那隔天他上班時(shí)如何得知是否有人趁晚上潛入公司偷改他的文件,有一個(gè)很簡(jiǎn)單的作法,就是取得整份文件的hash值,比如說用SHA256取得一個(gè)256bits的hash值,然后記在紙上或其他地方,隔天到公司時(shí),只要對(duì)這份文件取得hash值,然后跟昨天下班前得到那個(gè)256bits的hash值比對(duì),如果兩者有差異,表示有人偷改這份文件,阿牛就要再仔細(xì)檢查這份文件,如果兩者一樣,表示文件沒有被修改過,阿??梢园残牡睦^續(xù)編輯他的文件。
再回來看為什么一個(gè)好的hash值需要上述的四點(diǎn)呢?
1.固定長(zhǎng)度:因?yàn)榻Y(jié)果是固定長(zhǎng)度的,阿牛可以知道要準(zhǔn)備多大張的紙來抄,而不會(huì)有時(shí)長(zhǎng)有時(shí)短,也不方便比對(duì)。若是程序來說,設(shè)計(jì)者可以事先規(guī)劃多大的空間放置hash值,不用擔(dān)心Overflow的問題
2.快速得到結(jié)果:雖然輸入的數(shù)據(jù)越大,計(jì)算hash的時(shí)間會(huì)相對(duì)增加,不過整體的過程還是不需要太復(fù)雜的計(jì)算,因此即便阿牛的文件是500頁,也可以快速的得到hash值
3.任何改變產(chǎn)生的結(jié)果都截然不同:阿牛的整份500頁文件即便有人多加了一個(gè)空格,隔天阿牛也可以明顯的知道hash值不一樣了,而第三個(gè)特性還有一個(gè)重要的原因,就是不能讓原始數(shù)據(jù)與hash值可以看出什么關(guān)聯(lián)性,因此即便是原始數(shù)據(jù)有任何一點(diǎn)改變,結(jié)果都是截然不同的
4.具有單向性:假如今天阿牛不小心將紙條掉落在電梯里,被其他人撿走也不會(huì)擔(dān)心重要文件的信息會(huì)外流,因?yàn)闊o法從hash值回推原始數(shù)據(jù)的內(nèi)容
hash應(yīng)用非常廣泛,比如說網(wǎng)站登入時(shí)會(huì)先將密碼轉(zhuǎn)成hash值,若有人擷取到信息,密碼也不會(huì)外流。有些軟件也會(huì)提供hash值,使用者下載后可以將檔案hash比對(duì),就能知道下載的軟件是否有被竄改。而數(shù)位簽章也是使用hash來減少需要加密的數(shù)據(jù)。不過有些hash算法像是MD5、SHA1已經(jīng)不建議使用了。
那么hash值與比特幣有什么關(guān)系呢?比特幣所謂的「挖礦」,其實(shí)就是不斷的計(jì)算hash
直到找到合法的hash值,這個(gè)合法的hash值就是我們上一篇說的「幸運(yùn)草」。我們?cè)诘谝黄恼吕镎f到區(qū)塊鏈的特性之一「難以竄改」就是利用hash值一筆一筆串接下去產(chǎn)生「鏈」的概念,其中任何數(shù)據(jù)被竄改,會(huì)讓原本合法的hash值變成不合法,導(dǎo)致「鏈」斷掉下一篇我們就來講比特幣的「區(qū)塊」有哪些數(shù)據(jù),「挖礦」是怎么計(jì)算hash值的,并將「區(qū)塊」連成「區(qū)塊鏈」。