Image Courtesy: Medium
好了,讓我們想象一下,有一群拜占庭將軍想要攻打一座城市,他們將面臨兩個不同的問題:
為了讓合作成功,位于城堡左邊的軍隊派遣一位信使,向城堡右邊的軍隊發送了一則內容為“周三攻擊”的信息。
然而,假設右邊的軍隊沒有做好攻擊準備,并讓信使攜帶一則內容為“不,周五攻擊”的信息返回。
而信使需要通過穿越被攻打的城市返回到左邊的軍隊,那么,問題就來了。在這位可憐的信使身上,很多事情都有可能會發生。
例如,他有可能被抓獲、泄露信息、或被攻打的城市殺害后將其替換了。
這將導致軍隊獲得被篡改過的信息,從而使作戰計劃無法達成一致而失敗。
上述例子對區塊鏈有明顯借鑒意義。區塊鏈是一個巨型網絡,你要如何信任他們呢?如果你想從錢包里發送4個以太幣給某人,你如何確認網絡中的某人不會篡改信息,將4個以太幣改成40個?
中本聰發明了工作量證明機制來繞過拜占庭將軍問題。
其運行原理是:假設左邊的軍隊想要發送內容為“周一進攻”的信息給右邊的軍隊,他們需要執行如下步驟:
首先,他們會給初始文本添加一個“nonce”,這個nonce可以是任何一個隨機十六進制值。
其次,他們將添加了“nonce”的文本進行哈希,得到一個結果。假設說他們決定僅當哈希結果前5位是零的時候,才進行信息共享。
如果哈希結果滿足條件,他們就會讓信使帶著有哈希結果的信息出發。否則,他們會持續隨機改變nonce的值,直到得到想要的結果。這一過程不僅冗長耗時,且占用大量的算力。
如果敵人抓到了信使,并企圖篡改信息,那么根據哈希函數的特性,哈希結果將會劇烈變化。如果城市右邊的將軍看到信息沒有以規定數量的0作為開頭,那么他們就會叫停攻擊。
然而,這里有可能有個漏洞。
哈希函數并不是100%免碰撞的。那么,如果城市中的敵人拿到信息之后將之篡改,并通過不斷改變nonce值,獲得了以規定數量的0作為開頭的結果,那該怎么辦?
雖然極度耗時,但是仍然可行。針對這種情況,將軍們可以使用數字的力量。
假設,如果不是1個左邊的將軍給1個右邊的將軍發送信息,而是有3個左邊的將軍來給右邊的將軍們發送信息。
為了實現上述目的,他們可以制作自己的信息,然后對累積的信息進行哈希。
緊接著,再給哈希結果添加nonce值后,再次進行哈希。這次,他們希望產生一個以6個0開頭的信息。
顯而易見,這將會非常耗時。但這次,如果信使被城市抓獲,那么敵人想要篡改信息,并且找到符合結果的nonce值,將會耗費無限長的時間,可能歷時數年。
例如,將軍們派遣多個信使,那么,城市在計算到一半的過程中就可能會遭受攻擊并且被摧毀。
右邊的將軍們要做的非常簡單。他們只要將之前給他們的正確的nonce值添加在信息上,并進行哈希,然后對照其結果是否匹配即可。
對一個字符串進行哈希是非常容易的。那么,從本質上來說,工作量證明的過程是:
零知識證明
什么是零知識證明(Zero Knowledge Proof, ZKP)?ZKP意味著A可以向B證明,他知道特定的信息,而不必告訴對方自己具體知道些什么。
在這個例子中,A是證明者,B是驗證者。在密碼學中,這尤為有用,因為這將為證明者提供一層額外的隱私保護。
運行一個ZKP,要滿足以下這些參數:
完整性:如果陳述屬實,那么誠實的驗證者能被誠實的證明者說服。
可靠性:如果證明者不誠實,他們無法通過說謊來說服驗證者相信陳述是可靠的。
零知識:如果陳述屬實,那么驗證者無法得知陳述的內容是什么。
舉一個零知識證明的例子。讓我們觀察一下阿里巴巴洞穴是如何運作的。
在這個例子中,證明者(P)對驗證者(V)說,他知道洞穴后面暗門的密碼,并提出在不向驗證者透露密碼的情況下證明此事。那么,其驗證過程如下圖所示: