1. 程式人生 > >區塊鏈與比特幣

區塊鏈與比特幣

單位 再計算 鏈表 針對 數字簽名 解讀 最新 設定 送禮物

一開始只是想了解SSH的安全機制,結果把區塊鏈技術和比特幣這兩個新技術了解一邊。既然學習了,就談談自己的理解。在文末我推薦幾篇淺顯易懂的博文,有興趣可以繼續閱讀。

我對比特幣的理解分為兩個方面,既是一種交易體系,也是貨幣單位。而區塊鏈是是一種分布式數據庫,具有高度安全性。我先從區塊鏈談起,再介紹比特幣。

區塊鏈

區塊鏈技術是一種分布式數據庫。我們生活中經常與分布式數據打交道,例如雲端存儲,服務器架構等等。對於這種應用,安全性的考量都是出自於硬件安全,例如一臺服務器崩了,數據要保正安全。所以數據一般是多個服務器冗余存儲,但不會要求全網每臺服務器都要求存儲一份。這種方式可以規避硬件風險,但對於人為攻擊就會產生漏洞。如果我想要破壞數據,可以采用兩種方案。一種是針對數據存放的位置,也就是攻擊少數幾臺服務器,把這些數據全部毀壞,或者修改部分數據,讓數據發生混亂。另一種是針對數據傳播的途徑。我可以在你想要獲取數據時截獲你的包,或者發動中間人攻擊,冒充服務器發送虛假的數據。

區塊鏈技術可以解決第一種攻擊模式。區塊鏈的數據單位是block,每個block采用鏈表的結構彼此相連,同時保證全網的數據一致。也就是每一臺加入區塊鏈網絡的服務器都保留有一份完整的全網信息。block分為head和body。body通過哈西運算獲得hash編碼,head會加入body的hash以及上一塊block的head的hash,當然還有時間等一些重要信息,然後生成自己的hash以供下一塊block調用。這樣的結構保證了區塊鏈中的數據都是完整的,相互聯系。

說完了數據結構,我們談談區塊鏈數據的產生方式。區塊鏈的數據是競爭產生的!註意,區塊鏈和互聯網不同,對數據的發布有嚴格的要求,必須通過大量的計算得到符合要求的hash後才能向全網發布。假設我想向整個網絡寫入一個信息,例如“明天是我的生日,大家要送禮物給我喲!”。那麽我先獲取上一個block的hash,再計算內容body的hash,再計算head的hash。看這個結果是不是滿足網絡中的發布要求,如果不滿足那麽重新計算。可是如果我的計算機沒別人的快,也就是我還在計算時有人已經發布了一個新的block!不好意思,已經做的計算白費了,你得用新的block的hash重新計算。同時還要說明這個網絡對hash計算難度是動態調整的。當初設計是控制在每十分鐘產生一個新的block。也就是如果最近一段時間,加入網絡的服務器性能強進,導致8分鐘或者9分鐘就能有一個block產生,那麽網絡會加大難度,讓這個時間回歸到10分鐘。所以hash算法難度和全網的計算資源相關,你不太可能超越全網的計算能力,在短期內計算出結果。

區塊鏈技術之所以要設定必須做出大量計算之後才能發布block,主要是為了給處理分布數據的同步留出時間。假設在區塊鏈中很簡單就能計算出滿足要求的hash,那麽信息的傳遞就像幼兒園一樣嘈雜,每個人都在發布自己的信息。A的話還沒等到B,C......接收到,H已經發布了新的信息,聽誰的?先做一些計算再去發言,且嚴格控制計算難度,一定程度避免了信息同時發布,也為全網信息同步留出了處理時間。

但是如果有兩臺服務器同時發布了結果,要知道一個數據包全網傳遞時需要時間的,等到所有服務器都拿到數據,應該也是有兩份滿足要求的block。那麽這個時候就產生了分叉,解決方案是讓這兩個分叉自由增長,看誰先達到6塊,就確定保留誰的。那麽這時候計算新block就像是賭博,有的從A分叉的hash計算下一個block,有的從B分叉的hash計算下一個block。等到A方達到6個block,保留A,刪除B。押B的服務器所做的計算全部作廢。

現在假設有一臺服務器出了問題,沒關系,數據大家都有,等這臺服務器修好了加入進來copy其他人的就行了。再假設其中隨機一塊block壞了,或者數據“莫名其妙”變了。沒關系,解算第一個block的hash一直到最新的block,看hash能不能前後相依,如果不能,那麽數據被修改了,再從其他人那裏copy一份就好了。再假設機緣湊巧,數據“莫名其妙”變了,但是hash還能連在一起。那麽全網公投,少數服從多數!

以上就是區塊鏈的技術介紹。現在我們來攻擊這個網絡。我們不需要偷取數據,因為區塊鏈中的數據是全網透明的。但是我們想修改其中一份數據,那麽我們得過兩個關口。第一,我們要計算從修改的block到最新block的全部hash,使得自己的數據滿足規則。我們也知道,hash的計算難度是全網最好的計算平臺用10分鐘計算出來的!假設你有錢,把神威-太湖之光買下來了。那麽可以修改全部數據,還要第二個關口——全網公投。你得想辦法把整個網絡中51%的服務器都黑了,才能贏得這場投票!如果這個網絡足夠大,那麽能做到這一點的無論是計算能力還是網絡技術,應該沒有人能把它怎麽樣了!

至此我想你明白這個網絡中的數據為什麽是安全的了吧。但是用神威-太湖之光計算出來的hash只是為了告訴大家給我送禮物,恐怕太奢侈了!這種網絡現在最大的用途是構建去中心的交易平臺,此時的block裏存儲的是平臺中所有的交易信息,而比特幣是網絡規模最大的一種實例。

比特幣

區塊鏈是比特幣的基礎架構,它保證了已經生成的數據是安全的。如果有人想修改某筆交易的信息必然要花費巨大的代價。可是在數據傳遞的過程中?也就是第一種攻擊模式失敗,嘗試第二種攻擊模式,我截獲正在傳遞的交易信息或者向平臺發布虛假的交易信息!要處理這種問題就要應用信息加密技術!

雙鑰加密,就是同時生成兩個對立的數字密鑰(兩串數字)——公鑰和私鑰。如果用公鑰加密的內容必須用私鑰才能解密,用私鑰加密的內容必須用公鑰才能解密。公鑰是公開的,私鑰只有個人知道。現在假設A生成了這對密鑰——公鑰x和私鑰y,並把x交給了B,C,D三個人。現在B用x加密信息發給A,只有用y才能解密信息,所以其他人即使截獲信件也不知道信件內容。可是A不能也用x加密回信,那麽B也不能解讀。所以A只能用y加密,可是C,D就能知道回信內容。這沒辦法,所以A幹脆不加密了。但是A留了一手,他把信件內容生成了一個hash,而且用y加密了(這個加密的hash就是數字簽名),和信件一起送給B。這樣C和D即使知道了信件也不能修改信件,因為內容一旦修改,B用x解算出來的hash和信件內容就對不上了。即使C和D想連同hash一起修改也不可能,因為沒有私鑰y,無法加密hash。這種加密機制能保證B向A是加密不可見,A向B是可見但不可修改的。通過對信息內容的特殊處理就能保證整個通訊過程是不可見的(例如B提問,A只回答是還是不是)。

雙鑰加密技術從上世紀提出後在各種場合廣泛應用,網絡通訊的https協議,linux上的SSH都是采用這種這種技術傳遞信息。為了防範公鑰偽造的問題,還建立了專門機構提供數字證書(就是用該機構的私鑰加密其他人的公鑰和相關信息,例如網址)。

比特幣交易平臺也是采用雙鑰加密技術確保每筆交易信息都是真實有效的。首先加入比特幣交易平臺,都會生成一對私鑰公鑰,公鑰太長了不便與傳播,又用哈西計算得到對應的hash,稱為公鑰指紋或者錢包地址。你的公鑰或者公鑰指紋大家都能獲取。

現在假設A和B發生了一筆交易,用比特幣解算,A要支付B一個比特幣。如果這個交易要生效必須讓全網都知道。那麽A和B必須把這個信息寫進下一個block裏面才行。可是憑我們的筆記本根本跑不過神威-太湖之光,所以A和B把自己的交易信息發布到網絡上,承諾如果誰能把他們的信息寫進下一個block裏,就支付一筆手續費。剛好C是個土豪,有十臺超算,沒事就幫人算hash。C接到消息,先是讓A用私鑰加密信息的hash發送過來(數字簽名),自己用A的公鑰解密,確認這個消息是A發過來的。再在全網數據中檢查以往的交易記錄,確認A有這麽多的比特幣可以支付。現在支付人和支付能力都確認了,所以C把A和B的交易信息以及數子簽名還有其他幾千筆同樣的信息都寫進block並第一個發布到網絡上了。之後C得到了幾千筆手續費,還根據規則凡是發布block的人都可以獲得10個比特幣。其中C我們稱之為”礦工“,這種幫其他人算hash的行為成為”挖礦“。

現在我們想在信息傳遞中造假,例如向礦工傳遞虛假交易。但是我們沒有支付方的私鑰,這條信息根本不成立,礦工直接就能辨識。而且我們也沒傻到用自己的私鑰,那等於送錢給別人。所以一個普通人是不能在比特幣交易平臺中作弊的。那麽假設我們是礦工,且算出了下一個block,那麽我們能不能加入虛假的信息呢?註意礦工算出了hash,不代表這個block就能被別人認證。因為block含有支付方的數字簽名,礦工也沒有私鑰,不能偽造。而且如果隨意編造,其它的服務器也很容易辨識這個block是一個虛假交易,不采用這個block。這意味著造假的礦工損失了一次賺錢的機會!

所以這個網絡中如果沒有掌握絕對優越的計算資源是不可能造假的!


區塊鏈入門教程
比特幣入門教程
數字簽名是什麽
加密貨幣的本質

區塊鏈與比特幣