前言
本文大部分翻譯自該地址,加上了一些自己的解釋。
進(jìn)行了一些更新,修改了一下敘述的順序,這樣似乎更加容易懂一點。。。
介紹
加密貨幣,特別是比特幣曾經(jīng)紅極一時,不過現(xiàn)在更加熱門的,是它們的底層技術(shù)框架BlockChain(區(qū)塊鏈),在其提出的論文(作者是傳說中的中本聰)中說:
我們提出了一種通過P2P網(wǎng)絡(luò)來解決double-spending的方案。通過將交易記錄加密(該操作相當(dāng)費時)到一個不斷增長的區(qū)塊鏈上,使得造假者需要巨大的成本(主要指計算力)以至于不可能。
要了解區(qū)塊鏈技術(shù),我們必須要了解它在比特幣的體系中,到底發(fā)揮了什么作用,又是如何做到的?
基于第三方認(rèn)證的交易系統(tǒng)
假設(shè)小王和小紅是郵票收集者,經(jīng)常交換郵票。有一天,小王有了一張小紅很想要的郵票,但是小紅手頭可以交換的。所以他們開始記賬,小王把郵票給小紅,等小紅有了好郵票再還給小王。
小王拉來了小張作為第三方見證人,簽署了一個合同:
來自 | 小王 | 給 | 小紅 | 紅色郵票 | 時間 | 2016.03.24 |
---|---|---|---|---|---|---|
小王簽名 : | 小王 | 小紅簽名: | 小紅 | 小張簽名: | 小張 |
一式三份,人手一張,基于這份合同:
- 小王,小紅,或者惡意的第三方,都無法否認(rèn)該合同的存在。因為小張這里有一份存根。
- 如果一個合同在小張這里沒有存根,那么肯定是偽造的。
第三方的信用在這個體系中扮演了重要角色,小張一定要是一個雙方都可信的人才行。
基于加密認(rèn)證的交易記錄
小紅和小張結(jié)婚了!他倆一起說這個交易沒有發(fā)生過,小王手頭的那份合同成了廢紙。
痛定思痛,小王決定找一個新的交易認(rèn)證方式,人太不靠譜了!他找到了公鑰加密算法:
公鑰加密算法,又稱為不對稱加密。指的是加密時需要用到一對密鑰:公鑰和私鑰。用私鑰加密的內(nèi)容,可以用公鑰很輕松的解開,但是想要加密出同樣的內(nèi)容,不知道私鑰幾乎是不可行。
小王又和小紅做交易了(別問我為啥。。。),過程如下:
- 雙方各自持有一對密鑰。
- 小王和小紅互相告知對方自己的公鑰。
- 小王給了小紅一張郵票。
- 小紅把經(jīng)過自己的私鑰加密的收據(jù)發(fā)給小王。
現(xiàn)在這個收據(jù)就成了合同。用小紅的公鑰解密之后內(nèi)容格式合法,就一定是小紅簽發(fā)的。不再需要第三方,除非小紅死不承認(rèn)。。(那就是公安局的問題了)。
雙方不斷地交易產(chǎn)生了很多收據(jù),把這些收據(jù)順序過一遍,就可以算出現(xiàn)在到底誰欠誰郵票。
為了方便交易,小王和小紅約定了一個價值參照,比如紅色郵票,計數(shù)為1,黃色郵票,計數(shù)為2,藍(lán)色為3。他們的交易記錄鏈看起來像是這樣:
From | 小王 |
---|---|
加密內(nèi)容 | 發(fā)送給小紅,時間2016年3月25日,價值 1 |
From | 小紅 |
---|---|
加密內(nèi)容 | 發(fā)送給小王,時間2016年3月27日,價值 2 |
....
由于小王和小紅的公鑰是公開的,任何人都可以用這段交易記錄算出小王和小紅現(xiàn)在的賬戶余額,不需要第三方證明了。
多方交易 & 認(rèn)證機(jī)制
小張也要參與到交易中。也用這個方法做交易認(rèn)證。小王剛給了小紅一個價值2的郵票,在小王和小紅的數(shù)據(jù)賬單上,小王賬戶余額為2, 小紅賬戶為-2,數(shù)據(jù)賬單內(nèi)容大致如下:
- From 小紅 To 小王 Value: 2 (小紅簽發(fā))
表示小王給了小紅價值2的郵票,小紅簽了一個2個單位的收據(jù),小紅的賬戶變成了-2, 小王變成了2。
小張加入交易,他拿到了一份當(dāng)前交易記錄鏈的拷貝。這時小王找到小張:“你看,小紅欠我兩個,你把你手頭那個黃色郵票給我,我把這兩個單位給你,到時候你找小紅要?!?br> 小張說行啊,就給了小王,于是小張這兒的數(shù)據(jù)記錄變成了:
- From 小紅 To 小王 Value : 2 (小紅簽發(fā))
- From 小王 To 小張 Value : 2 (小王簽發(fā))
趁小張和小紅還沒溝通,小王找到小紅:“上次欠我的郵票,還我吧,我要那張黃色的?!?br> 小紅說行啊,于是小紅這里的數(shù)據(jù)記錄變成了:
- From 小紅 To 小王 Value:2 (小紅簽發(fā))
- From 小王 To 小紅 Value:2 (小王簽發(fā))
最后小張找到小紅時才發(fā)現(xiàn)倆人都被小王耍了。這時候,小王已經(jīng)腳底抹油,跑了。
對此,我只能說,小王,你太喪(gan)心(de)病(piao)狂(liang)了。
雖然數(shù)據(jù)記錄都是由本人簽發(fā),但是賬單的不統(tǒng)一給了小王鉆空子的機(jī)會。這個問題怎么解決呢?
最簡單的辦法,每次更新賬單的時候,所有參與人都在場,這樣大家都會同步更新賬單了。但是,這樣太麻煩了,有沒有更好的方案?
分布式共識網(wǎng)絡(luò)機(jī)制
如果我們想把這套機(jī)制用全球郵票交易上,那么每次交易都需要所有人在場是不可能的。我們需要一個系統(tǒng),讓全世界的人,不管地理和時區(qū)差異,都能夠利用非對稱加密在不需要第三方認(rèn)證的情況下可靠交易。
計算機(jī)網(wǎng)絡(luò)可以解決地理和時區(qū)差異,剩下的問題,就是如何保證全網(wǎng)的賬單一致性。
一個方案是采用一個中心數(shù)據(jù)庫記錄所有交易,但是這個中心數(shù)據(jù)庫不就又是一個第三方了嗎,如果數(shù)據(jù)庫被攻擊或者管理員惡意修改怎么辦?
為了去中心化,我們需要一個P2P網(wǎng)絡(luò),也就是節(jié)點之間的地位是平等的,每個節(jié)點都可以存儲一份全局賬單。現(xiàn)在問題是如何保證各個節(jié)點之間賬單一致性。研究表明,P2P網(wǎng)絡(luò)能保證一個“弱一致性”,它可以滿足:
- 會有部分節(jié)點的賬單暫時與全網(wǎng)賬單不同步
- 整個系統(tǒng)最終會統(tǒng)一到一個賬單下來
- 當(dāng)出現(xiàn)賬單沖突(像之前的例子,小王分別和小張小紅各做了一套賬單),最后會按照一個可預(yù)計的方式解決(比如時間在前面的才有效)
對于只是想了解大概的讀者,到這里已經(jīng)可以收工了。
簡單說,在全世界都跑著區(qū)塊鏈節(jié)點的情況下,大家最后總是會統(tǒng)一到一個一致的賬單下。
如果想了解賬單如何一致的可以繼續(xù)閱讀。
如何保證賬單一致 ?
防御sybil攻擊
在分布式系統(tǒng)中取得共識(一致性)的方法,本質(zhì)都是“少數(shù)服從多數(shù)的投票機(jī)制”。這個機(jī)制里有很多設(shè)計,哪些人可以參與投票?每個人投票的權(quán)重一樣嗎?
假設(shè)每個參與者只需要一對密鑰就可以投票,如果某一個惡意參與者通過程序偽造大量密鑰對,試圖達(dá)到大多數(shù)然后修改賬單呢?這就是sybil攻擊。
就好像淘寶交易刷單一樣,通過程序,大量偽造的客戶可以下很多假單,然后刷信譽,怎么辦?有一個辦法,就是讓刷單的行為變得”昂貴“,例如每次下單,淘寶要收一塊錢交易費,這樣刷一萬個信譽是要付出一萬元的成本的。
工作量證明機(jī)制
為了增加難度,我們要求內(nèi)容里必須包含一些簽發(fā)者目前所知的全網(wǎng)賬單的摘要信息,另外,加密后的內(nèi)容里,必須前N位是0。為了達(dá)到這個目標(biāo),消息內(nèi)容里有一個填充字段,提交者可以改這個字段使得加密結(jié)果合格。
現(xiàn)在常用的加密算法是SHA-256,具有相當(dāng)?shù)碾S機(jī)性,也就說,內(nèi)容發(fā)生了一點點變化,加密結(jié)果都會大相徑庭,沒有規(guī)律可循,參與者只能不停的去嘗試直到成功為止。
這個機(jī)制的結(jié)果導(dǎo)致加密一個交易記錄是一個非常費算力的工作,但是認(rèn)證消息仍然非常簡單,首先查看加密內(nèi)容前N位是不是0,然后用簽發(fā)者的公鑰解開就可以解密然后驗證內(nèi)容。
這個機(jī)制如何確保全網(wǎng)賬單的一致性?只是大家提交記錄變費勁兒了而已,那如何識別出那些是偽造的記錄呢?
建立區(qū)塊鏈
在區(qū)塊鏈網(wǎng)絡(luò)中有很多地位相同的節(jié)點,每個節(jié)點都有自己維護(hù)的當(dāng)前賬單,最終以大多數(shù)人持有的賬單作為全網(wǎng)一致性的賬單。那么區(qū)塊鏈技術(shù)是怎么保證全網(wǎng)賬單會收斂到一個統(tǒng)一賬單上的呢?
首先我們了解一下區(qū)塊鏈賬單的數(shù)據(jù)結(jié)構(gòu)到底是什么樣子。上一章節(jié)我們講了,為了防止sybil攻擊,區(qū)塊鏈中每一個記錄要花很多計算力才能生成,普通交易者沒有足夠的計算能力,只能將賬單內(nèi)容簽名后,發(fā)送到網(wǎng)絡(luò)中,尋求別人的幫助,這時候,著名的“礦工”登場了。
礦工一般是有足夠計算能力的節(jié)點,他們會收集很多條交易裝在一起,然后用礦工自己的密鑰,嘗試各種填充位進(jìn)行加密,直到符合前述的數(shù)據(jù)要求,然后就立刻向全網(wǎng)廣播這個block,讓其它節(jié)點知道一個新的block產(chǎn)生了。每一個block里除了包含收集到的交易數(shù)據(jù)之外,還要帶上這個block基于的上一個block的ID,這樣所有的block組成一個blockchain,就是全網(wǎng)賬單,這也就是“區(qū)塊鏈”這個名字的由來。
那么礦工耗費成本去計算block是為了什么?
其實很簡單,每一個交易者發(fā)出交易請求時,需要指定一定的交易費,礦工在組裝完交易記錄后,還會增加一個新的交易記錄到block里,聲明該block里的所有交易費歸自己所有。在比特幣的協(xié)議中有一個巨大的比特幣池,每一個block的第一條記錄還可以聲明從這個池中劃出固定量的比特幣歸該礦工所有,這些利益,就是礦工的動力來源了。
接下來,我們再看看之前描述的那個場景:
- 小王和小張完成了一個交易,把小紅欠自己的兩個單位郵票記在了小張的賬戶下。
- 現(xiàn)在趁著小張還沒跟小紅溝通,小王又找到小紅,要小紅還他兩個單位的郵票。
為了說明整個系統(tǒng)運作流程,假設(shè)小紅同意了,她要求小王先向全網(wǎng)里發(fā)出一條用小王的密鑰簽名的交易記錄,內(nèi)容是給2個單元給小紅(貨到付郵票)。于是小王向交易網(wǎng)絡(luò)里發(fā)出交易記錄,指定交易費,請求別人幫忙將其掛載到全局賬單上。
網(wǎng)絡(luò)上的礦工收集到交易記錄(包括該條),并開始打包這些交易記錄成block,將該記錄附加在他們所認(rèn)為的最新的系統(tǒng)賬單末尾,然后向全網(wǎng)廣播這塊新block的產(chǎn)生。
這里有好幾種情況:
這個人的系統(tǒng)賬單是最新的,也就是,他所知道的全局賬單里,已經(jīng)包含了小王將小紅的欠賬轉(zhuǎn)到小張名下的記錄。
小紅收到新的block,組織成blockchain,計算之后發(fā)現(xiàn)現(xiàn)在反而是小王欠了她兩個單位,她一把揪住小王:“騙子,你已經(jīng)把我的欠賬轉(zhuǎn)到小張名下了!”這個人的系統(tǒng)賬單不是最新的,他不知道小王轉(zhuǎn)了小紅的欠賬到小張那兒。他將小紅這條交易記錄加在新block里,然后添加到他所知道的全網(wǎng)賬單鏈里,然后廣播出去了。
現(xiàn)在網(wǎng)絡(luò)里的全網(wǎng)賬單出現(xiàn)分叉了。假設(shè)在小王和小張的交易發(fā)生之前,全網(wǎng)賬單鏈為b1, b2, .. bi, 收到小張廣播的交易記錄和之后小紅的交易記錄的人,往下構(gòu)造的賬單是b1, b2 ... bi, bz, bh。而沒有收到小張的交易記錄的人,構(gòu)造的賬單是b1, b2, ... bi, bh (漏掉了bz)。這個人的賬單是最新的,他構(gòu)造了一個block A,發(fā)到全網(wǎng),與此同時,另外一個人持有的賬單也是最新的,他也構(gòu)造了一個block B發(fā)到全網(wǎng)。哪一個block才會被承認(rèn)?請注意,因為A B兩個block里都有一條聲明交易費的記錄,所以只有最后承認(rèn)的block的生成者才能“得到”這個交易費用。
這有好幾個問題,所以我們先要澄清一下全網(wǎng)賬單掛載的方式:
競爭機(jī)制
- 任何人都可以在全網(wǎng)幫別人確認(rèn)交易,這也就是類似比特幣的礦工,通過幫人計算確認(rèn)交易,獲得交易費用。
- 個體之前沒有互相協(xié)調(diào)機(jī)制,每個人算出一個block之后都要立刻發(fā)送給他所知道的其它參與者,而其它參與者收到block時,首先用block里附帶的公鑰檢驗內(nèi)容是否正確,如果正確,將該block加到他們的賬單里,然后通知全網(wǎng)。
- 如果收到block的人正在生成block,他只能放棄當(dāng)前工作,將收到block掛到自己的全網(wǎng)賬單里,并且重新生成新的block(記得我們前面提到過,block的內(nèi)容里包括它基于的上一個block,現(xiàn)在最新的block已經(jīng)被收到的block替換了,所以得重新根據(jù)最新的block再次去計算填充值,直到加密結(jié)果符合要求---前面有兩個0)。
這時候有人要問了,我干嘛要丟棄我自己算了半天的成果,我不能無視新收到的block嘛?
另外,像之前提到的,如果兩個人同時發(fā)給我block咋辦?
甚至有人發(fā)給我他以為正確其實錯誤的block(前述例子里的某些人的blockchain都錯了)咋辦?
這里就引入了下一個話題
解決BlockChain沖突
解決方案很簡單:哪個blockchain最長就用哪個。如果節(jié)點收到多個block,并且他們的blockchain長度是一樣的,就需要同時保存這幾個blockchain,在多個chain上同時工作,并且不斷的監(jiān)聽新的block消息,添加到對應(yīng)的chain上,直到最后它知道哪個更長,就立刻轉(zhuǎn)到該chain上往下工作,其它的則被廢棄掉。
這里就涉及到一個重要概念了,每個節(jié)點目前維護(hù)的blockchain,可能是錯的! 也許過了一段時間,它會看到一個更長的chain,那時候它才知道它需要換到那個chain上了。
是不是聽起來很不靠譜?每個節(jié)點維護(hù)自己的chain,互相廣播新的block,感覺會是一團(tuán)亂啊?但是根據(jù)推算,這個鏈會較快的收斂到一個結(jié)果上來。所有節(jié)點不停的廢棄鏈和在鏈尾添加新block,但是鏈身總會穩(wěn)定的收斂到一個一致性的結(jié)果,這都有點哲學(xué)的味道了,不是么?
于是,在之前的例子中,小王發(fā)出交易,小紅開始監(jiān)聽新來的block,首先她要找到包含該交易記錄的block,然后為了保險起見,她又會繼續(xù)監(jiān)聽block,直到發(fā)現(xiàn)有好幾個block鏈在那一條block之后(一般來說,后面接上5個block就基本穩(wěn)定了),也就是說,該block被全網(wǎng)節(jié)點接受了,她可以開始算算自己和小王的賬單了。
如果礦工拿到的chain不是最新的,漏掉了小王和小張的交易,小紅監(jiān)聽到他發(fā)出的block后,又繼續(xù)聽了幾個后續(xù)的block,跟收到的其它礦工發(fā)出的block一比就發(fā)現(xiàn)這個chain比較短,該鏈就被廢棄了,那么小王也沒法忽悠小紅了。同樣,因為被廢棄,該礦工聲明的交易費也拿不到了,選擇大于努力啊。。。
礦工A和B都發(fā)出了正確的block,這個時候就看誰的更快被多數(shù)節(jié)點接受了,這也就是為什么比特幣挖礦這么費機(jī)器的原因,算得越快,越容易被接受,也就能得到更多的比特幣。
無視別人發(fā)來的block的人,很明顯他們的block生產(chǎn)速度慢于別人了,如果不立刻轉(zhuǎn)到新block上,只會導(dǎo)致自己剩下的全部都是無用功。。嗯,這好像也跟哲學(xué)吻合了,請不要閉門造車,掩耳盜鈴了。。
在這個情況下,小王如何耍詭計呢?他只能在他給小張2個單位的交易記錄的block(假設(shè)為Block A)被接收后(也就是說,已經(jīng)有了多個block掛載在該block后了),構(gòu)造一個假的block鏈在Block A之前的block后,并且不停的構(gòu)造block使得這個假chain的長度超過目前全局鏈的長度。這樣他的chain就成了公認(rèn)的,并且沒有他跟小張的交易信息。
這個方案可行不可行呢?可行,但是全網(wǎng)里其它人一收到小王最早的交易信息后就開始往下擴(kuò)充了,小王要欺騙他們換到自己偽造的chain上來,就需要比他們算的都快,快到什么程度呢?目前數(shù)學(xué)給出的答案是,要能戰(zhàn)勝全網(wǎng)50%的算力才行。一旦P2P網(wǎng)絡(luò)到了成千上萬個的節(jié)點時,想達(dá)到這個算力是不可能的,這也就是比特幣自稱去中心化的基礎(chǔ)。
結(jié)尾
剛剛這個交易網(wǎng)絡(luò),其實就是blockchain的原型。它的價值絕不僅僅是比特幣這個產(chǎn)物,換句話說,如果我們在每個block里存儲的內(nèi)容不是transaction,而是別的東西呢?它就演化成了一個分布式的,無法被偽造的存儲系統(tǒng),特別是,在blockchain上演化出的新功能“智能合約”,就將合約的執(zhí)行融合到了分布式網(wǎng)絡(luò)中,比如,小王和小紅打了賭,如果明天是晴天,小王就給小紅4個單位。于是小王和小紅認(rèn)定了一個權(quán)威的天氣機(jī)構(gòu),生成了一個交易信息放到blockchain里,不過該交易是有條件的,等到第二天,是晴天了,該權(quán)威機(jī)構(gòu)用自己的私鑰簽發(fā)了一個晴天的消息到blockchain里,網(wǎng)絡(luò)里無數(shù)的確認(rèn)者就用該天氣機(jī)構(gòu)的公鑰確認(rèn)了晴天的消息后,執(zhí)行了小王向小紅的轉(zhuǎn)賬,并且將該block提交到網(wǎng)絡(luò)中。這個過程完全自動不可逆,不可偽造。
這也就是為什么很多銀行和金融機(jī)構(gòu)開始對blockchain感興趣的原因。在這個機(jī)制下,很多交易的中間環(huán)節(jié)可以被省掉了,這將會極大的節(jié)省金融體系運作成本,提高工作效率。
QQ群:654894791
微信公眾號: 94ETH
官網(wǎng): https://www.94eth.com
頭條號: 周期與泡沫