1. 程式人生 > >區塊鏈的原理是什麼?

區塊鏈的原理是什麼?

轉自知乎:https://www.zhihu.com/question/31112808


看到一些爭論區塊鏈定義的回答, 突然意識到自己這篇解釋原理的回答其實是一直是對著比特幣擼的, 介於區塊鏈的定義業界並沒有一個特別明確和唯一的回答, 這裡先給出個人根據所讀論文而總結出的“區塊鏈”應有特質:使用了具有 “雜湊鏈” (下文有解釋) 形式的資料結構儲存基礎資料有多個結點參與系統執行(分散式)通過一定的協議或演算法對於基礎資料的一致性達成共識(共識協議/演算法)。介於比特幣目前是區塊鏈最典型且最有影響力的應用之一, 理解比特幣如何使用區塊鏈後, 再去理解其他形式各樣的區塊鏈應用就會容易很多。 —————-以下引自我在知乎中另外一個區塊鏈問題的答案在談應用之前,最重要的是先理解它的技術本質是什麼, 所有介紹區塊鏈的答案裡, 都最先提到了區塊鏈不可篡改的特性, 所以第一個要理解的是它到底是怎麼實現不可篡改性的。

以下引自我在知乎中另外一個區塊鏈問題的答案在談應用之前,最重要的是先理解它的技術本質是什麼, 所有介紹區塊鏈的答案裡, 都最先提到了區塊鏈不可篡改的特性, 所以第一個要理解的是它到底是怎麼實現不可篡改性的。

先修知識
密碼學Hash()函式的單向性: Hash(x) =y , 通過y很難找到x
雜湊鏈: 假如現在有順序產生的資料塊 A, B , C 。 那麼我們可以這樣計算一個hash 。 注意 “||” 表示拼接

h0=  Hash(A) 
h1 = Hash(B || h0)
h2 = Hash(C || h1)

h2是我們計算的hash頭部,現在來看, 為什麼我們管這個東西叫Hash鏈, 因為h2 的值依賴於之前一系列資料的內容和計算順序。 假如說現在你知道了h2 , 別人拿著A,B, C, 他不管是修改A,B, C的任一點內容還是A,B, C的出現順序,你都無法再次計算出正確的h2

好的, 其實到這裡區塊鏈的概念就有點感覺了不是嗎。”區塊鏈”這個詞是英文 Block Chain 的翻譯, 如果從字面上理解, “資料塊組成的鏈條” 就足以闡釋它的基本內涵了。比特幣區塊鏈其實就是雜湊鏈的一個變種(注意, 下文描述的這種新增隨機數以及對隨機數有特殊要求的規則是比特幣為了實現工作量證明 Proof of Work 的共識機制而新增的, 並不是區塊鏈的一個必要特徵)。 怎麼變? 新增一個隨機數(Nonce)假如現在有順序產生的資料塊 A, B , C 。 我們來這樣計算hash頭。

注意 “||” 表示拼接

h0=  Hash(A|| Nonce0) 
h1 = Hash(B || h0 || Nonce1)
h2 = Hash(C || h1 || Nonce2)

這裡我們還新增一個額外的要求, 就是 h0, h1, h2 必須都得是以指定數目的0 bit開頭的,例如要求每個雜湊值都必須以5個0開頭,則h0,h1,h2都應該是這樣的形式(00000*****************)添加了這個要求以後, h0, h1, h2就都不是那麼容易計算的了, 因為你不能根據輸出的形式來反推輸入是什麼, 而A, B, C又是給定的, 那隻能不斷更改Nonce來窮舉計算, 然後找到一個可以滿足要求的Nonce值 ,使得h0, h1, h2符合要求。

到這裡大家就知道所謂的礦工是在幹什麼了, 就是接受廣播出來的資料塊,然後計算當前最新的雜湊鏈的頭部, 當成功計算出了一個符合要求的Hash後, 就告訴所有人,自己找到了, 讓別人再去計算下一個雜湊頭部。

其實到這裡, 區塊鏈的本質就已經差不多了, 假如網路中大家都預設遵守協議, 只在最長的雜湊鏈後計算新的頭部,那麼一切都很好, 但是如果有人想搞不一樣,那他就得擁有更強的計算能力, 在誠實者都遵守規則的情況下, 自己能夠計算出一個鏈條分叉甚至說直接計算出一個新的鏈條,讓大家都承認。

至於這個難度的證明,中本聰就是建立了一個泊松分佈的概率模型, 假設了誠實結點計算出新的雜湊頭的概率p和不誠實結點計算出新的Hash頭的概率q後,算出了一個N值。 這個N值的含義是給出了當一個新的雜湊頭部 h1 計算出來後,其後追加N個頭部(h2,h3,h4….)後,網路才應該承認這個新的頭部 h1. 因為此時, 攻擊者要想成功發動攻擊, 至少需要計算出一個長度大於N的分支, 這個概率在攻擊者沒有掌握全網算力50%的時候是很難達到的

所以到這裡, 區塊鏈就已經清楚了,就是一個密碼學工具的一種巧妙應用而已。那這裡思考一下, 不可篡改性其實並不是一個什麼神奇的特性,密碼學的簽名技術就能提供不可篡改性呀, 區塊鏈到底解決了一個什麼問題。

答案是信任問題

區塊鏈提供了一種方案, 讓一個網路中,所有的結點都有能力去用計算能力投票, 從而保證了得到承認的結果是大多數人公認的結果, 不會因為少數結點作惡,而修改結果傳統的交易建立在什麼基礎上, 我們對於金融機構的信任, 對於中央銀行的信任, 或者對於交易對手的信任, 對於第三方中間人的信任。 這裡其實就引出了很多安全技術應用,或者說很多制度建立的本質, 如果你信任的越多, 需要做的工作就越少。區塊鏈就是因為不想信任網路中的任意一個單一結點, 所以讓大多數人具有公平的投票權利, 而這個投票權利,不是按人頭算的, 是按CPU算的, 每個CPU有一票。

區塊鏈的最難以克服的缺點
1: 效率問題
前面說過, 當你信任的越多, 需要做的工作越少, 就好比你和一個人做生意, 如果你完全信任對方, 那麼合同都不用籤, 口頭約定就行。 如果不太信任, 籤一個簡單的合同, 規定最重要的事項。 如果特別不信任, 讓律師對交易中所有存在風險的地方列出條款,規定責任, 籤一個大大的合同。所以看出來了吧, 信任越多, 效率越高。 信任越少, 效率越低。 區塊鏈也是一樣,因為沒有單一結點可以信任,通過計算來換取信任。 所以簡單的一個承認交易的操作, 需要大量的計算參與進來, 結果是什麼, Bitcoin平均交易速度只有7筆每秒。

2: 巨集觀金融的適應性
金融學和經濟學作為人類多年來發展出來的科學具有不可替代的地位, 比特幣的流通貨幣量是存在上限且增加速度基本固定的, 這符合經濟規律嗎? 顯然不符合。 因為學過經濟的人都知道, 貨幣只是對實物財富的衡量, 貨幣增長速度快於商品增長數量, 則發生通脹, 貨幣增長速度慢於增長速度則發生通縮。

3: 匿名引發的安全性
想一想匿名對於罪犯的好處,就不難理解比特幣的洗錢風險比特幣作為資訊保安學者的發明產物, 現在常被應用於黑客入侵之後勒索的交易手段, 想起來也真是諷刺

4: 使用者的易用性
比特幣的技術是基於密碼學簽名技術的, 你的賬戶安全由你的私鑰保護, 如果不新增別的手段,比如在別人那裡備份, 或者在別的地方備份, 你丟失了金鑰, 賬戶裡的 錢是沒有人能給你找回來的。 想想人們丟銀行卡, 忘記密碼的頻率, 這個問題有多大, 不用我說大家也懂說了這麼多缺點, 區塊鏈技術和比特幣技術就不行了嗎? 顯然不是,不然那些國際金融機構也不會下大功夫研究它, 但其實, 和其他所有的技術一樣, 大家都只是在尋找一種能夠更高效解決信任問題的手段而已, 金融機構的核心是什麼, 交易投資與風險控制唄。 其實也都是圍繞信任問題展開的。信任問題的解決在金融機構本來其實就是耗費了大量的成本的, 只不過很多成本在後臺, 或者在人工的耗費上, 很多人看不到而已。

總結 :區塊鏈的技術有望以一個更低的成本解決更廣泛的信任問題所以被受人關注