您當前的位置:首頁 > 寵物

工作量證明

作者:由 Peter 王廣忠 發表于 寵物時間:2018-08-22

工作量證明

https://www。zhihu。com/video/1015650184059064320

比特幣系統有一個眾所周知的特點,就是很多礦工參與挖礦,但是每十分鐘網路上產生的比特幣卻不是給所有礦工均分的,而是誰搶到記賬權,就把所有的比特幣獎勵給誰。而搶到記賬權需要的是進行運算能力的比拼,也就是說哪個礦工的機器速度更快,那他就更有可能跑贏這次算力賽跑,從而拿到記賬權。本節我們就一起探索一下這個賽跑背後的 POW 機制。換句話說,就是看看大家是怎麼知道哪臺計算機的運算能力是最強的。

POW 本意

POW 這個概念是1993年的時候提出的,要比比特幣出現得早。最早的用途也不是實現加密貨幣的,而是用來防止垃圾郵件。所以我們先說說 POW 自身的基本含義。

POW ,英文全稱是 Proof of Work ,直接翻譯過來是工作量證明

。這個詞的中文直接聽起來有點不知所云。實際上如果我跟你說結婚證明,離職證明,那你是不是首先想到的是一張上面印著一些東西的紙呢?別人看到這張紙就知道你的確結婚了,或者你的確從某單位離職了。工作量證明從語法上也是一個邏輯,也可以理解成一張紙,透過這張紙就可以證明你的確完成了一定量的工作。這就是工作量證明的字面意思。

那工作量證明有什麼特點呢?我們拋開計算機,用現實世界的例子來說明。例如我上課不認真,老師罰我把《桃花源記》抄寫十遍,我用了兩個小時的勞動,最後給老師的就是一張紙,而老師要確認我的確付出了大量勞動,其實只需要看一眼就可以了。這個例子道出了

POW 機制的一大特點,那就是生成需要花費大量勞動,但是驗證只需一瞬間

。另外一個工作量證明的例子可以是,老師給我出一道題,我給老師的運算結果,或者說就是最後的那個數字,就是我的工作量證明。回到計算機情形下,紙當然是不存在的,所以所謂的工作量證明就是花費了很多勞動而得到的一個數了。

再說說 POW 最早的用途。人們在使用電子郵件的時候會收到垃圾郵件的騷擾。如果沒有成本,那麼傳送一百萬封郵件的確是很輕鬆的事情了。所以,聰明的人就會想,如果讓每一封郵件傳送時候,都有一個微小的成本,那麼垃圾郵件就會被很大程度的遏制了。而 POW 就是為了服務這個目的產生的。基本過程就是郵件接收方會先廣播一道題出去,郵件傳送方發郵件的時候必須附帶上這道題的答案,這樣郵件才會被接受,否則就會被認為是垃圾郵件。

這樣我們就理解了 POW 的最基本的含義了。

雜湊函式

但是我們知道,計算機解題速度很快,人類覺得很難的題,計算機根本就不用花什麼時間就能給出答案。所以什麼樣的題才能讓計算機形成工作壓力呢?這就要說到雜湊函數了。

雜湊函式,也有人翻譯為雜湊函式,是一個公開的演算法。輸入可以是任意長度的資料,演算法拿到輸入之後,把資料拆散,然後重新排列,得到的輸出是一個位數固定的數字,這個數字就叫做雜湊值,簡稱雜湊。

雜湊函式最大的特點是,如果輸入的資料不同,哪怕只有一個微小的差異,那麼輸出結果也會看起來完全不同

。這個特點保證了,根據輸出結果去反向運算輸入是不可能的,甚至也沒有辦法去縮小輸入的可能值範圍。另一方面,如果輸入相同,那麼運算得到的雜湊也一定相同。這一點保證了任何人都可以在一瞬間內驗證最終的雜湊值是否正確。

雜湊函式的這些特點,決定了很多場合下都可能用到雜湊。例如可以用雜湊值作為一個數據指紋,給定一個確定的雜湊,就可以判定原來的資料有沒有被篡改過。不過,這些其他用途都不是這次要關心的,我們重點來看看雜湊在 POW 機制下的作用,或者說就是如何用雜湊函式來給計算機出題。

比特幣中的 POW

比特幣的 POW 機制,宏觀上要達成的就是判定哪個礦工的運算能力最強。系統會給所有的礦工出一道題,哪個礦工最早提交答案,也就是提交 POW,系統就可以判定這個礦工的算力是最強的,就會把記賬權給他。

這道題用到了雜湊函式,但是非常有意思的是,系統要的答題結果,也就是所謂的 POW,不是雜湊函式的輸出,而是輸入。因為要從輸入算輸出,這是一個非常直白的過程,計算機很快就會完成,同時出題的時候也需要給全網廣播一個超級大的資料,考慮到網速,這樣顯然是不可行的。所以

比特幣系統的做法是反過來,給全網廣播一個雜湊值,讓大家去找到它的輸入

。因為雜湊函式本身其實是不能進行反向運算的,所以如果礦工們要去得到輸入,唯一的做法就是去瞎蒙,類似於去擲骰子,每次選一個數,運算它的輸出是否符合系統給的雜湊值。如果不是,就換下一個數再試。最終誰能找到這個輸入,顯然是一個機率問題,但是

哪個礦工的運算能力強,也就意味著單位時間內他擲骰子的次數就多,所以大機率上肯定是他會首先拿到正確的輸入。這就是運算 POW 的基本原理了。

當然實際中,比特幣系統是每十分鐘會記賬一次,也就需要大家每十分鐘就比一次。而十分鐘之內想要給定一個精確的雜湊值,讓大家拿到輸入,是根本不可能的。所以其實每次系統給定的是一個雜湊值範圍。

具體規則就是,只要可以保證運算出的雜湊值小於某個特定數值,就認為提交的 POW 是正確的

。這也就意味著,礦工要去拼命找到一個輸入,讓它對應的雜湊值的前面幾位都是0,因為0越多,數值就越小。同時,系統如果要求的0越多,那麼對應的運算難度就會越大。比特幣礦工們的算力多年來提高了很多,但是為何比特幣系統還是能保證算出 POW 的時間大致保證在十分鐘左右呢?秘密就是系統可以透過調整0的個數,來改變出題難度,算力高,但是題變難,所以需要花費的解題時間就會保持相對穩定。

礦工得到結果之後,會把自己的結果提交給全網,因為雜湊函式的特點,每個礦工都會很容易的驗證這個結果是符合系統要求的,於是大家就會承認這個礦工搶到了記賬權。

這樣,我們就理解了比特幣系統是如何用 POW 機制,給礦工鋪開了一條算力賽跑的跑道了。

總結

這節中我們講 POW,介紹了 POW 的本意,雜湊演算法的特徵,最後介紹了比特幣系統中如何透過一個難度可控的反向雜湊運算的數學題,來判定哪個礦工的運算能力最強。這樣,對於 POW 機制,我們就有了比較清晰的瞭解。但是,站在更高的角度,比特幣如何透過 POW 機制來達成共識,進行防欺詐,似乎不是我們目前這些知識能夠充分解釋的,需要涉及到時間戳機制和最長鏈原則等更多的細節,Peter 會在後續內容中繼續為大家介紹,敬請關注。

標簽: 雜湊  pow  礦工  位元  運算