比特幣如何運作:哈希

散列函數是一種只能在一個方向上計算的函數 – 這種奇異的流量使得區塊鏈世界既清晰又安全。

這意味著如果我們給函數輸入,我們可以計算輸出,但是給定輸出,沒有可能的方法向後工作並找出輸入。(從這個意義上說,就像從私鑰獲取公鑰一樣。)

我們不會深入研究這背後的數學或它現在如何運作。所有必要的是你了解它的作用。再一次,只要把它想像成魔術,即使它是數學。

此外,我們可以選擇我們想要散列函數輸出的範圍。例如,我們可以使用0到9之間的所有數字(所以只有單個數字),0到99,0到100萬,甚至是0到894之間的任意數字。

為了說明這是如何工作的,讓我們假設我們的哈希函數的範圍是0到9.我們放入的任何東西都會給出一個這樣的數字:如果我們給它一個表情符號,它可能會給我們一個5.如果我們輸入7859它可能會回復3.如果我們輸入Moby Dick的整個文本,它可能會給我們7號。

0jEBLzvSdeSaMaIka

簡化的哈希過程

它總會給我們一個數字 – 但我們不知道為什麼

現在想像一下,我們用Moby Dick的整個文本提供它,但添加了一個額外的單詞。你可能會認為,由於這個輸入與我們輸入的最後一個輸入非常相似,它返回了數字7,這個輸入很可能也會返回7 – 但你會錯的。

儘管輸入非常相似,但這裡輸出中沒有可預測的相關性。絕對的不知情雲是阻止黑客攻擊的原因 – 知道輸出告訴你輸入可能是什麼。

在加密貨幣之外,散列函數用於在中心化Web伺服器上存儲密碼。但網路資料庫經常被黑客攻擊,如果黑客能夠在成功破解之後只讀取每個人的密碼,這對用戶來說就是壞消息。

為了使用戶更安全,幾乎所有現代網站都會在將用戶密碼存儲到資料庫之前對其進行哈希處理。因此,黑客無法通過讀取資料庫來弄清楚用戶的密碼是什麼,因為這意味著從輸出到輸入哈希函數 – 這是一個無法向後設計的極其複雜的代碼,這意味著什麼黑客讀取看起來就像一堆隨機數。

但是,每次用戶登錄時,伺服器都可以正確驗證他們是否提供了真正的密碼 – 伺服器獲取確切的密碼並再次哈希,並看到它與存儲在資料庫中的已經散列的結果相匹配。

通過這種方式,密碼本身就是關鍵 – 但獲取「哈希」密碼對於黑客來說是無用的,因為它無法倒退。

哈希猜測遊戲

在比特幣上,我們選擇獎勵向礦工發布塊的權利,礦工可以通過哈希函數運行他們提出的塊,並使輸出為某個範圍內的數字。

然後礦工必須以有序,格式化的方式格式化他們發布的數據 – 但是有一個地方允許他們放置少量無用的垃圾數據(稱為「nonce。」)這就像我們是舉辦一場比賽,我們告訴人們將一兩個gobbledegook隨機詞添加到Moby Dick的文本中並通過哈希函數運行它以嘗試將其輸出與某個特定的幻數相匹配。

基本上,我們正在嘗試反向 – 給定哈希輸出,礦工需要找到適當的輸入。

可是等等這不可能嗎?

排序:不可能的是以某種方式使用方法來推斷輸出的輸入。什麼可能是隨機猜測它。

讓我們回到我們的哈希函數示例,該函數吐出0到9之間的數字。想像一下,我們正在玩一個Moby Dick Hashing Challenge,如果你用幾句廢話哈希編輯Moby Dick,你可以獲得獎勵。這將是非常容易的,因為有人從任何給定輸入獲得3的機會是10分中的1分。他們只需要嘗試平均五個不同的輸入來贏得獎金。

儘可能快地將MacBook上的標準CPU插入到每秒哈希函數的88,000個猜測中,因此它實際上只需要一小部分時間就可以獲得答案。

比方說,如果有五十人全部使用MacBook來參加這項挑戰,並且你希望比賽持續大約一個小時,你可以將88,000乘以60秒乘以60分鐘,以獲得一個小時內可以做的猜測次數,然後乘以50乘以播放的人數。

因此,您的哈希函數必須具有更大的範圍:從0到(88000 * 60 * 60 * 50),範圍從0到15840000000。

要獲得獎勵,你必須猜對了。

請注意,比特幣使用非常大的數字作為散列函數的範圍,因此對於所有玩家來說,運行這個猜謎遊戲仍需要平均十分鐘 – 即使玩家增長。一旦有人贏了比賽,他們寫的新區塊就被認為是「已發布」。

隨著越來越多的電力投入到挖礦中,比特幣網路與它一起進行校準,並根據計算先前塊的時間長度動態地提高每個塊的「難度」。通過這樣做,我們顯然並不是說中心化來源決定這一點並告訴其他人該怎麼做。相反,每個礦工都在自己計算它。

比特幣越有價值,人們越想要它,範圍越大 – 確保「遊戲」保持平等和寬廣,即使更多的玩家加入。

現在,比特幣實際上並沒有調整散列函數的範圍來使挑戰變得更容易或更難,而是使用固定範圍:2到256的冪。然而在比特幣的挑戰版本中,礦工們並不競爭特定的數字,但他們的哈希函數的輸出只需要一定的截止下。

我們來解釋一下。

調整此截止值可以減少挑戰。例如,如果我們有一個範圍為一千萬到一千萬的哈希函數,我們可以將我們的截止值設置為「2」以使匹配的幾率為千萬 – 輸出必須等於「1」才能使礦工獲得贏得。或者我們可以將截止值設置為500萬,使得第一次嘗試獲得它的幾率達到50%。

在比特幣網路上,有人在第一次嘗試時解決挑戰的可能性總是非常小 – 遠遠小於千萬分之一 – 但考慮到計算能力的數量用於解決全世界的挑戰,有人仍然會在大約十分鐘內得到它。

想想看:有了足夠的刮刮票,你的個人獲勝幾率很低,即使你購買了數百張。但是,有了中獎票,有人必然會贏 – 而且這種保證和隨機性取代了中央權威。

將「鏈」放在區塊鏈中

一旦礦工成功解決了這個難題,會發生什麼?他們如何告訴網路的其他部分?所有用戶如何接受新塊作為規範?

簡而言之:在這場比賽中,我們如何最終創造一個確定的歷史以確保公平和清晰?

在這裡,我們將解釋一個非常優雅的設計方面,確保礦工最終只是為了自己的利益而避免雙重花費。

使這成為可能的好主意是:

  1. 每個塊必須包含前一個塊的哈希值
  2. 用戶被告知總是接受最長的有效塊鏈作為規範塊

0x06A64kZV4jPH31t

塊的特徵

總之,這些條件使得只要在網路上發布新的有效塊,礦工就必須拿起新的塊並將其放入鏈中 – 從頭開始​​完全挖礦新塊。

為什麼?

每個塊必須包含前一個塊的散列的事實確保了Blockchain不斷更新。

讓我們說這個鏈條目前長達五個街區(這將是比特幣創建後五十分鐘 – 一個街區十分鐘,還記得嗎?)這意味著我們正在嘗試製作第六個街區,而第六個街區的一部分是第五個塊的哈希值。

但是,讓我們說有人擊敗我們,並在我們做之前發布第六塊 – 現在我們正在嘗試製作第七塊,我們必須包括另一個人的第六塊的哈希,我們將無法使用知道它出版之前。我們不能繼續努力製造第六塊,因為我們浪費時間 – 人們已經接受了六個街區最長的鏈條 – 如果我們不趕時間,很快就會有第七個。

哎呀這意味著必須從頭開始我們創建下一個區塊的目標,如果我們希望它被接受並獲得獎勵。

關鍵點在於塊只對引用它之前的另一個塊有效。我們談到在「另一塊」之上「挖礦」,以確保堆疊到一個有凝聚力的未來。

如果兩個塊同時發布怎麼辦?礦工將挑選一個或另一個挖礦,並且稍微會有兩個競爭鏈。但在幾個街區內,一個將很快變得比另一個更長,並且該鏈將成為規範而另一個被放棄。

出於這個原因,建議用戶不要將付款視為最終確定,直到至少幾個街區為止。

現在我們可以看到雙重支出是不可能的:在「給定區塊之上」發布了幾個區塊後,該區塊中的交易實際上被「埋沒」 – 無法恢復並鎖定到支付歷史記錄中。

如果不撤消整個區塊鏈,就無法撤消它們。抱歉!

那麼,有人如何撤銷整個區塊鏈?這很難做到。事實上,如果你消耗的電量比其他所有人都多,那麼你只能勝過其他礦工。這被稱為51%的攻擊,因為我們需要控制51%的電力進入系統才能做到這一點。

這是比特幣的弱點,如果有的話。而且,只要這種情況沒有發生,系統就是安全的。

(這也是政府可能破壞比特幣網路的方式。如果一個演員經常有51%的攻擊來反轉歷史並用一堆垃圾交易代替它,那麼沒有人的付款最終被記錄下來,而且就像沒有任何東西一樣在比特幣網路中繼續前進 – 如果你是偏執狂的話就抬頭)

但這個問題並不是一個問題:為了擾亂生態系統,一個行動者(或政府)仍然需要花費儘可能多的電力,因為全世界來自世界各地的未經請求的志願者大量開採比特幣因為他們可以獲利。

並且,假設世界上任何其他人都希望阻止它(想想其他強大的,競爭的演員),他們就無法擺脫它。

那個演員需要區塊鏈網路中所有電力的51% – 這可能很難。

原文:https://medium.com/certik/how-bitcoin-works-hashing-e897157f7940

提示:投資有風險,入市需謹慎,本資訊不作為投資理財建議。請理性投資,切實提高風險防範意識;如有發現的違法犯罪線索,可積極向有關部門舉報反映。
你可能還喜歡