長假最后一天,不知道假期結束甚至幾年后回想起來是否還記得住祖國70歲生日的這段時光呢?是否那個時候還會覺得這七天過的有意義呢?除了國慶閱兵和幾個讓人值得刷一刷的電影,如果你除了娛樂還沒有什么特別的記憶,不妨讀下本系列文章一分鐘了解比特幣,告訴大家你學習到了當下最熱門的有關比特幣的技術知識,而且是有深度有內涵的那種哦。
哈希函數(shù)是一個只能在一個方向上計算的函數(shù),這保證了區(qū)塊鏈世界的清晰性和安全性。這也意味著,如果我們輸入一個函數(shù),我們就可以計算輸出,但是只給輸出卻不可能逆向計算出輸入。(在這個意義上,這一特性就像從私鑰中獲取公鑰一樣。)不過,我們現(xiàn)在不討論它背后的數(shù)學原理或者它是如何工作的。我們需要做的就是理解它的作用,把它當成魔術看待。
我們可以選擇自己所希望的哈希函數(shù)輸出范圍。例如,我們可以使用0到9之間的所有數(shù)字(但是只使用單個數(shù)字),0到99,0到100萬,或者是像0到894這樣的確定值。
為了更好地說明哈希函數(shù)是如何工作的,我們可以假設哈希函數(shù)的范圍是0到9。無論我們輸入的內容是什么,函數(shù)最后都會得出0到9其中一個數(shù)字。如果我們輸入一個表情符號,它可能得出5。如果輸入7859,可能會得到3。如果我們輸入一篇文章,它可能會得出數(shù)字7。
哈希函數(shù)總會輸出一個數(shù)字,但我們不知道為什么。現(xiàn)在想象一下我們輸入的是小說文本,但是在文末添加了一個額外數(shù)字7,你可能認為這種輸入方式最后得出的輸出數(shù)是我們在最后輸入的東西,因此自己最后可能得到數(shù)字7。這樣想可就大錯特錯了。
在哈希函數(shù)中,輸入和輸出沒有可預測的相關性。這種不相關性可以有效防止黑客入侵,因為輸入和輸出無關就不能找出邏輯上的漏洞。
除了加密貨幣之外,哈希函數(shù)還用于在集中網頁服務器上存儲密碼。網絡數(shù)據(jù)庫經常被黑客攻擊,如果黑客能夠做到成功破解數(shù)據(jù)庫并讀取每個人的密碼的話,用戶就要遭殃了。
為了讓用戶更安全,幾乎所有的現(xiàn)代網站都會對用戶的密碼進行哈希處理,然后再將其存儲到數(shù)據(jù)庫中。這樣一來,黑客沒有辦法僅憑數(shù)據(jù)庫里讀取的數(shù)字就算出用戶的密碼。因為從輸入到輸出每一個哈希函數(shù)都是一個非常復雜的代碼,基本無法破解。黑客讀取數(shù)字的時候也只能看到一系列毫無關聯(lián)的隨機數(shù)字。
但是,每次用戶登錄時,服務器都可以正確地驗證他們提供的是否是真正的密碼。因為服務器只接受正確的密碼,并再次對密碼進行哈希函數(shù)驗證,查看它是否與存儲在數(shù)據(jù)庫中的哈希結果相匹配。在這種情況下,密碼本身才是關鍵,獲得“哈希”數(shù)對黑客來說毫無用處。
哈希函數(shù)猜謎游戲
在比特幣領域,我們選擇獎勵給礦工發(fā)布區(qū)塊的權利。礦工可以通過哈希函數(shù)來運行他們準備發(fā)布的區(qū)塊,并且輸出給定范圍內的數(shù)字。接著礦工會把格式數(shù)據(jù)用于一個有序的、格式化的方式中,并開辟一塊地方用于存儲少量無用的垃圾數(shù)據(jù)(稱為“nonce”)。這如同我們舉辦一個比賽,我們告訴玩家添加一個或兩個隨機文章的文本并運行它,通過哈希函數(shù)來找到與輸出相匹配的具體數(shù)字。
本質上,我們是在反向操作——給定哈希輸出,礦工需要找到合適的輸入。但是,這不是不可能的嗎?不可能的是用某種方法從輸出中推斷出輸入。那么隨機猜測是可能的嗎?
讓我們回到哈希函數(shù)的例子,它輸出0到9之間的數(shù)字。想象一下,我們正在玩文本輸入的哈希游戲,如果你編輯文本時用幾句無意義的話,只要哈希到3,你就可以得到獎勵。游戲很簡單,因為從任何輸入中得到3的概率是1 / 10。礦工只需要平均嘗試五種不同的輸入就能獲得獎勵。
一臺速度很快的MacBook上的標準CPU每秒可以在哈希函數(shù)中插入88,000個猜測數(shù)值,所以實際上只需要幾分之一秒的幾分之一秒就可以得到答案。
如果有五十人都使用Macbook參加挑戰(zhàn),而且他們的競爭持續(xù)大約一個小時,你就可以用88000乘以60秒的數(shù)量乘以60分鐘(假設有人可以做一個小時),然后乘以五十多的人數(shù)來計算可能量。由此可見,哈希函數(shù)的范圍很大:從0到(88000 * 60 * 60 *50),范圍從0到15840000000。你必須猜對才能得到獎勵。
比特幣使用非常大的數(shù)字來表示哈希函數(shù)的范圍,所以對于玩家來說,即使玩家數(shù)量在不斷增長,每人每天仍然需要用10分鐘來運行這個猜謎游戲。一旦有人贏了游戲,他們寫的新塊就會被大眾認可而發(fā)布。
隨著挖礦消耗的電力越來越多,比特幣網絡也隨之變化,并根據(jù)計算前幾個區(qū)塊的時間長短,動態(tài)提高每個區(qū)塊的“難度”。顯然不是說一個集中化的資源決定了這一點,而是每個礦工通過自己的計算決定的。
比特幣價值越高,人們對它的需求越多,范圍就越廣,因此必須確?!坝螒颉痹诟嗤婕壹尤氲那闆r下仍然保持平等和廣泛。
比特幣實際上并沒有調整哈希函數(shù)的范圍來更改游戲的難易程度,而是使用了固定范圍:2的256次方。然而,在比特幣版本的挑戰(zhàn)中,礦工們并不是為了匹配一個特定的數(shù)字,而是他們的哈希函數(shù)的輸出必須在一定的范圍內。
調整截止值可以降低挑戰(zhàn)難度。例如,如果我們有一個范圍為1到1000萬的哈希函數(shù),我們可以將截止值設為“2”,那么匹配的概率即為1 / 1000萬。而輸出必須等于“1”,礦工才能獲勝?;蛘撸覀兛梢园呀刂怪翟O為500萬,那么人們在第一次嘗試中獲得成功的幾率達到50%。
在比特幣系統(tǒng)中,礦工能在第一次嘗試就解決問題的幾率極低,遠小于一千萬分之一,但考慮到獎品,有人仍然會再堅持十分鐘。
想想看:有了足夠多的刮刮樂彩票,即使你買了幾百張,你個人中獎的幾率也很低。但是,只要有一張中獎的彩票,就一定會有人中獎。這種確定性和隨機性取代了中央權威。
把“鏈”放在區(qū)塊鏈中
一旦礦工成功地解決了上述難題,會發(fā)生什么?他們如何告知其余玩家?所有用戶又如何接受這個新塊呢?簡而言之:經過這場比賽,我們如何才能最終確定一段明確的歷史記錄,以確保游戲的公平性和清晰度呢?
1. 每個塊必須包含前一個塊的哈希值
2. 擁有最多礦工信任并在上面繼續(xù)工作的最長的塊鏈,就是規(guī)范鏈
總之,一旦在網絡上發(fā)布了一個新的、有效的塊,礦工就必須撿起這個新塊并將它放到他們的鏈中,然后立即從頭開始挖掘一個新的塊。每個塊必須包含前一個塊的哈希值,這樣就能確保區(qū)塊鏈不斷更新。
假設此時的鏈長為5個塊(這是創(chuàng)建比特幣后的50分鐘——一個塊10分鐘)。這就意味著我們要讓第6塊包含第5塊的哈希值。
但是假如說有人在我們之前挖掘出第6塊,我們就得在挖掘第7塊時將別人的第6塊哈希值包含進來。我們不能一直浪費時間在第6塊上,因為人們已經接受了六個區(qū)塊是最長的鏈條,如果我們不趕緊的話,很快就會有第七個了。
這意味著如果我們想讓它被接受并獲得獎勵,我們必須從頭開始創(chuàng)建下一個塊。而這個過程中的關鍵點是,一個塊只在它之前的另一個塊的引用中有效。我們所說的“在另一個塊上”采礦是為了確保塊與塊之間相互聯(lián)系。
如果兩個塊同時發(fā)布會怎樣?礦工會選擇其中一個來挖掘頂部,有可能在一段時間里,有兩個鏈相互競爭。但是,在兩條鏈內,一個會很快變得比另一個長,當另一個被拋棄的時候,這個鏈條會成為了規(guī)范。
現(xiàn)在我們可以看到重復消費是不可能的:在一個給定塊上發(fā)布了幾個塊之后,該塊中的交易實際上被“埋葬”了,不可能被還原或是記錄到支付歷史中。如果不撤消整個區(qū)塊鏈,就無法撤消歷史記錄。
那么,如何撤銷整個區(qū)塊鏈呢?事實上,只有當你消耗的電力比其他所有人加起來還多的時候,你才有可能超過其他礦工。這被稱為51%攻擊,因為我們需要控制進入系統(tǒng)的51%的電力。如果說比特幣有什么弱點的話,這恰恰是比特幣的弱點。但是,只要這種情況不發(fā)生,系統(tǒng)就是安全的。(這也是比特幣網絡可能被摧毀的方式。如果一個參與者持續(xù)進行51%攻擊,以一堆垃圾交易來逆轉交易過程,那么系統(tǒng)將無法記錄任何一個人的支付歷史。)
但這還不算是所有問題中最嚴重的一個:為了破壞區(qū)塊鏈生態(tài)系統(tǒng),一個參與者仍然需要花費大量的電力,以盡可能快的速度挖掘比特幣從而獲取利潤。而且,誰想要阻止這種情況(想想其他強大的競爭對手),誰就無法逃脫懲罰,然而值得慶幸的是,一個礦工的耗電量很難在區(qū)塊鏈的所有電力加和中占到51%。
來源: CertiK





