友情提醒:比特幣采用區塊鏈技術,但是區塊鏈并不等同于比特幣;全篇基于比特幣底層區塊鏈技術講述,所以,部分模型可能不適用于以太坊等。另外,由于文章采用了一定的抽象、類舉的敘事方式,中間或多或少有些地方會跟區塊鏈底層嚴謹的技術實現有出入,如果讓你覺得困惑,可以在評論下方留言或者私信我一起探討。最后,也是受限于自己知識結構的不完整,這篇文章會隨著我對區塊鏈更深入認識后,隨時進行修訂,最后更新時間可參考該回答下方的時間戳。


另外,作為一篇科普性文章,大家可以隨意轉載,注明這篇文章的出處和作者即可,無需再單獨私信詢問。


首先不要把區塊鏈想的過于高深,他是一個分布在全球各地、能夠協同運轉的數據庫存儲系統,區別于傳統數據庫運作——讀寫權限掌握在一個公司或者一個集權手上(中心化的特征),區塊鏈認為,任何有能力架設服務器的人都可以參與其中。來自全球各地的掘金者在當地部署了自己的服務器,并連接到區塊鏈網絡中,成為這個分布式數據庫存儲系統中的一個節點;一旦加入,該節點享有同其他所有節點完全一樣的權利與義務(去中心化、分布式的特征)。與此同時,對于在區塊鏈上開展服務的人,可以往這個系統中的任意的節點進行讀寫操作,最后全世界所有節點會根據某種機制的完成一次又依次的同步,從而實現在區塊鏈網絡中所有節點的數據完全一致。 




上圖中,高亮的點就是區塊鏈系統中分布在全球各地的一個個節點;而這些節點可以簡單理解為一臺服務器服務器集群


# 問題的由來

我們反復提到區塊鏈是一個去中心化的系統,確實,「去中心化」在區塊鏈世界里面是一個很重要的概念,很多模型(比如賬本的維護、貨幣的發行、時間戳的設計、網絡的維護、節點間的競爭等等等等)的設計都依賴于這個中心思想,那到底什么是去中心化呢?在解釋真正去中心化之前,我們還是先簡單了解下什么是中心化吧。


中心化?


回憶一下你在網上購買一本書的流程:

  1. 第一步,你下單并把錢打給支付寶;

  2. 第二步,支付寶收款后通知賣家可以發貨了;

  3. 第三步,賣家收到支付寶通知之后給你發貨;

  4. 第四步,你收到書之后,覺得滿意,在支付寶上選擇確認收貨;

  5. 第五步,支付寶收到通知,把款項打給賣家。流程結束。


你會發現,雖然你是在跟賣家做交易,但是,所有的關鍵流程都是在跟支付寶打交道。這樣的好處在于:萬一哪個環節出問題,賣家和買家都可以通過支付寶尋求幫助,讓支付寶做出仲裁。這就是一個最簡單的基于中心化思維構建的交易模型,它的價值顯著,就是建立權威,通過權威背書來獲得多方的信任,同時依賴權威方背后的資本和技術實力確保數據的可靠安全。


你一定會擺出一個巨大的問號臉 ⊙.⊙?——“通過權威背書來獲得多方的信任,同時依賴權威方背后的資本和技術實力確保數據的可靠安全”,真的可以嘛?!


假如說,支付寶程序發生重大BUG,導致一段時間內的轉賬記錄全部丟失,或者更徹底一點,支付寶的服務器被ISIS恐怖組織的一個導彈全部炸毀了。而我剛剛轉出去的100元找誰說理去,這個時候,你就成了刀殂上的魚肉;支付寶有良心,會勉為其難承認你剛剛轉賬的事實,但他不承認你也沒轍,因為確實連他自己也不知道這筆轉賬是否真實存在。


上述就是中心化最大的弊端——過分依賴中心和權威,也就意味著逐漸喪失自己的話語權。


去中心化?


那么去中心化的形態是什么樣子呢?還是拿剛才那個例子繼續,我們構建一個極簡的去中心化的交易系統,看看我們是如何在網絡上從不認識的賣家手里買到一本書的。

  1. 第一步,你下單并把錢打給賣家;

  2. 第二步,你將這條轉賬信息記錄在自己賬本上;

  3. 第三步,你將這條轉賬信息廣播出去;

  4. 第四步,賣家和支付寶在收到你的轉賬信息之后,在他們自己的賬本上分別記錄;

  5. 第五步,賣家發貨,同時將發貨的事實記錄在自己的賬本上;

  6. 第六步,賣家把這條事實記錄廣播出去;

  7. 第七步,你和支付寶收到這條事實記錄,在自己的賬本上分別記錄;

  8. 第八步,你收到書籍。至此,交易流程走完。


剛才“人為刀俎我為魚肉”的情況在這個體系下就比較難發生,因為所有人的賬本上都有著完全一樣的交易記錄,支付寶的賬本服務器壞了,對不起賣家的賬本還存在,我的賬本還存在;這些都是這筆交易真實發生的鐵證。


當然,在這套極簡的交易系統中,你已經發現了諸多漏洞和不理解,比如說三方當中有一個是壞人,他故意記錄了對他更有利的轉賬信息怎么辦;又比如說消息在傳遞過程中被黑客篡改了怎么辦等等等等。這在以往的計算機概論或者計算機網絡書本上中可能都有提及到——“類兩軍”和“拜占庭將軍”問題。這里就不打算贅述,因為暫時跟主線不相關,感興趣的同學可以去Google或者百度一下,你只需要知道,在我們下面即將展開講到的區塊鏈系統中,通過巧妙的設計,足以解決上述存在的BUG。


既然話已說到這份上,相信了解一點技術、特別是有運維背景的同學大概能夠從極簡交易系統中窺視到了更多區塊鏈的一些影子——

  1. 分布式存儲,通過多地備份,制造數據冗余

  2. 讓所有人都有能力都去維護共同一份數據庫

  3. 讓所有人都有能力彼此監督維護數據庫的行為


在我看來,你猜測的基本上沒錯。其實這些就是區塊鏈技術最核心的東西,外人看起來高大上、深不可測,但探究其根本發現就是這么簡單和淳樸。當然,這里面肯定會有很多很多很多細枝末節的技術需要重構。


如果你差不多認同上面的觀點,那我們應該基本上可以達成共識,分布式部署肯定是構建去中心化網絡理所當然的解決方向——通過P2P協議將全世界所有節點計算機彼此相互連接,形成一張密密麻麻的網絡;以巧妙的機制,通過節點之間的交易數據同步來保證全球計算機節點的數據共享和一致。


哈哈,說的輕巧,“交易數據這么重要的東西,在一個完全不信任的P2P網絡節點中以一種錯綜復雜的方式傳遞,數據的一致性和安全性誰來保證,如果說互相監督,他們到底怎么做到?”


好了,不賣關子了,下面讓我們圍繞這個最最最最直接的問題開始進入到真正區塊鏈的世界,抽絲剝繭看看它到底是如何一步一步形成的,又是如何一步一步穩定運轉。


# 從全球節點到交易數據



這張圖的制作的意義為的是幫助你在宏觀上先快速理解區塊鏈中所涉及到的相關名詞以及他們的層級關系。同時,文章的知識結構和設計思路也大抵上也會按照:

  1. 首先,將區塊作為最小單位體,講述極簡區塊鏈系統是如何運轉的;

  2. 接著,進入到比區塊更小單位體——交易記錄,理解區塊鏈是如何處理數據的;

  3. 最后,將所有知識點柔和在一起,重回到區塊和區塊鏈,完整講述整個工作流程。


希望你在這個引導和結構下有一個比較好的閱讀體驗。Let's go~


# 區塊,混沌世界的起源


既然已經達成共識,所以,我們事先構建好了一個去中心化的P2P網絡;同時,為了讓讀者朋友們聽起來更輕松,我先粗暴的規定在這個極簡的區塊鏈系統里,每十分鐘有且僅產生一筆交易。


故事繼續,在節點的視野里,大概每十分鐘會憑空產生一個建立在自己平行宇宙世界的神奇區塊(你可以將區塊想象為一個盒子),這個區塊里放著一些數字貨幣以及一張小紙條,小紙條上記錄了這十分鐘內產生的那唯一一筆交易信息,比如說——“小A轉賬給了小B100元”;當然,這段信息肯定是被加密處理過的,為的就是保證只有小A和小B(通過他們手上的鑰匙)才有能力解讀里面真正的內容。


這個神奇的區塊被創造出來之后,很快被埋在了地底下,至于埋在哪里?沒有一個人不知道,需要所有計算機節點一起參與進來掘地三尺后才有可能找到(找到一個有效的工作量證明)。顯然,這是一件工作量巨大、成果隨機的事件。但是呢,對于計算機節點來說,一旦從地底下挖出這個區塊,他將獲得區塊內價值不菲的數字貨幣,以及“小A轉賬給了小B100元”過程中小A所支付的小費。同時,對于這個節點來說,也只有他才有權利真正記錄小紙條里的內容,這是一份榮耀,而其他節點相當于只能使用它的復制品,一個已經沒有數字貨幣加持的副本。當然這個神奇的區塊還有一些其他很特別的地方,后面我們會再細細聊。


為了更好的描述,我們將計算機節點從地底下挖出區塊的過程叫做「挖礦」,剛才說了,這是一件工作量巨大、運氣成分較多、但收益豐厚的事兒。


過了一會兒,來自中國上海浦東新區張衡路上的一個節點突然跳出來很興奮的說:“ 我挖到區塊了!里面的小紙條都是有效的!獎勵歸我!” 。雖然此刻張衡路節點已經拿到了數字貨幣,但對于其他計算機節點來說,因為這里面還涉及到其他一些利益瓜葛,他們不會選擇默認相信張衡路節點所說的話;基于陌生節點彼此不信任的原則,他們拿過張衡路節點所謂挖到的區塊(副本),開始校驗區塊內的小紙條信息是否真實有效等等。在區塊鏈世界里,節點們正是通過校驗小紙條信息的準確性,或間接或直接判斷成功挖出區塊的節點是否撒謊。(如何定義小紙條信息真實有效,后面會講解,這里暫不做贅述)。


在校驗過程中,各個節點們會直接通過下面兩個行為表達自己對張衡路節點的認同(準確無誤)和態度:

  • 停止已經進行了一半甚至99.99%的挖礦進程;

  • 將張衡路節點成功挖出的區塊(副本)追加到自己區塊鏈的末尾。


你可以稍微有點困惑:停止可能已經執行了99.99%的挖礦行為,那之前99.99%的工作不是就白做了嘛?!然后,區塊鏈的末尾又是個什么鬼東西?


對于第一個困惑。我想說,你說的一點沒錯,但是沒辦法,現實就是這么殘酷,即便工作做了99.99%,那也得放棄,這99.99%的工作勞苦幾乎可以視為無用功,絕對的傷財勞眾。第二個困惑,區塊鏈和區塊鏈的末尾是什么鬼?這里因為事先并沒有講清楚,但是你可以簡單想象一下:區塊是周期性不斷的產生和不斷的被挖出來,一個計算機節點可能事先已經執行了N次“從別人手上拿過區塊 -> 校驗小紙條有效性”的流程,肯定在自己的節點上早已經存放了N個區塊,這些區塊會按照時間順序整齊的一字排列成為一個鏈狀。沒錯,這個鏈條,就是你一直以來認為的那個區塊鏈。如果你還是不能夠理解,沒關系,文章后面還會有很多次機會深入研究。


# 走進區塊內,探索消息的本質


上面我們構建了一個最簡單的區塊鏈世界的模型,相信大多數同學都已經輕松掌握了。但是別驕傲也別著急,這還只是一些皮毛中的皮毛,坐好,下面我們準備開車了。


前面我們說到“大概每十分鐘會憑空產生一個神奇的區塊,這個區塊里放了一張小紙條,上面記錄了這十分鐘內產生的這唯一一筆交易信息”。顯然,十分鐘內產生的交易肯定遠不止一條,可能是上萬條,這上萬條數據在區塊鏈世界是如何組織和處理的呢?另外,為什么在紙條上記錄的只是某一次的交易信息,而不是某一個人的余額?余額好像更符合我們現實世界的理解才對。


既然存在這樣那樣的疑問。現在我們就把視線暫時從“區塊”、“區塊鏈”這些看起來似乎較大實體的物質中移開,進入到區塊內更微觀的世界里一探究竟,看看小紙條到底是怎么一回事,它的產生以及它終其一生的使命:

  1. 發起交易的時候,發起人會收到一張小紙條,他需要將交易記錄比如說“盜盜轉賬給張三40元”寫在紙上。說來也神奇,當寫完的那一剎那,在小紙條的背面會自動將這段交易記錄格式化成至少包含了“輸入值”和“輸出值”這兩個重要字段;“輸入值”用于記錄數字貨幣的有效來源,“輸出值”記錄著數字貨幣發往的對象。

  2. 剛剛創建的小紙條立馬被標記成為“未確認”的小紙條。從地下成功挖出區塊并最終連接到區塊鏈里的小紙條一開始會被標記為“有效”。若這條有效的小紙條作為其他交易的輸入值被使用,那么,這個有效的小紙條很快會被標記為“無效”。因為各種原因,區塊從鏈上斷開、丟棄,曾經這個區塊內被標記為“有效”的小紙條會被重新標記為“未確認”。

  3. 區塊鏈里面沒有賬戶余額的概念,你真正擁有的數字資產實際上是一段交易信息;通過簡單的加減法運算獲知你數字錢包里的余額。


上面的1、2、3僅僅作為結論一開始強行灌輸給你的知識點,其中有幾個描述可能會有點繞,讓你覺得云里霧里,沒有關系,因為我們立刻、馬上就開始會細說里面的細枝末節。



上圖就是從無數打包進區塊內的小紙條中,抽取出來的一張,以及它最終被格式化后的縮影。單看右側的圖可能很容易產生誤會,雖然看起來有多行,但實際上就是“盜盜轉賬給張三40個比特幣”這一條交易數據另外的一種呈現形態。因為區塊鏈世界里面這么規定,每一條交易記錄,必須有能力追溯到交易發起者 發起這筆交易、其中所涉及金額的上一筆全部交易信息;即這筆錢從何而來的問題。這其實很容易理解,在去中心化的網絡中,通過建立交易鏈、和通過交易鏈上的可溯源性間接保證數據安全和有效。


我們繼續看,在區塊鏈世界里,我們是如何僅通過“盜盜轉賬給張三40個比特幣” 這條交易信息完成轉賬流程的。其實跟現實中你在路邊買一個包子的流程大抵上相同。


第一步:判斷是否有足夠的余額完成交易

這里我們再一次重申,在比特幣的區塊鏈世界里是沒有余額的概念(以太坊的底層區塊鏈有余額概念),余額是通過簡單數字的加減最終獲得,你擁有所謂的數字貨幣實際上是因為你擁一條交易記錄,即 “盜盜轉賬給張三40個比特幣”!這里,我們還是拿這條記錄說事:


追溯“輸出值”是“盜盜”相關的全部有效交易記錄作為,對有效交易中的數字進行簡單求和,判斷是否大于等于40,如果確實大于等于,則將這些有效的交易記錄合并形成一條新的交易記錄(如下圖)。如果小于40,其實可以不需要再繼續往下探討。


就上圖的例子,我們追溯到曾經轉賬給盜盜的有效交易記錄有“小A轉賬給盜盜10 btc”、“小B轉賬給盜盜20 btc”、“小C轉賬給盜盜 25 btc”,我們需要將這三條交易記錄合并成一條更復雜描述的交易記錄,即 “( 小A轉賬給盜盜10 btc + 小B轉賬給盜盜20 btc + 小C轉賬給盜盜 25 btc ) 轉賬給張三40 btc ”


第二步:判斷是否需要找零

對追溯到的有效交易數字求和,如果發現大于需要支付的金額,需要將多出的數字重新支付給自己,相當于找零。對應生成了一條全新的交易記錄(如下圖)。


就上圖例子來說,我們最后合并成的交易記錄 “( 小A轉賬給盜盜10 btc + 小B轉賬給盜盜20 btc + 小C轉賬給盜盜 25 btc + 盜盜轉賬給盜盜15 btc ) 轉賬給張三40 btc ” 事實上等同于“盜盜轉賬給張三40 btc”。其中“盜盜轉賬給盜盜15 btc”就可以理解找零。


第三步:發出去,讓全球節點認同和備份小紙條

這條內部重新處理過的復雜交易記錄被塞進區塊,埋到地下,等待節點挖出來,一旦區塊被挖礦成功,并且該區塊最終被連在了區塊鏈的主鏈上。張三將最終擁有了這條交易記錄,而先前的“小A轉賬給盜盜10 btc” 、“小B轉賬給盜盜20 btc” 、“小C轉賬給盜盜25 btc”都將被視為已經使用過的交易記錄——從此被貼上“無效”的標簽,意味著這些交易記錄將永遠不會再被追溯到。


我們最后一次重申,只是希望讓你加深印象:擁有數字貨幣=擁有交易記錄!


通過設計巧妙的精巧密碼學保證數據安全


記錄著交易信息的小紙條借助區塊這個載體,在分布式的網絡中以不同的軌跡錯綜復雜的傳遞,我們前面說了,你真正擁有的數字資產實際上是一段交易信息,而不是你常規意義上理解的貨幣。所以這個過程就需要重點解決兩個問題:

  • 接受到的這條交易記錄在傳輸過程沒有被其他人所篡改

  • 接受到的這條交易記錄確實是由發起交易的人所創造


在這里,我們需要事先引入兩個知識點,可能稍微有點難消化,但都是計算機領域較為成熟的和基礎的概念。


第一個知識點:SHA256()函數。你只需要知道,任意長度的字符串、甚至文件體本身經過SHA256函數工廠的加工,都會輸出一個固定長度的字符串;同時,輸入的字符串或者文件稍微做一丟丟的改動,SHA256() 函數給出的輸出結果都將發生翻天覆地的改變。注意,SHA256()函數是公開的,任何人都能使用。


第二個知識點:非對稱加密。你也只需要了解,任何人手里都有兩把鑰匙,其中一把只有自己知道,叫做“私鑰”,以及一把可以公布于眾,叫做“公鑰”;通過私鑰加密的信息,必須通過公鑰才能解密,連自己的私鑰也無解。公鑰可以通過私鑰生成多把。


有了這些知識點的加持,上面兩個問題開始變得有解。下面我們來看下內部是如何扭轉和工作的吧,這里拿“小A 轉賬給了小B 100元錢” 舉例:




  1. 第一步:小A會先用SHA256函數對自己的小紙條進行處理,得到一個固定長度的字符串,這個字符串就等價于這張小紙條。

  2. 第二步:小A使用只有自己知道的那一把私鑰,對上面固定長度的字符串進行再加密,生成一份名叫數字簽名的字符串,這份數字簽名能夠充分證明是基于這張小紙條的。你可以這么理解,在現實中,你需要對某一份合同的簽署,萬一有人拿你曾經在其他地方留下的簽名復制粘貼過來怎么辦?!最好的辦法,就是在你每一次簽名的時候,故意在字跡當中留下一些同這份合同存在某種信息關聯的小細節,通過對小細節的觀察可以知道這個簽名有沒有被移花接木。步驟一和步驟二的結合就是為了生成這樣一份有且僅針對這條小紙條有效的簽名。

  3. 第三步:小A將「明文的小紙條」、剛剛加密成功的「數字簽名」,以及自己那把可以公布于眾的「公鑰」打包一起發給小B。

  4. 第四步:當小B收這三樣東西,首先會將明文的小紙條進行SHA256()處理,得到一個字符串,我們將其命名為“字符串2”。然后,小B使用小A公布的公鑰,對發過來的數字簽名進行解密,得到另外一個“字符串1”。通過比對“字符串1”和“字符串2”的一致性,便可充分證明:小B接受到的小紙條就是小A發出來的小紙條,這張小紙條在中途沒有被其他人所篡改;且這張小紙條確實是由小A所編輯。


可以看得出來,加解密的過程幾乎是一環套一環,中途任何環節被篡改,結果都是大相徑庭。借助這一連串的機制,其實已經能夠很好的在公開、匿名、彼此不信任的分布式網絡環境中解決數字交易過程中可能遇到的很多問題。這個環節可能確實有點難理解,現在,我需要你停下來,靜下心,花上幾分鐘閉目慢慢回味其中設計精湛的地方。


掌握了這部分知識以后,我們在這里回答一下前面沒有解釋清楚的問題,「節點對區塊的檢驗」檢驗的到底是什么?實際上就是:

  • 檢驗區塊內的交易記錄簽名是否準確(是否被篡改)

  • 檢驗區塊內的交易記錄輸入值是否“有效”(是否使用過)

  • 檢驗區塊內的交易記錄輸入值的數字之和是否大于等于輸出值的數字


# 重回“區塊”和“區塊鏈”的世界


好了,對小紙條和交易記錄的研究我們點到為止,其實信息量已經是巨大的了,讓我們合上蓋子,重回較大的實體、繼續聊聊“區塊”和“區塊鏈”的話題。還記得,咱們在一開始講到關于區塊的特征嗎?區塊創造后被埋在地下,需要經過節點們馬不停蹄的挖采、而且是憑運氣的挖采才有可能獲得——不僅僅如此,事實上他還有其他很多神奇的地方,比如說:

  1. 憑空產生的區塊在剛剛創建的時候會形成一股強大的黑洞效應,它會嘗試將這段時間全世界各個節點上產生的所有小紙條(交易記錄)統統吸進來;在合上區塊蓋子之前,同時會在區塊內放上一些數字貨幣以及其他一些東西。

  2. 區塊擁有一個唯一的ID,但它只會在這個區塊被節點成功從地下挖出來之后創建。這個ID至少會跟「區塊內所有小紙條的集合」、「即將與之相連的上一個區塊ID」以及「挖礦節點的運氣值」等因素相關。既然前面我們已經簡單了解了“SHA256()函數”這個東西,這里不妨透露給大家:“區塊ID = SHA256(‘區塊內所有小紙條的集合’+’即將與之相連的上一個區塊ID’+‘挖礦節點的運氣值’+’…’)” ;基于先前掌握的知識,然后你應該知道區塊內任意一張小紙條的信息稍微做改動、或者節點挖礦運氣好一點壞一點等等,當前區塊的ID都會 “ biu~ ”的發生改變。


基于上述1、2點,如果閱讀足夠仔細的同學可能會有些頭大。在文章開頭為了更好的描述,我在設計簡化區塊鏈系統的時候故意模棱兩可了幾個概念,這也許已經誤導到了部分同學。這里不得不停下來和你一起修正下之前在你大腦中已經構建的區塊鏈世界觀。我們前面講道,“在節點的視野里,大概每十分鐘會憑空產生一個建立在自己平行宇宙世界的神奇區塊”。如何正確去理解這句話呢?——擁有上帝之眼的你,可以這么拆解問題、看待問題:

  1. 同一個周期內,全網并不是產生唯一的一個區塊等待挖掘;每個節點事實上都在周期性的創造區塊和挖出區塊;只是在某一個節點的視野里,它不能感知到另外一個節點上區塊的產生。為何這里要特別強調“在某一個節點的視野里”,就是因為我們剛剛講到,從區塊的視角來說,區塊的憑空產生,是基于即將與之相連的上一個區塊ID;而從節點的視角來看,區塊的憑空產生是基于當前節點區塊鏈末尾的那個區塊ID產生的。

  2. 全網會盡力控制在一個周期內只有一個節點能夠成功挖出區塊,但是不能夠完全避免多個節點同時挖出區塊的可能性;如何盡力控制?比如說,當大伙挖礦的熱情高漲、工作效率提高,區塊會被埋在更深更廣的地方等。簡而言之,通過提高工作難度,來維持這個平衡。另外,值得注意的:產生區塊、挖出區塊、校驗區塊,他們的時間周期近乎相同。


對于想從技術角度更加深入理解“區塊”、“挖礦”本質的同學們,你們可以移步至我的專欄《盜亦有道》,其中涉及到一些比較復雜的數學和技術細節,相信閱讀完那部分內容之后,你對區塊鏈會有更加透徹的認知。當然,對于絕大多數的吃瓜群眾,看完那邊內容可能會讓你更加困惑,如果你不是十分的喜歡追根究底的話,我建議你還是直接選擇跳過那塊吧。至少在我看來,即便少了那部分內容,也不影響我們去理解區塊鏈的魅力。


分叉


現在,我們終于對“區塊”這個概念有了更全面的認識,文章開頭講的故事就可以繼續展開來絮叨絮叨:


假如幾乎同一時間,「中國上海浦東新區張衡路」上的節點和「美國紐約曼哈頓第五大道」上的節點異口同聲喊出來:“我挖到區塊了!里面的小紙條都是有效的!獎勵歸我!”。其他節點也幾乎同時參與了對這兩個區塊的校驗,結果發現這倆都沒毛病,各節點也開始犯困,因為在他們的視野里他們并不清楚最后哪一個區塊應該會被主鏈接納。算了!都連在自己區塊鏈尾巴上吧,這時尷尬了,區塊鏈硬生生的被分叉了!



產生分叉



你肯定在想,那還得了,這種情況繼續下去,每個節點的區塊以及他們整理維護的小紙條都將變得不一樣,這已經嚴重違背了區塊鏈世界里第一大最基本原則——所有節點共同維護同一份數據。所以,為了解決這個問題,區塊鏈世界引入了一條新的規則——擁有最多區塊的支鏈將是真正被認可有價值的,較短的支鏈將會被直接Kill掉。


我們大伙都知道挖礦的過程存在巨大的工作量(如果沒有任何難度,把區塊扔在人群中,必然同一時間發現區塊的節點數量將大大增加,也就會產生無數的支鏈,通過這個例子,你大概也就能夠明白,區塊鏈世界為什么需要設置工作難度了吧),并且在計算機的硅基世界里,不可能出現所謂 “同時” 的概念,哪怕納秒的差別,那也總是會有先后順序。所以理論上,“分叉”的這種僵局很快會在下一個區塊被挖掘出來(以及校驗區塊)的時候被打破,實在不行下下個,或者下下下個……總之機制可以讓整個分叉的區塊鏈世界迅速穩定下來。


“分叉”這種僵局在確認下一個區塊(以及校驗小紙條)的時候被打破,從而整個區塊鏈世界迅速穩定下來


就上圖而言,所有基于張衡路節點挖礦獲得的區塊以及后續區塊的那條分支被視為有價值,最終會全部保留了下來;其他節點會統一效仿那個擁有更長分支鏈的節點所做的決策。另外,值得一提的是,同一時間,較短分支上的區塊會立即丟棄,而里面的小紙條也會隨之釋放出來,被重新標記上“未確認”。


“雙花”與“51%攻擊”


你可能已經開始困惑或者有點興奮,末尾幾個區塊的排序在修復過程中,因為時間差肯定會產生一些模棱兩可的地方,這往往會給數據安全埋下一顆雷。一個最簡單的假設——我記錄的一張小紙條很不巧地被歸在了一條較短的支鏈上,這條支鏈在競爭過程中理所當然輸掉了比賽,區塊被丟棄、小紙條被無情的貼上“未確認”的標簽。在等待下次區塊重新確認的過程中,這個時間差內,我,好像、似乎可以做點什么壞事 ?(ˉ﹃ˉ?) ,就比如說“雙花”(雙花,花兩次,雙重支付的意思)


你腦海中也許很快浮過的這樣的構想,可不可能通過下面這種方法觸發雙花問題的產生,從而讓我不勞而獲:


  1. 假設有一個名叫X-Man的壞家伙,他控制了一個計算機節點,這個節點擁有比地球上任何一個節點算力都強大的計算機集群。

  2. 首先,X-Man事先創造了一條獨立的(不去廣而告之)、含有比較多區塊的鏈條。其中一個區塊里放著“X-Man轉賬給X-Man 1000元”的紙條。

  3. 接著,X-Man跟張三購買了一部手機,他在小紙條上記錄下“X-Man轉賬給張三1000元”;這條信息被三次確認后(即三個區塊被真實挖出、校驗和連接),然后,張三把手機給了X-Man。

  4. X-Man拿到手機之后,按下機房的開關,試圖將先前已經創造的區塊鏈條連接在自己這個節點區塊鏈的末尾。

  5. 大功告成,X-Man擁有了一條更長的區塊鏈條,那些較短、存放著“X-Man轉賬給張三1000元”的區塊鏈,以及在區塊鏈世界里那則真實轉賬行為被一同成功銷毀。(?)


事實真的如此嗎?在這里我可以很負責任的說,too young too simple,區塊鏈世界規則的制定遠比我們想象的要健全很多,還記得我們之前講的“區塊的ID至少會跟區塊內所有小紙條的集合、即將與之相連的上一個區塊ID以及挖礦節點的運氣值等因素相關”。 在這里,正是因為打算連接到主鏈的時候,事先準備的鏈子會意識到馬上要連接上的那個區塊ID發生了改變,隨之而來的是后面所有區塊ID都瞬間。節點不得不重新對后續區塊的解鎖以及對區塊內小紙條的校驗。 


在區塊鏈的世界,重新計算的行為等同于把自己(節點)置身于同一個起跑線,跟世界上其他所有的節點一同競爭挖礦。你會說,我擁有更強大的計算能力,但是對不起,跟你競爭的對象并不是第五大道、南京西路、香榭麗舍大道上的某一個節點,而是全球所有算力的集合,在這個集合中,你擁有的算力永遠都只是一個很小的子集。所以,根據區塊鏈算力民主、少數服從多數的基本原則,這個構想將永遠不會成立。


除非....


你控制著全球51%的算力,這也就是區塊鏈世界里另外一個著名的概念,叫做“51%攻擊”,但這也僅僅是一個理論值,在真實世界里這樣的攻擊我個人覺得是很難發動起來的,這里面就牽涉到很多經濟、哲學甚至政治的因素。舉個最簡單的例子:X-Man為了回滾剛剛發生的一筆交易記錄,成功發起了51%攻擊,這意味著很快整個區塊鏈系統將會崩盤,因為這次攻擊已經嚴重傷害到人們對這套系統的信任,接著比特幣開始暴跌至幾乎一文不值;但是這個擁有51%算力的X-Man原本完完全全可以通過挖礦的方式獲取更多收益,購買無數的iPhone手機。那他不是腦袋不是壞了還能是啥?對51%攻擊話題感興趣的同學可以閱讀這篇文章《什么是比特幣51%攻擊?》。


至此,我覺得區塊鏈最基礎、最核心的知識已經全部講完了(除了挖礦內部實現原理,作為一個遺憾留在這里,有時間會完善掉),相信你已經對它有了一個宏觀的認識。另外,由于這篇文章采用了適當抽象、類舉的敘事方式,中間或多或少有些地方會跟區塊鏈底層嚴謹的技術實現有出入,歡迎大家來糾錯。另外,也是受限于自己知識結構的缺失,這篇文章會隨著我對區塊鏈更深入認識后,隨時進行修訂,最后更新時間可參考該回答下方的時間戳。


問答部分


去中心化的系統中,到底是誰在發行貨幣?是無限量發行嗎?

比特幣的貨幣是通過挖礦(工作量證明)來發行的,總數量是通過程序寫死了2100萬個,而第一筆區塊獎勵也是硬編碼寫死的。礦工挖出一個區塊所獲得的獎勵,每隔21萬個區塊將減少一半,按照平均10分鐘挖出一個區塊的執行效率,也就就說差不多每四年會銳減一次。2009年1月起每個區塊獎勵50個比特幣,2012年11月減半為每個區塊25個比特幣,2016年7月減半為12.5個比特幣。基于這個規則,到2140年,所有比特幣(20,999,999,980)將全部發行完畢,之后不會再有新的比特幣產生。


礦工節點的收益除了挖出區塊以外還有哪些?

礦工節點的收益主要由兩部分組成:1)挖出新區塊的獎勵;2)挖出新區塊內所含交易的交易費。但就目前來說,一個區塊內的交易費大概只占到礦工總收入的0.5%甚至更少,大部分收益主要還是來自于挖礦所得的比特幣獎勵。然而,隨著挖礦獎勵的遞減,以及每個區塊中包含的交易數量增加,交易費在礦工收益中所占的比重將會逐漸增加。在2140年之后,所有的礦工收益將完全由交易費構成。

2018年05月02日

區塊鏈到底是什么?和普通人有什么關系?
區塊鏈技術是什么?未來可能用于哪些方面?

區塊鏈是什么,如何簡單易懂地介紹區塊鏈?

發布時間:

上一篇:
下一篇:
大神彩票官网 敦化市 | 时尚 | 石阡县 | 个旧市 | 安康市 | 庆城县 | 江达县 | 长沙市 | 东兴市 | 阳朔县 | 开封县 | 临邑县 | 运城市 | 广元市 | 石家庄市 | 新巴尔虎左旗 | 三门峡市 | 弋阳县 | 筠连县 | 江津市 | 高密市 | 靖宇县 | 定州市 | 民丰县 | 呼玛县 | 淮北市 | 都兰县 | 扬中市 | 临沧市 | 新泰市 | 永宁县 | 丰镇市 | 漳平市 | 鲁甸县 | 永德县 | 浦北县 | 隆安县 | 山丹县 | 思南县 | 建阳市 | 长治市 | 白朗县 | 南昌县 | 安阳县 | 囊谦县 | 互助 | 安岳县 | 蓬安县 | 高雄市 | 邹平县 | 信宜市 | 科技 | 虞城县 | 安西县 | 沙雅县 | 自贡市 | 大悟县 | 民县 | 贵阳市 | 淮阳县 | 安新县 | 丰原市 | 新泰市 | 大方县 | 福清市 | 竹北市 | 达拉特旗 | 卫辉市 | 定边县 | 定襄县 | 昔阳县 | 武安市 | 大同市 | 长海县 | 固镇县 | 亚东县 | 盐源县 | 米林县 | 浦城县 | 哈密市 | 郁南县 | 阜阳市 | 米易县 | 广西 | 龙泉市 | 昌吉市 | 东丰县 | 于都县 | 昭觉县 | 博白县 | 从化市 | 重庆市 | 鲁甸县 | 涟源市 | 五莲县 | 沽源县 | 巍山 | 克什克腾旗 | 德惠市 | 阿勒泰市 | 获嘉县 | 民勤县 | 莱芜市 | 荣昌县 | 文化 | 吉木乃县 | 疏附县 | 阆中市 | 五指山市 | 荣昌县 | 封开县 | 青浦区 | 棋牌 | 大安市 | 珲春市 | 永平县 | 弥勒县 | 辽宁省 | 澄迈县 | 南和县 | 汶上县 | 潮安县 | 宁安市 | 虎林市 | 桂阳县 | 应城市 | 蒙城县 | 繁峙县 | 沙雅县 | 望谟县 | 浪卡子县 | 翼城县 | 克拉玛依市 | 高要市 | 康保县 | 渑池县 | 庐江县 | 瑞丽市 | 布尔津县 | 囊谦县 | 拜城县 | 道孚县 | 武汉市 | 旌德县 | 连城县 | 鄂尔多斯市 | 岱山县 | 民丰县 | 彭泽县 | 江达县 | 新河县 | 鄯善县 | 鄢陵县 | 涞水县 | 桂东县 | 静宁县 | 同心县 | 皮山县 | 子长县 | 武安市 | 彭水 | 怀化市 | 古田县 | 吕梁市 | 临夏市 | 永宁县 | 赤壁市 | 卢湾区 | 鄂托克旗 | 南川市 | 上高县 | 瓦房店市 | 巫溪县 | 三河市 | 东丰县 | 肃宁县 | 即墨市 | 姜堰市 | 都昌县 | 长白 | 山丹县 | 肃南 | 临沧市 | 田东县 | 穆棱市 | 筠连县 | 新昌县 | 岐山县 | 陇南市 | 长葛市 | 山阳县 | 阿拉尔市 | 右玉县 | 静安区 | 双峰县 | 龙山县 | 伊川县 | 佛冈县 | 万州区 | 光山县 | 乌拉特前旗 | 阜新市 | 奎屯市 | 浦城县 | 东乡族自治县 | 剑河县 | 平遥县 | 大丰市 | 鱼台县 | 库车县 | 兰州市 | 江源县 | 霍邱县 | 金乡县 | 尤溪县 | 翼城县 | 大名县 | 彰化县 | 尉氏县 | 桓仁 | 大新县 | 襄樊市 | 于田县 | 黑龙江省 | 西安市 | 浦江县 | 韶山市 | 弥勒县 | 房产 | 方山县 | 马鞍山市 | 广州市 | 定边县 | 平利县 | 合江县 | 五华县 | 开封市 | 肥西县 | 微博 | 儋州市 | 宁阳县 | 普兰店市 | 勐海县 | 安吉县 | 富民县 | 大安市 | 息烽县 | 突泉县 | 海阳市 | 登封市 | 怀宁县 |