1. 程式人生 > >比特幣防篡改技術詳解

比特幣防篡改技術詳解

點的hash 區塊鏈 技術 mage 幣圈 大整數 挖礦 發放 做的

區塊鏈技術在當下的火爆程度不必多說,比特幣作為中本聰大神的“親兒子”,自然是研究區塊鏈技術繞不開的話題。比特幣是一個完全開放的去中心化的金融系統,時刻暴露在全球黑客攻擊之下仍能安全穩定的運行至今(除了在2010年遭到一次大整數溢出漏洞攻擊),用事實證明了比特幣系統的安全性和穩定性。這其中一整套完整的防篡改破壞的安全體系是其最大的安全報障,下面我們就來逐步揭開比特幣防篡改特性的面紗,體會一下比特幣設計的奧妙。

  1. 非對稱加密算法

首先我們先復習一下非對稱加密的概念:非對稱加密都有一對密鑰,分為公鑰和私鑰,兩者是一對一的關系。公鑰顧名思義是可以公開的密鑰,私鑰必須自身嚴格保存,一旦暴露就相當於銀行卡密碼被人知道一樣的可怕後果。

公私鑰有兩種用法:

一種是公鑰加密數據私鑰解密數據:Tom要給Jerry發信息,Jerry先將自己的公鑰發放給Tom,Tom通過Jerry的公鑰將明文數據加密成密文,只有Jerry相匹配的私鑰才能將密文解密成明文,即使有人截取了Jerry的公鑰,也只能用於給Jerry發送加密數據,在沒有獲得Jerry私鑰的情況下,依舊無法破解Tom和Jerry的通信密文。

技術分享圖片

圖01

另外一種用法是私鑰簽名公鑰驗簽:現在反過來Jerry要給Tom發信息,Jerry為了保證發送信息沒人篡改過,於是Jerry就用私鑰對明文數據生成了一個簽名(一串字符),將簽名和明文數據一起發送給Tom,Tom收到明文消息後,先用Jerry的公鑰驗證簽名是否正確,如果中途有人篡改信息,驗簽將無法通過,Tom就知道消息被中途篡改過。當然,我們可以讓Tom和Jerry相互交換各自的公鑰,這樣就可以對雙方通信時都既加密又驗簽,保證雙重的安全性。

技術分享圖片

圖02

目前我們常用的非對稱加密算法有RSA、ECC和國密SM2等算法。比特幣采用的是ECC橢圓曲線加密算法,用戶發起的每筆交易都需要自身的私鑰做簽名,每個參與記賬的節點都可以驗證交易是否正確並通過用戶的公鑰驗簽信息是否被篡改過。這就完成了比特幣防篡改的第一步--單筆交易防篡改。那麽為什麽交易信息不加密呢?那是因為每一個參與記賬的節點都需要驗證交易的正確性和完整性,目前比特幣參與記賬的節點超過40萬個,也就是需要用40萬個公鑰對交易加密40萬次,這個計算量和耗時都是不能承受的,而且會影響記賬節點的擴展性,所以目前比特幣系統中的所有交易都是明文的,但是匿名性彌補了安全方面的不足。當然,這方面的不足也有解決方案,請參考“零知識證明”、“同態加密”等相關知識,在此不做細述。

另外,因為比特幣交易的匿名性,私鑰簽名就成為了唯一的身份標識,如果私鑰丟失,就無法證明比特幣是你的,你的比特幣也就再也不屬於你了。

  1. Merkle樹結構

上述比特幣通過密鑰簽名完成了交易防篡改的第一道防線, 比特幣交易信息的存儲單位稱為區塊(Block),一個區塊包含多筆交易(具體筆數和交易頻次、交易數據大小有關),那麽一個區塊又是如何防篡改的呢?答案就是Merkle算法。

技術分享圖片

圖03

如圖所示,默克爾樹包含一個根節點(Merkle Root)、多層次的中間節點和葉子節點。交易信息位於葉子節點,一個區塊中的N筆交易被兩兩聚合進行Hash運算,運算結果作為默克爾樹的中間節點,中間節點再次兩兩聚合進行Hash,最終生成唯一的根節點Merkle Root。默克爾樹的特性在於,任意葉子節點發生改變,改變都會影響到上層的Hash運算結果,最終經過層層傳遞,根節點的Hash值也將發生改變,基於此特性,比特幣系統牢牢的將區塊內的所有交易聚合成為一個整體,任何的篡改行為都會影響到整個區塊。

  1. 區塊鏈的鏈式結構

圖03所示,展示了默克爾樹結構,但是區塊頭中不只有Merkle Root的值,其他的組成部分又是做什麽用的呢?這就要來了解一下俗稱“挖礦”的概念了。挖礦其實就是Hash運算,記賬節點在生成區塊的時候,首先要做的就是計算默克爾樹根節點Hash值,當然挖礦遠沒有那麽簡單,比特幣系統為了維持10分鐘左右的成塊節奏(考慮成塊速度和p2p節點同步問題),會強制讓記賬節點增加計算難度,在Merkle Hash運算基礎上,要求記賬節點在根節點Hash值基礎上增加一個隨機數,最終得到一個符合特定要求的目標Hash值(如目標Hash值的前4位必須是0000,也就是難度系數)作為該區塊的ID。這就需要記賬節點不斷的通過計算生成隨機數去匹配目標Hash值的要求,誰的算力越高概率上越可能優先計算出目標Hash值。記賬節點挖礦的過程就是爭取最先找到符合難度系數的目標Hash值的過程,第一個計算出目標Hash的記賬節點(挖到礦的礦工)並且獲得其他記賬節點驗證通過後,會得到系統獎勵的比特幣,完成整個挖礦過程,這個過程耗費了大量算力,也是Pow算法被人詬病的主要原因。

區塊鏈之所以稱為鏈,是因為每一個區塊都保存了前一區塊的目標Hash值(創世塊沒有前一Hash值),某一個區塊的某一筆交易發生篡改,因為默克爾樹算法的作用這個區塊的目標Hash值就會被改變,然後就會連鎖反應,以這個區塊為基礎的,後續所有區塊的Hash值都會發生變化,任一記賬節點都可以輕易的發現賬本被篡改(如下圖04)。這樣就保證了區塊鏈上的所有區塊都具備了防篡改功能。

    技術分享圖片

圖04

  1. 51%算力攻擊

上述的多重防篡改機制已經讓我們領略了比特幣設計的嚴謹性,通過一環套一環的算法控制,賬本很難被篡改。那是不是基於POW算法的比特幣系統就毫無破綻呢?其實針對所有基於Pow算法的區塊鏈系統,都有一個天生的弱點,那就是著名的51%算力攻擊。如果有人控制了全網超過50%的算力(超過越多越容易掌控整個系統),他就能夠比其他人更快地找到生成區塊的目標Hash值,因此他實際上擁有了決定哪個一區塊有效的權力,他就可以對自身的交易發起“雙花”攻擊(51%攻擊、雙花攻擊概念太過復雜,還會牽扯到比特幣UTXO的記賬方式,足以單獨成文,本文重點介紹防篡改機制,所以略過不表,網上有很多專門論述的文章),簡單描述就是可以做交易不花錢。這已經不是技術問題了,而是一個博弈問題,因為攻擊會造成比特幣這種去中心代幣徹底失去信用,沒有信用背書的比特幣將變得一文不值。當一個人花費巨大代價獲取到超過50%的算力(通過購買礦機或者控制其他人的礦機),並且購置了大量的比特幣時,就不會冒著毀滅比特幣的風險去攻擊整個比特幣系統,這樣做傷人傷己,沒有任何好處,而且以比特幣目前的算力體量而且仍然在不斷增長,想控制超過半數的算力已經變得越來越困難。當然比特幣的一些分叉系統或者一些較小的采用Pow算法的代幣系統,整體算力比較小,實施攻擊相對容易,可能就沒有安全了。

有位幣圈大佬曾經說過:“區塊鏈底層是數學邏輯,中層是哲學思想,上層是神學信仰”。上述介紹的比特幣防篡改機制已經將區塊鏈技術成功從數學邏輯上升到充滿博弈論的哲學思想,而杯具如我還在區塊鏈技術底層苦苦掙紮。幣圈一日鏈圈一年,技術之路長路漫漫,願與同路人共勉。

比特幣防篡改技術詳解