區塊鏈是如何解決信任問題的?
謝邀,我是鐵哥燉,互聯網人,碼字不易,歡迎您的點贊和關注!
信任的問題,是一個永恒的話題,自古以來建立信任都是有成本的。
春秋戰國時,秦國商鞅變法。當時戰爭頻繁、人心惶惶之際,為了樹立威信,推進改革,商鞅下令在都城南門外立一根木頭,并當眾許下諾言,誰能把這根木頭搬到北門,賞金十兩。
圍觀的人不相信如此輕而易舉的事能得到如此高的賞賜,結果沒人肯出手一試。于是,商鞅將賞金提高到五十金。重賞之下必有勇夫,終于有人站了出來把木頭扛到了北門,商鞅當即賞了他五十金。
商鞅這一舉動,得到了人民的信任,變法就很快在秦國順暢推廣,變法也使得秦國慢慢變得強盛,最終統一中國。
上面那個小故事就是城門立木的典故,要想回答「區塊鏈是如何解決信任的」,首先我們也要先從一個1000年前中世紀土耳其的一個故事說起。
一、從一個小故事說起拜占庭將軍問題(Byzantine Generals Problem),由萊斯利·蘭伯特(Leslie Lamport)在1982年首次提出,成為了困擾了計算機科學家們數十年的難題。
故事模型很簡單:
拜占庭帝國(中世紀時期的土耳其)擁有巨大的財富,周圍10個鄰邦垂涎拜占庭帝國的財富已久。但拜占庭固若金湯,任何一個單獨的鄰邦都不能夠成功攻占拜占庭。
在這種情況下,由于拜占庭帝國國力強盛,10個鄰邦中,至少要有一半以上的鄰邦同時進攻,才有可能攻破。
如果幾個鄰邦本身約定好某一時間進攻,但進攻期間出現背叛者(Traitor),那么進攻將會失敗。
每一個鄰邦在協商發起進攻的時候都小心翼翼,不敢輕易的相信其他鄰邦,因為自己出了兵,鄰國使詐不僅自己的兵力遭受損失,還會把自己的國家暴露在巨大的風險之中。
這個小故事就延伸出,一個信任無法解決的問題。在進攻拜占庭這件事情上,對各鄰邦來說最重要的議題是:將軍們如何在非信任環境中建立共識,讓所有忠誠的將軍統一行動計劃集體進攻拜占庭帝國。
二、達成共識的解決方案——引入記賬成本在達成共識的過程中,在10個將軍里面可能出現背叛者導致任務失敗:
(1)背叛者慫恿忠誠者采取不良計劃。
(2)忠誠者的數量小于2/3,拜占庭問題不可解。
(3)背叛者可能欺騙其他人自己會采取進攻行動(實際不會進攻)。
(4)10個將軍中同時發起進攻信息,造成整個通信系統的混亂,各說各的攻擊時間方案,行動無法達到一致。
如果任何人都可以隨時發起進攻信息,大家自說自話,整個通訊體系就癱瘓了。那么如何決定某個時間點信息由誰來發出呢?
比特幣的創始人中本聰在通訊系統加入了發送信息的成本:一段時間內只有一個節點可以傳播信息(記賬)。
這個記賬的成本就是「工作量」——鄰邦國(節點)必須率先做一道很難的數學題(率先完成計算工作)才能向其他鄰邦傳播消息(獲得記賬權),這個很難的數學題是絕對公平的,大家一起算,只能一個數一個數窮舉試錯,完全隨機的,看誰先窮舉出來。
誰先算出答案(第一個完成計算工作),誰就能先獲得傳播進攻消息的權利(獲得記賬權)。只有隨機才是真正的公平,實現隨機的最好辦法是使用數學,所有的將軍在尋找共識的過程,借助了大家都認可的數學邏輯。
在分布式網絡里,區塊鏈上的共識機制主要解決由誰來構造區塊,以及如何維護區塊鏈唯一性的問題。
拜占庭將軍容錯問題需要解決的也同樣是誰來發起信息,如何實現信息的統一同步的問題。
基于區塊鏈技術,通過使用消息加密技術、以及公平的工作量證明機制,創建了所有鄰邦都認可協商方案的通訊協議,這套共識協議的出現,使得拜占庭將軍信任問題得到完美的解決。
三、保證信息傳輸的可信——非對稱加密解決了某一時間由誰發的問題,那么怎么確定發信人的身份不是被偽造呢?
當某個鄰邦發出自己認可的進攻信息后,其他鄰邦收到發起者的消息必須簽名蓋章,確認各自的身份。中本聰在這里引用非對稱加密技術為這個信息簽名。
非對稱加密算法的加密和解密使用不同的兩個密鑰.這兩個密鑰就是我們經常聽到的”公開密鑰”(公鑰)和”私有密鑰”(私鑰)。非對稱加密的作用是:保護消息內容, 并并且讓消息接收方確定發送方的身份。
公鑰和私鑰一般成對出現, 如果消息使用公鑰加密,那么需要該公鑰對應的私鑰才能解密; 同樣,如果消息使用私鑰加密,那么需要該私鑰對應的公鑰才能解密。
比如,將軍A想給將軍B發送消息,為防止消息泄露,將軍A只需要使用B的公鑰對信息加密,而B的公鑰是公開的,B只需要用只有他自己只的私鑰解密即可。
將軍B想要在信件上聲明自己的身份,他可以自己寫一段“簽名文本”,并用私鑰簽名,并廣播出去,所有人可以根據B的公鑰來驗證該簽名,確定的B的身份。
通過這種方式,一個不可信的分布式網絡變成了一個可信的網絡,所有的參與者可以在某件事在達成一致并提供了以下幾點保證:
(1)信息傳送的私密性 ;
(2)能夠確認簽名的真實性;
(3)簽名不可偽造、篡改 。
(4)PoW驗證者可以快速檢驗工作量是否達標。
四、工作量證明PoW建立信任是有成本的,我們也就能明白比特幣通過區塊鏈這個技術進行工作量證明PoW(Proof of Work)的意義。
在1999年,Markus Jakobsson和Ari Juels兩人將PoW概念引入用以抵擋DDOS攻擊和反垃圾郵件。PoW設計原理是一個正常用戶寫一封郵件是需要一定的時間,工作量證明能夠使垃圾郵件發送者需要更多的時間來發送郵件(相當于計算機每算完成一道題,才能發送郵件),就可以通過增大大量發送垃圾數據的成本,來提高發送垃圾郵件者的機會成本,從而抵擋攻擊。
區塊鏈技術中的PoW工作量證明過程,就是「挖礦」。表面上來看花費電力「挖礦」不產生實際價值,浪費了社會資源。但是「挖礦」是維護比特幣網絡可靠性和達成共識的非常高效且靠譜的辦法。通過競爭記賬方式解決去中心化的賬本一致性,用工作量證明PoW的機制來實現競爭結果判定。工作量證明完成后,產生新的區塊。當新區塊在網絡中傳播時,每個節點廣播到其他節點。
工作量證明步驟如下:
1. 構建區塊,把將要寫入區塊交易信息組成交易列表,通過Merkle樹算法把交易列表信息生成Merkle根哈希。
2. 組裝成區塊頭,把區塊頭80字節數據作為數據輸入。
3.窮舉區塊頭的隨機數:nonce的數值,變更nonce后把區塊頭不斷采用兩次SHA256運算。與目標值做對比,如果小于目標值(結果前面有更多的0),則找到我們所需的隨機數,工作量被證明是有效的。
在分布式網絡中的任何一個節點,如果想生成新的區塊并寫入區塊鏈,必須解出特定要求的PoW題目。解出題目關鍵3個要素是:工作證明函數、區塊和難度值。
五、工作量函數,區塊和難度值(本小節枯燥,可跳過從第六標題開始閱讀)
比特幣使用SHA256作為工作量證明函數。SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要長度為256bits,故稱SHA256,比特幣挖礦算法中使用的哈希算法是SHA2-256。
區塊決定輸入數據,因為使用區塊頭作為工作量證明輸入數據。在挖礦過程中,礦機把比特幣的80個字節長度的區塊頭數據做兩次SHA256運算。哈希運算結果要滿足前n位均為0要求,區塊頭的詳細情況請見下圖。
在構造區塊過程中,需要將該區塊要含有的交易信息列表,通過Merkle樹訴算法生成哈希值,把它作為區塊頭Merkle根的值。
Merkle樹是完全二叉樹,通過哈希值的計算,將這棵二叉樹轉化為Merkle樹。
上圖示例中四個交易分別計算各自哈希值進行運算,得出Merkle樹根。
現在區塊頭能有確定值的字段分別是:版本、父區塊哈希值、Merkle根、時間戳。Nonce是用于工作量證明計數器,需要不斷運算,是變量。
難度值決定大約需要經過多少次哈希運算產生一個合法區塊。在全網算力不斷變化,維持平均10分鐘出一個區塊,難度值必須根據全網算力的變化進行調整。
難度調整是每個完整節點中獨立自動發生。每2016個區塊,所有節點都會按統一公式自動調整難度,調整公式:
新難度值=舊難度值*(過去2016個區塊花費時長/20160分鐘)
工作量計算有一個目標值:
目標值=最大目標值/難度值。
最大目標值是恒定的:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目標值的大小與難度值成反比,比特幣工作量證明要求礦工計算出來哈希值必須小于目標值,也即:哈希運算結果中前n位數為0的數目n要大于等于目標值的前幾位為0的數目,這樣運算結果才比目標結果要小。
所需的為0的n值位數越多,需要運算量就越大。運算結果就是一個256位(32字節)長度的字符串,通過比較與當前難度值的大小判斷當前區塊是否合法。
六、解決沖突,免得扯皮——時間戳,最長鏈原則和獎勵在拜占庭進攻的例子中,如果不同的鄰邦分別先后解出了題算出了答案,各自先后向分布式網絡發布自己算出來的消息,造成消息混亂,怎么辦?
只有時間最早的發起者才是有效的。比特幣中,通過時間戳,為每個鄰邦在解題完成的時間(出塊時間)蓋上時間印章。
就算兩個挖礦的人同時挖出區塊的可能(由于隨機數的影響和網絡的延時),這種情況也是時有發生的,如果他們一起記賬就會造成區塊鏈的分叉。
此時,系統就會根據最長鏈原則進行取舍,即哪個新產生的區塊能使其所在的區塊鏈變得更長,則哪個區塊得以被記錄。在這個博弈中,所有礦工的最優選擇是:在最長鏈上挖礦,維護區塊鏈賬本的唯一性。
各個鄰邦憑什么要一起耗時耗力的做工作量證明呢?中本聰設置了一個獎勵機制,比特幣的獎勵機制是每解鎖一個新塊,目前是獎勵12.5個比特幣。正因為因為有比特幣的獎勵,所以礦工們都會爭奪每十分鐘一次的記賬權。
在拜占庭將軍問題中,獎勵的就可以是瓜分拜占庭帝國的財富。
根據每產出21萬個區塊新比特幣獎勵就會減半的規則,下一次減半預計將發生在2020年5月。
七、出現背叛者怎么辦如果出現背叛者怎么辦?
區塊鏈中的節點,其中包括誠實節點和惡意的節點,就如何寫入一個區塊達成共識。PoW的容錯性是50%,也就是說只要超過一半的節點是誠實的,就可以保證區塊鏈數據的有效性。
歷史上其他種類數字貨幣(BTG,騙得將近2000萬美金)已經出現過通過51%攻擊進行雙花交易。「雙花攻擊」(double spend attack)就是一筆資金,通過某種方式被花費了兩次。
怎么實現的呢?
根據前面說到的最長鏈原則,節點會認可并在此基礎上繼續延長當前最長鏈。
如果當攻擊者擁有超過全網50%算力(實際操盤中甚至不需要嚴格超過50%),就可以選擇先把自己手中囤積的大量數字貨幣售出并提現,這時候這筆交易已經寫入區塊鏈的“主鏈A”中。
攻擊者在確認售出的數字貨幣提現成功后,馬上在交易前的起始節點重新開一個分叉,分叉的交易信息是自己轉給自己同伙張三(不轉給原來的打款人)。由于自身算力超過全網算力的50%,假以時日,總能夠將自己分叉的鏈變為最長的鏈進而成為“主鏈B”(最長鏈原則)。成功把虛假的交易寫“主鏈B”中。
通過這種方式,“主鏈B”成為大家認可的“最長鏈”,不僅2000萬美金現金到手,原來的數字貨幣也回到了自己賬戶中。這種雙花攻擊,越小算力的盤,越容易實施。
雖說如此,在比特幣范疇內來講,雙花交易進行欺騙幾乎是不可能的。首先,「掌控比特幣50%算力」這件事情十分困難,個人或者企業的財力完全無法支付的起如此大的算力成本。而且即便掌握了這么大的算力,你會發現,用如此大的算力挖礦賺取收益,比雙花的收益還要高很多,這就進一步加大了雙花交易的機會成本。
最后大家都老老實實的,去做一個誠實的節點,讓整個分布式網絡,都成為一個可信的網絡,通過這種方式,區塊鏈的信任,也就建立完成了!