不難看出,與中心式網(wǎng)絡(luò)強(qiáng)調(diào)的保密性不同,分布式網(wǎng)絡(luò)安全的關(guān)鍵在于公開性,所有信息都公布出來,接受公眾的監(jiān)督和審核。不過這種“民主模式”也有一個弊端,那就是會有人注冊大量“僵尸賬戶”并利用虛擬IP操縱這些賬戶投自己的贊成票,從而讓虛假的交易記錄通過審核,實(shí)現(xiàn)網(wǎng)絡(luò)攻擊的目的。只要操縱的僵尸賬戶的數(shù)量超過投票節(jié)點(diǎn)總數(shù)的51%,攻擊就可以成功,因此這種攻擊被稱作“51%攻擊”。51%攻擊不僅可以用于發(fā)布錯誤交易信息,還可以用于修改歷史交易記錄牟利。如何防范51%攻擊,并保證歷史交易記錄不能被輕易篡改,正是區(qū)塊鏈技術(shù)的設(shè)計(jì)初衷。下面,我們就來介紹一點(diǎn)技術(shù)背景。
技術(shù)背景:Hash算法 Hash算法是一種加密算法,是區(qū)塊鏈技術(shù)的基礎(chǔ)。所謂Hash,就是指對原始信息進(jìn)行特定的轉(zhuǎn)換運(yùn)算,換算成對應(yīng)的加密值(稱作Hash值)。如下圖所示,一段文字經(jīng)過Hash以后被轉(zhuǎn)化成沒人能認(rèn)識的字符串。 Hash算法有一系列特殊性質(zhì),下面我們集中介紹一下: 等長性:不管原始信息多長或者多短, 計(jì)算出來的hash值具有固定的長度。 單向性:由原文獲得Hash值很容易,但是根據(jù)Hash值推測原文是不可能的。 確定性:同一個原始信息用相同的Hash算法永遠(yuǎn)得到同一個hash值。 分散性:原始信息的微小改動(即使只改動一個比特),就會導(dǎo)致hash值面目全非。
Hash算法的上述特性使它特別適合做真實(shí)性審核的用途。例如,你有一本100萬字的小說要通過電子郵件發(fā)給出版社。那么怎么保證在發(fā)送過程中沒有被篡改呢?如果采用逐字對照的方法可能要讀一個月,還可能出錯。這時就可以采用Hash的辦法。首先把小說文本做Hash,得到一個hash值。然后把原文發(fā)送給出版社的同時把hash值也加密發(fā)過去。出版社收到后,通過解密得到你發(fā)過去的hash值,然后在把小說原文用同樣的hash算法得到一個hash值。只要把它和你發(fā)過去的hash值對比,就可以知道原文有沒有變動,因?yàn)橥瑯拥脑牡玫降膆ash值永遠(yuǎn)是相同的(確定性)。如果原文哪怕只被改動了一個字,這兩個hash值就完全對應(yīng)不上了(分散性)。Hash值通常很短,一般是200多個字節(jié)或500多個字節(jié)。即使原文有100萬字,得到的hash值也是同樣的長度(等長性),很方便比對。而且攻擊者不能通過hash值來推測原文的內(nèi)容(單向性),因此在傳輸?shù)倪^程中也是很安全的。這就是所謂的“數(shù)字簽名”。
Hash算法的這些優(yōu)良特性也可以被用在分布式系統(tǒng)中,下面就介紹區(qū)塊鏈中的hash算法應(yīng)用。首先我們先談一談什么叫區(qū)塊。區(qū)塊鏈的英文名叫Blockchain,其中chain是鏈的意思,bolck有街區(qū)的意思也有模塊的意思,這可能是為什么它被譯作區(qū)塊的原因。但是母星哥認(rèn)為,“區(qū)塊”中的“區(qū)”字純屬畫蛇添足,因?yàn)樵谶@里,block一詞完全沒有和區(qū)域、位置相關(guān)的意思,它只是模塊的意思??赡芊g成“模塊鏈”或者“數(shù)據(jù)塊鏈”更合適。其實(shí)一個區(qū)塊(block)就是一個單獨(dú)的數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)塊),而區(qū)塊鏈則是把這些數(shù)據(jù)塊通過hash算法鏈接起來。下圖就是比特幣所使用的區(qū)塊鏈的結(jié)構(gòu)示意圖。
區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu) 圖中共有三個區(qū)塊。每個區(qū)塊大體上包含三個部分:1,最下面的“Merkle tree”存的是交易記錄,至于Merkle tree到底是什么這里就不展開講了,總之它是一個非常高效的存儲交易記錄的形式,是一個區(qū)塊內(nèi)容的主體。2,左邊的“Prev hash”指的是“前一個區(qū)塊的hash值”,也就是把上一個區(qū)塊的整體做hash運(yùn)算,得到的值存在這里(這是“鏈”的關(guān)鍵)。3,是“Nonce”,這個是與比特幣挖礦有關(guān)的,稍后細(xì)說。
交易記錄大家都知道是什么,就是我們需要保護(hù)的內(nèi)容。而第二部分“Prev hash”是區(qū)塊鏈技術(shù)的核心。我們可以從圖中看到,鏈條就是這么形成的:前一個區(qū)塊的hash值是下一個區(qū)塊的一部分,而下一個區(qū)塊的hash值是下下個區(qū)塊的一部分。以此類推,所有區(qū)塊串成一個鏈條,就是“區(qū)塊鏈”了。這種鏈條式的設(shè)計(jì)使修改歷史記錄變得極為困難。試想如果一個攻擊者想篡改一個歷史區(qū)塊,由上文“hash的分散性”可知,這個區(qū)塊的hash值會變得面目全非。而這個hash值又是下一個區(qū)塊的一部分,也就是說,下一個區(qū)塊的內(nèi)容也被篡改了,這又導(dǎo)致下一個區(qū)塊的hash值面目全非,而這又影響到下下個區(qū)塊。也就是說,對一個歷史區(qū)塊的篡改會形成連鎖反應(yīng),波及其后的所有區(qū)塊,“動靜非常大”。這使得篡改歷史記錄變得幾乎不可能。
也許有的朋友會說:“那我在生成新區(qū)塊的時候做手腳不久得了?反正新區(qū)塊在被后來的區(qū)塊埋起來之前是脆弱的?!闭\然,新區(qū)塊比老區(qū)塊要脆弱一些,但是還是有一些手段可以增加新區(qū)塊的安全性,例如比特幣的發(fā)明者中本聰就引入了一種叫“挖礦”的機(jī)制。
挖礦挖的是什么 “挖礦”的學(xué)名叫“工作量證明”。以比特幣為例,新區(qū)塊的生成過程是這樣的:任何節(jié)點(diǎn)都有權(quán)收集最新的交易記錄放到一個區(qū)塊中,然后把這個區(qū)塊提交投票審核。如果有惡意的攻擊者沒有收集真實(shí)的交易信息,而是偽造交易記錄生成一個假的區(qū)塊,然后再發(fā)動虛擬IP進(jìn)行51%攻擊,那么就有可能生成一個虛假區(qū)塊。為了避免這種情況發(fā)生,比特幣的協(xié)議要求,生成一個區(qū)塊之前,要完成一定量的比較耗費(fèi)CPU的工作量,這樣就可以讓攻擊者的速度減慢。只要網(wǎng)絡(luò)中的大部分計(jì)算能力都是誠實(shí)的,最終真實(shí)區(qū)塊鏈的發(fā)展速度就會超過虛假區(qū)塊鏈并占據(jù)上風(fēng)。
而這個工作量證明的任務(wù)需要有如下特征: 1.完成困難(只有這樣才能起到拖垮惡意區(qū)塊的作用)。 2.驗(yàn)證容易(任何一個網(wǎng)絡(luò)節(jié)點(diǎn)都可以輕松審核)。 3.難度可調(diào)(可以根據(jù)網(wǎng)絡(luò)計(jì)算力靈活調(diào)整難度,保持系統(tǒng)節(jié)奏感)。
這也就是上文提到的“Nonce”發(fā)揮作用的地方。在比特幣中,工作量認(rèn)證的任務(wù)就是尋找合適的nonce。所謂nonce,其實(shí)就是一個沒有什么實(shí)際含義的很大的數(shù)字。它的唯一功能就是改變所在區(qū)塊的hash值。由于Nonce是hash的一部分,nonce改變了,這個區(qū)塊就改變了,區(qū)塊的hash值自然也會改變。在比特幣中,要想生成一個有效的區(qū)塊,必須找到一個合適的nonce,使得這個區(qū)塊的hash值的前n位是零(n的值可變,用于調(diào)整難度)。
由于hash值是不可預(yù)測的(分散性),唯一的找到nonce的方法就是暴力破解,也就是一個一個試。這個過程是很耗CPU的(見上圖,經(jīng)過4000多次嘗試以后,最后一行才找到了“0000”開頭的hash值)。而通過調(diào)整需要的首位0的個數(shù),可以輕松調(diào)整任務(wù)難度。而且,驗(yàn)證過程很容易,只需要對區(qū)塊取hash就可以了。所以這個方法是符合前文說的三點(diǎn)要求的。
那么現(xiàn)在我們就總結(jié)一下區(qū)塊鏈的工作流程(如下圖所示)。1,首先兩個人交易形成交易記錄。2,網(wǎng)絡(luò)上的任何一臺電腦(節(jié)點(diǎn))都可以將這個交易記錄被收集到一個區(qū)塊的數(shù)據(jù)結(jié)構(gòu)中,并且尋找與之匹配的nonce值,以使整個區(qū)塊的hash值由若干個0開頭(挖礦)3,哪臺電腦最先找到這個nonce,也就最先制造了這個區(qū)塊,他就把這個區(qū)塊廣播到網(wǎng)絡(luò)中交給所有其余節(jié)點(diǎn)投票。4,每個節(jié)點(diǎn)都會審核交易記錄是否準(zhǔn)確、nonce值是否有效等,如果一切沒有問題,就投贊成票,如果多數(shù)節(jié)點(diǎn)都投贊成票共識就達(dá)成了。5,達(dá)成共識后,這個新區(qū)塊被加到區(qū)塊鏈中。6,交易完成。
需要提到的是,區(qū)塊鏈?zhǔn)强赡芊植娴?。不過最后只能以最長的分支為準(zhǔn)。就算有攻擊者成功地生成了一個假區(qū)塊,大多數(shù)誠實(shí)的節(jié)點(diǎn)也會重新建立一個真實(shí)的區(qū)塊鏈分支并且不斷給它添磚加瓦,很快那個假區(qū)塊分支就會被超越進(jìn)而被拋棄。
如果一個攻擊者想篡改某個區(qū)塊,他就必然改動其后所有區(qū)塊的hash值,這就導(dǎo)致后續(xù)所有區(qū)塊的nonce無效,那么他就必須給后面所有的區(qū)塊重新挖礦。當(dāng)然,這是個不可能完成的任務(wù)。這就是區(qū)塊鏈的安全機(jī)制。
為了獎勵這些辛勤勞作尋找nonce,并維護(hù)區(qū)塊鏈的節(jié)點(diǎn),每形成一個有效的新區(qū)塊,就會給成功找到nonce的用戶發(fā)放一定量的比特幣。這就是挖礦所得,而尋找nonce并獲得獎勵的工作,就被形象地稱作挖礦。下圖介紹了一些挖礦的基本事實(shí)。
隱憂:浪費(fèi)與壟斷 比特幣問世以來,被證明確實(shí)通過區(qū)塊鏈技術(shù)實(shí)現(xiàn)了分布式網(wǎng)絡(luò)中的信息安全,可謂一個創(chuàng)舉。不過它的設(shè)計(jì)中也存在不小的問題,主要就是浪費(fèi)和壟斷問題,而這兩個問題都源于挖礦的獎勵機(jī)制。
首先說浪費(fèi),為了獲得挖礦利益,越來越多的計(jì)算能力被投入到挖礦中,而計(jì)算能力越大,工作量認(rèn)證的難度也會相應(yīng)提高,這種水漲船高式的惡性循環(huán)導(dǎo)致從2010年到2017年的短短7年間,挖礦難度提高了10000億倍!高難度意味著高電費(fèi)。每年有大量電能被用于比特幣挖礦,但是激增的耗電量并沒有增加比特幣網(wǎng)絡(luò)的安全性,因?yàn)檫@些能量都被用于尋找具有開頭更多個0的hash值了。
隨著計(jì)算難度的激增,個人電腦挖礦已經(jīng)無利可圖,挖礦業(yè)務(wù)已經(jīng)被掌握在少數(shù)投入大量運(yùn)算設(shè)備的資本家手中。據(jù)紐約時報報道,目前比特幣網(wǎng)絡(luò)中超過70%的計(jì)算能力掌握在4家中國挖礦公司手中。這種現(xiàn)象已經(jīng)違背了比特幣“分散化”的初衷,計(jì)算力的集中導(dǎo)致話語權(quán)的集中,也增加了少數(shù)人或組織操縱整個系統(tǒng)的風(fēng)險。
區(qū)塊鏈的其他應(yīng)用 除了比特幣之類的虛擬貨幣以外,區(qū)塊鏈還有很多用途。普遍來講,只要需要真實(shí)性認(rèn)證的業(yè)務(wù)都可能用到區(qū)塊鏈。例如“透明捐助系統(tǒng)”。通過區(qū)塊鏈技術(shù),可以使一個公益項(xiàng)目中的所有捐助項(xiàng)目都公開,每個人都能追蹤自己捐獻(xiàn)的錢去了哪里,防止了公益組織的不透明問題。類似的,在眾籌、眾售領(lǐng)域也可以有同樣的應(yīng)用。此外,某些中央銀行也計(jì)劃通過引進(jìn)區(qū)塊鏈技術(shù)降低自己的信息系統(tǒng)的維護(hù)成本。
當(dāng)然,母星哥最感興趣的還是在社會結(jié)構(gòu)層面。眾所周知,目前任何一個社會的運(yùn)轉(zhuǎn)都離不開一個中心的管理者(ZF)來作為信用和安全的擔(dān)保,但是同時由于缺乏監(jiān)督也出現(xiàn)了不少的弊端。那么區(qū)塊鏈技術(shù)的出現(xiàn)有沒有可能塑造一種沒有權(quán)威的社會形態(tài)呢?每個人都是平等的,通過分布式網(wǎng)絡(luò)維護(hù)各自的信用和交易。在沒有高層管理者的情況下實(shí)現(xiàn)高效溝通,最終建成一個真正的自由人的聯(lián)合?這一前景能否實(shí)現(xiàn),請大家一起探討。
|