Blockchain(區(qū)塊鏈)技術概要

前言

本文大部分翻譯自該地址,加上了一些自己的解釋。

進行了一些更新,修改了一下敘述的順序,這樣似乎更加容易懂一點。。。

介紹

加密貨幣,特別是比特幣曾經紅極一時,不過現在更加熱門的,是它們的底層技術框架BlockChain(區(qū)塊鏈),在其提出的論文(作者是傳說中的中本聰)中說:

我們提出了一種通過P2P網絡來解決double-spending的方案。通過將交易記錄加密(該操作相當費時)到一個不斷增長的區(qū)塊鏈上,使得造假者需要巨大的成本(主要指計算力)以至于不可能。

要了解區(qū)塊鏈技術,我們必須要了解它在比特幣的體系中,到底發(fā)揮了什么作用,又是如何做到的?

基于第三方認證的交易系統(tǒng)

假設小王和小紅是郵票收集者,經常交換郵票。有一天,小王有了一張小紅很想要的郵票,但是小紅手頭可以交換的。所以他們開始記賬,小王把郵票給小紅,等小紅有了好郵票再還給小王。

小王拉來了小張作為第三方見證人,簽署了一個合同:

來自 小王 小紅 紅色郵票 時間 2016.03.24
小王簽名 : 小王 小紅簽名: 小紅 小張簽名: 小張

一式三份,人手一張,基于這份合同:

  1. 小王,小紅,或者惡意的第三方,都無法否認該合同的存在。因為小張這里有一份存根。
  2. 如果一個合同在小張這里沒有存根,那么肯定是偽造的。

第三方的信用在這個體系中扮演了重要角色,小張一定要是一個雙方都可信的人才行。

基于加密認證的交易記錄

小紅和小張結婚了!他倆一起說這個交易沒有發(fā)生過,小王手頭的那份合同成了廢紙。
痛定思痛,小王決定找一個新的交易認證方式,人太不靠譜了!他找到了公鑰加密算法:

公鑰加密算法,又稱為不對稱加密。指的是加密時需要用到一對密鑰:公鑰和私鑰。用私鑰加密的內容,可以用公鑰很輕松的解開,但是想要加密出同樣的內容,不知道私鑰幾乎是不可行。

小王又和小紅做交易了(別問我為啥。。。),過程如下:

  1. 雙方各自持有一對密鑰。
  2. 小王和小紅互相告知對方自己的公鑰。
  3. 小王給了小紅一張郵票。
  4. 小紅把經過自己的私鑰加密的收據發(fā)給小王。

現在這個收據就成了合同。用小紅的公鑰解密之后內容格式合法,就一定是小紅簽發(fā)的。不再需要第三方,除非小紅死不承認。。(那就是公安局的問題了)。

雙方不斷地交易產生了很多收據,把這些收據順序過一遍,就可以算出現在到底誰欠誰郵票。

為了方便交易,小王和小紅約定了一個價值參照,比如紅色郵票,計數為1,黃色郵票,計數為2,藍色為3。他們的交易記錄鏈看起來像是這樣:

From 小王
加密內容 發(fā)送給小紅,時間2016年3月25日,價值 1
From 小紅
加密內容 發(fā)送給小王,時間2016年3月27日,價值 2

....

由于小王和小紅的公鑰是公開的,任何人都可以用這段交易記錄算出小王和小紅現在的賬戶余額,不需要第三方證明了。

多方交易 & 認證機制

小張也要參與到交易中。也用這個方法做交易認證。小王剛給了小紅一個價值2的郵票,在小王和小紅的數據賬單上,小王賬戶余額為2, 小紅賬戶為-2,數據賬單內容大致如下:

  1. From 小紅 To 小王 Value: 2 (小紅簽發(fā))

表示小王給了小紅價值2的郵票,小紅簽了一個2個單位的收據,小紅的賬戶變成了-2, 小王變成了2。

小張加入交易,他拿到了一份當前交易記錄鏈的拷貝。這時小王找到小張:“你看,小紅欠我兩個,你把你手頭那個黃色郵票給我,我把這兩個單位給你,到時候你找小紅要?!?br> 小張說行啊,就給了小王,于是小張這兒的數據記錄變成了:

  1. From 小紅 To 小王 Value : 2 (小紅簽發(fā))
  2. From 小王 To 小張 Value : 2 (小王簽發(fā))

趁小張和小紅還沒溝通,小王找到小紅:“上次欠我的郵票,還我吧,我要那張黃色的?!?br> 小紅說行啊,于是小紅這里的數據記錄變成了:

  1. From 小紅 To 小王 Value:2 (小紅簽發(fā))
  2. From 小王 To 小紅 Value:2 (小王簽發(fā))

最后小張找到小紅時才發(fā)現倆人都被小王耍了。這時候,小王已經腳底抹油,跑了。
對此,我只能說,小王,你太喪(gan)心(de)病(piao)狂(liang)了。

雖然數據記錄都是由本人簽發(fā),但是賬單的不統(tǒng)一給了小王鉆空子的機會。這個問題怎么解決呢?
最簡單的辦法,每次更新賬單的時候,所有參與人都在場,這樣大家都會同步更新賬單了。但是,這樣太麻煩了,有沒有更好的方案?

分布式共識網絡機制

如果我們想把這套機制用全球郵票交易上,那么每次交易都需要所有人在場是不可能的。我們需要一個系統(tǒng),讓全世界的人,不管地理和時區(qū)差異,都能夠利用非對稱加密在不需要第三方認證的情況下可靠交易。
計算機網絡可以解決地理和時區(qū)差異,剩下的問題,就是如何保證全網的賬單一致性。
一個方案是采用一個中心數據庫記錄所有交易,但是這個中心數據庫不就又是一個第三方了嗎,如果數據庫被攻擊或者管理員惡意修改怎么辦?

為了去中心化,我們需要一個P2P網絡,也就是節(jié)點之間的地位是平等的,每個節(jié)點都可以存儲一份全局賬單?,F在問題是如何保證各個節(jié)點之間賬單一致性。研究表明,P2P網絡能保證一個“弱一致性”,它可以滿足:

  1. 會有部分節(jié)點的賬單暫時與全網賬單不同步
  2. 整個系統(tǒng)最終會統(tǒng)一到一個賬單下來
  3. 當出現賬單沖突(像之前的例子,小王分別和小張小紅各做了一套賬單),最后會按照一個可預計的方式解決(比如時間在前面的才有效)

對于只是想了解大概的讀者,到這里已經可以收工了。
簡單說,在全世界都跑著區(qū)塊鏈節(jié)點的情況下,大家最后總是會統(tǒng)一到一個一致的賬單下。
如果想了解賬單如何一致的可以繼續(xù)閱讀。

如何保證賬單一致 ?

防御sybil攻擊

在分布式系統(tǒng)中取得共識(一致性)的方法,本質都是“少數服從多數的投票機制”。這個機制里有很多設計,哪些人可以參與投票?每個人投票的權重一樣嗎?
假設每個參與者只需要一對密鑰就可以投票,如果某一個惡意參與者通過程序偽造大量密鑰對,試圖達到大多數然后修改賬單呢?這就是sybil攻擊。

就好像淘寶交易刷單一樣,通過程序,大量偽造的客戶可以下很多假單,然后刷信譽,怎么辦?有一個辦法,就是讓刷單的行為變得”昂貴“,例如每次下單,淘寶要收一塊錢交易費,這樣刷一萬個信譽是要付出一萬元的成本的。

工作量證明機制

為了增加難度,我們要求內容里必須包含一些簽發(fā)者目前所知的全網賬單的摘要信息,另外,加密后的內容里,必須前N位是0。為了達到這個目標,消息內容里有一個填充字段,提交者可以改這個字段使得加密結果合格。
現在常用的加密算法是SHA-256,具有相當的隨機性,也就說,內容發(fā)生了一點點變化,加密結果都會大相徑庭,沒有規(guī)律可循,參與者只能不停的去嘗試直到成功為止。
這個機制的結果導致加密一個交易記錄是一個非常費算力的工作,但是認證消息仍然非常簡單,首先查看加密內容前N位是不是0,然后用簽發(fā)者的公鑰解開就可以解密然后驗證內容。

這個機制如何確保全網賬單的一致性?只是大家提交記錄變費勁兒了而已,那如何識別出那些是偽造的記錄呢?

建立區(qū)塊鏈

在區(qū)塊鏈網絡中有很多地位相同的節(jié)點,每個節(jié)點都有自己維護的當前賬單,最終以大多數人持有的賬單作為全網一致性的賬單。那么區(qū)塊鏈技術是怎么保證全網賬單會收斂到一個統(tǒng)一賬單上的呢?

首先我們了解一下區(qū)塊鏈賬單的數據結構到底是什么樣子。上一章節(jié)我們講了,為了防止sybil攻擊,區(qū)塊鏈中每一個記錄要花很多計算力才能生成,普通交易者沒有足夠的計算能力,只能將賬單內容簽名后,發(fā)送到網絡中,尋求別人的幫助,這時候,著名的“礦工”登場了。

礦工一般是有足夠計算能力的節(jié)點,他們會收集很多條交易裝在一起,然后用礦工自己的密鑰,嘗試各種填充位進行加密,直到符合前述的數據要求,然后就立刻向全網廣播這個block,讓其它節(jié)點知道一個新的block產生了。每一個block里除了包含收集到的交易數據之外,還要帶上這個block基于的上一個block的ID,這樣所有的block組成一個blockchain,就是全網賬單,這也就是“區(qū)塊鏈”這個名字的由來。

那么礦工耗費成本去計算block是為了什么?
其實很簡單,每一個交易者發(fā)出交易請求時,需要指定一定的交易費,礦工在組裝完交易記錄后,還會增加一個新的交易記錄到block里,聲明該block里的所有交易費歸自己所有。在比特幣的協(xié)議中有一個巨大的比特幣池,每一個block的第一條記錄還可以聲明從這個池中劃出固定量的比特幣歸該礦工所有,這些利益,就是礦工的動力來源了。

接下來,我們再看看之前描述的那個場景:

  1. 小王和小張完成了一個交易,把小紅欠自己的兩個單位郵票記在了小張的賬戶下。
  2. 現在趁著小張還沒跟小紅溝通,小王又找到小紅,要小紅還他兩個單位的郵票。

為了說明整個系統(tǒng)運作流程,假設小紅同意了,她要求小王先向全網里發(fā)出一條用小王的密鑰簽名的交易記錄,內容是給2個單元給小紅(貨到付郵票)。于是小王向交易網絡里發(fā)出交易記錄,指定交易費,請求別人幫忙將其掛載到全局賬單上。

網絡上的礦工收集到交易記錄(包括該條),并開始打包這些交易記錄成block,將該記錄附加在他們所認為的最新的系統(tǒng)賬單末尾,然后向全網廣播這塊新block的產生。

這里有好幾種情況:

  1. 這個人的系統(tǒng)賬單是最新的,也就是,他所知道的全局賬單里,已經包含了小王將小紅的欠賬轉到小張名下的記錄。
    小紅收到新的block,組織成blockchain,計算之后發(fā)現現在反而是小王欠了她兩個單位,她一把揪住小王:“騙子,你已經把我的欠賬轉到小張名下了!”

  2. 這個人的系統(tǒng)賬單不是最新的,他不知道小王轉了小紅的欠賬到小張那兒。他將小紅這條交易記錄加在新block里,然后添加到他所知道的全網賬單鏈里,然后廣播出去了。
    現在網絡里的全網賬單出現分叉了。假設在小王和小張的交易發(fā)生之前,全網賬單鏈為b1, b2, .. bi, 收到小張廣播的交易記錄和之后小紅的交易記錄的人,往下構造的賬單是b1, b2 ... bi, bz, bh。而沒有收到小張的交易記錄的人,構造的賬單是b1, b2, ... bi, bh (漏掉了bz)。

  3. 這個人的賬單是最新的,他構造了一個block A,發(fā)到全網,與此同時,另外一個人持有的賬單也是最新的,他也構造了一個block B發(fā)到全網。哪一個block才會被承認?請注意,因為A B兩個block里都有一條聲明交易費的記錄,所以只有最后承認的block的生成者才能“得到”這個交易費用。

這有好幾個問題,所以我們先要澄清一下全網賬單掛載的方式:

競爭機制

  1. 任何人都可以在全網幫別人確認交易,這也就是類似比特幣的礦工,通過幫人計算確認交易,獲得交易費用。
  2. 個體之前沒有互相協(xié)調機制,每個人算出一個block之后都要立刻發(fā)送給他所知道的其它參與者,而其它參與者收到block時,首先用block里附帶的公鑰檢驗內容是否正確,如果正確,將該block加到他們的賬單里,然后通知全網。
  3. 如果收到block的人正在生成block,他只能放棄當前工作,將收到block掛到自己的全網賬單里,并且重新生成新的block(記得我們前面提到過,block的內容里包括它基于的上一個block,現在最新的block已經被收到的block替換了,所以得重新根據最新的block再次去計算填充值,直到加密結果符合要求---前面有兩個0)。

這時候有人要問了,我干嘛要丟棄我自己算了半天的成果,我不能無視新收到的block嘛?
另外,像之前提到的,如果兩個人同時發(fā)給我block咋辦?
甚至有人發(fā)給我他以為正確其實錯誤的block(前述例子里的某些人的blockchain都錯了)咋辦?

這里就引入了下一個話題

解決BlockChain沖突

解決方案很簡單:哪個blockchain最長就用哪個。如果節(jié)點收到多個block,并且他們的blockchain長度是一樣的,就需要同時保存這幾個blockchain,在多個chain上同時工作,并且不斷的監(jiān)聽新的block消息,添加到對應的chain上,直到最后它知道哪個更長,就立刻轉到該chain上往下工作,其它的則被廢棄掉。

這里就涉及到一個重要概念了,每個節(jié)點目前維護的blockchain,可能是錯的! 也許過了一段時間,它會看到一個更長的chain,那時候它才知道它需要換到那個chain上了。

是不是聽起來很不靠譜?每個節(jié)點維護自己的chain,互相廣播新的block,感覺會是一團亂啊?但是根據推算,這個鏈會較快的收斂到一個結果上來。所有節(jié)點不停的廢棄鏈和在鏈尾添加新block,但是鏈身總會穩(wěn)定的收斂到一個一致性的結果,這都有點哲學的味道了,不是么?

于是,在之前的例子中,小王發(fā)出交易,小紅開始監(jiān)聽新來的block,首先她要找到包含該交易記錄的block,然后為了保險起見,她又會繼續(xù)監(jiān)聽block,直到發(fā)現有好幾個block鏈在那一條block之后(一般來說,后面接上5個block就基本穩(wěn)定了),也就是說,該block被全網節(jié)點接受了,她可以開始算算自己和小王的賬單了。

  1. 如果礦工拿到的chain不是最新的,漏掉了小王和小張的交易,小紅監(jiān)聽到他發(fā)出的block后,又繼續(xù)聽了幾個后續(xù)的block,跟收到的其它礦工發(fā)出的block一比就發(fā)現這個chain比較短,該鏈就被廢棄了,那么小王也沒法忽悠小紅了。同樣,因為被廢棄,該礦工聲明的交易費也拿不到了,選擇大于努力啊。。。

  2. 礦工A和B都發(fā)出了正確的block,這個時候就看誰的更快被多數節(jié)點接受了,這也就是為什么比特幣挖礦這么費機器的原因,算得越快,越容易被接受,也就能得到更多的比特幣。

  3. 無視別人發(fā)來的block的人,很明顯他們的block生產速度慢于別人了,如果不立刻轉到新block上,只會導致自己剩下的全部都是無用功。。嗯,這好像也跟哲學吻合了,請不要閉門造車,掩耳盜鈴了。。

在這個情況下,小王如何耍詭計呢?他只能在他給小張2個單位的交易記錄的block(假設為Block A)被接收后(也就是說,已經有了多個block掛載在該block后了),構造一個假的block鏈在Block A之前的block后,并且不停的構造block使得這個假chain的長度超過目前全局鏈的長度。這樣他的chain就成了公認的,并且沒有他跟小張的交易信息。
這個方案可行不可行呢?可行,但是全網里其它人一收到小王最早的交易信息后就開始往下擴充了,小王要欺騙他們換到自己偽造的chain上來,就需要比他們算的都快,快到什么程度呢?目前數學給出的答案是,要能戰(zhàn)勝全網50%的算力才行。一旦P2P網絡到了成千上萬個的節(jié)點時,想達到這個算力是不可能的,這也就是比特幣自稱去中心化的基礎。

結尾

剛剛這個交易網絡,其實就是blockchain的原型。它的價值絕不僅僅是比特幣這個產物,換句話說,如果我們在每個block里存儲的內容不是transaction,而是別的東西呢?它就演化成了一個分布式的,無法被偽造的存儲系統(tǒng),特別是,在blockchain上演化出的新功能“智能合約”,就將合約的執(zhí)行融合到了分布式網絡中,比如,小王和小紅打了賭,如果明天是晴天,小王就給小紅4個單位。于是小王和小紅認定了一個權威的天氣機構,生成了一個交易信息放到blockchain里,不過該交易是有條件的,等到第二天,是晴天了,該權威機構用自己的私鑰簽發(fā)了一個晴天的消息到blockchain里,網絡里無數的確認者就用該天氣機構的公鑰確認了晴天的消息后,執(zhí)行了小王向小紅的轉賬,并且將該block提交到網絡中。這個過程完全自動不可逆,不可偽造。
這也就是為什么很多銀行和金融機構開始對blockchain感興趣的原因。在這個機制下,很多交易的中間環(huán)節(jié)可以被省掉了,這將會極大的節(jié)省金融體系運作成本,提高工作效率。


QQ群:654894791

微信公眾號: 94ETH

官網: https://www.94eth.com

頭條號: 周期與泡沫


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 本文由《遠程教育雜志》授權發(fā)布 作者:許濤 摘要 區(qū)塊鏈技術被認為是互聯(lián)網誕生以來人類社會最重要的發(fā)明,其正在深刻...
    蔡蔡Tacy閱讀 7,727評論 2 70
  • 在info.plist文件中添加一個Bundle display name,在后面直接輸入自己想要app叫的名稱就好了。
    valiant_xin閱讀 240評論 0 0
  • 看到簡書開屏圖的貓咪很喜歡,用幾筆線條勾勒了貓咪的姿態(tài)......
    檸檬趙閱讀 278評論 0 1
  • 今天回家路上被一只貓攔住了去路,然而我沒有任何吃的,貓咪似乎也不餓,還很悠閑,就是不讓路,于是我只好繞路而行了。 ...
    胖燈閱讀 173評論 17 8

友情鏈接更多精彩內容