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

特別提醒:比特幣採用區塊鏈技術,可是區塊鏈並不等同於比特幣;全篇基於比特幣底層區塊鏈技術講述,因此,部分模型可能不適用於以太坊等。數據庫

另外,因爲文章採用了必定的抽象、類舉的敘事方式,中間或多或少有些地方會跟區塊鏈底層嚴謹的技術實現有出入,若是讓你以爲困惑,能夠在評論下方留言或者私信我一塊兒探討。最後,也是受限於本身知識結構的不完整,這篇文章會隨着我對區塊鏈更深刻認識後,隨時進行修訂,最後更新時間可參考該回答下方的時間戳。安全

首先不要把區塊鏈想的過於高深,他是一個分佈在全球各地、可以協同運轉的數據庫存儲系統,區別於傳統數據庫運做——讀寫權限掌握在一個公司或者一個集權手上(中心化的特徵),區塊鏈認爲,任何有能力架設服務器的人均可以參與其中。來自全球各地的掘金者在當地部署了本身的服務器,並鏈接到區塊鏈網絡中,成爲這個分佈式數據庫存儲系統中的一個節點;一旦加入,該節點享有同其餘全部節點徹底同樣的權利與義務(去中心化、分佈式的特徵)。服務器

與此同時,對於在區塊鏈上開展服務的人,能夠往這個系統中的任意的節點進行讀寫操做,最後全世界全部節點會根據某種機制的完成一次又依次的同步,從而實如今區塊鏈網絡中全部節點的數據徹底一致。網絡

image

上圖中高亮的點就是區塊鏈系統中分佈在全球各地的一個個節點;而這些節點能夠簡單理解爲一臺服務器集羣運維

問題的由來

咱們反覆提到區塊鏈是一個去中心化的系統,確實,「去中心化」在區塊鏈世界裏面是一個很重要的概念,不少模型(好比帳本的維護、貨幣的發行、時間戳的設計、網絡的維護、節點間的競爭等等等等)的設計都依賴於這個中心思想,那到底什麼是去中心化呢?在解釋真正去中心化以前,咱們仍是先簡單瞭解下什麼是中心化吧。分佈式

中心化?函數

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

第一步,你下單並把錢打給支付寶;區塊鏈

第二步,支付寶收款後通知賣家能夠發貨了;編碼

第三步,賣家收到支付寶通知以後給你發貨;

第四步,你收到書以後,以爲滿意,在支付寶上選擇確認收貨;

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

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

你必定會擺出一個巨大的問號臉 ⊙.⊙?——「經過權威背書來得到多方的信任,同時依賴權威方背後的資本和技術實力確保數據的可靠安全」,真的能夠嘛?!

假如說,支付寶程序發生重大BUG,致使一段時間內的轉帳記錄所有丟失,或者更完全一點,支付寶的服務器被金三胖的一個導彈所有炸燬了。而我剛剛轉出去的100元找誰說理去,這個時候,你就成了刀殂上的魚肉;支付寶有良心,會勉爲其難認可你剛剛轉帳的事實,但他不認可你也沒轍,由於確實連他本身也不知道這筆轉帳是否真實存在。

上述就是中心化最大的弊端——過度依賴中心和權威,也就意味着逐漸喪失本身的話語權。

去中心化?

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

第一步,你下單並把錢打給賣家;

第二步,你將這條轉帳信息記錄在本身帳本上;

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

第四步,賣家和支付寶在收到你的轉帳信息以後,在他們本身的帳本上分別記錄;

第五步,賣家發貨,同時將發貨的事實記錄在本身的帳本上;

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

第七步,你和支付寶收到這條事實記錄,在本身的帳本上分別記錄;

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

剛纔「人爲刀俎我爲魚肉」的狀況在這個體系下就比較難發生,由於全部人的帳本上都有着徹底同樣的交易記錄,支付寶的帳本服務器壞了,對不起賣家的帳本還存在,個人帳本還存在;這些都是這筆交易真實發生的鐵證。

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

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

  • 分佈式存儲,經過多地備份,製造數據冗餘

  • 讓全部人都有能力都去維護共同一份數據庫

  • 讓全部人都有能力彼此監督維護數據庫的行爲

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

若是你差很少認同上面的觀點,那咱們應該基本上能夠達成共識,分佈式部署確定是構建去中心化網絡理所固然的解決方向——經過P2P協議將全世界全部節點計算機彼此相互鏈接,造成一張密密麻麻的網絡;以巧妙的機制,經過節點之間的交易數據同步來保證全球計算機節點的數據共享和一致。

哈哈,說的輕巧,「交易數據這麼重要的東西,在一個徹底不信任的P2P網絡節點中以一種錯綜複雜的方式傳遞,數據的一致性和安全性誰來保證,若是說互相監督,他們到底怎麼作到?」

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

從全球節點到交易數據

image

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

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

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

最後,將全部知識點柔和在一塊兒,重回到區塊和區塊鏈,完整講述整個工做流程。

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

區塊,混沌世界的起源

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

故事繼續,在節點的視野裏,大概每十分鐘會憑空產生一個創建在本身平行宇宙世界的神奇區塊(你能夠將區塊想象爲一個盒子),這個區塊裏放着一些數字貨幣以及一張小紙條,小紙條上記錄了這十分鐘內產生的那惟一一筆交易信息,好比說——「小A轉帳給了小B100元」;固然,這段信息確定是被加密處理過的,爲的就是保證只有小A和小B(經過他們手上的鑰匙)纔有能力解讀裏面真正的內容。

這個神奇的區塊被創造出來以後,很快被埋在了地底下,至於埋在哪裏?沒有一我的不知道,須要全部計算機節點一塊兒參與進來掘地三尺後纔有可能找到(找到一個有效的工做量證實)。顯然,這是一件工做量巨大、成果隨機的事件。可是呢,對於計算機節點來講,一旦從地底下挖出這個區塊,他將得到區塊內價值不菲的數字貨幣,以及「小A轉帳給了小B100元」過程當中小A所支付的小費。同時,對於這個節點來講,也只有他纔有權利真正記錄小紙條裏的內容,這是一份榮耀,而其餘節點至關於只能使用它的複製品,一個已經沒有數字貨幣加持的副本。固然這個神奇的區塊還有一些其餘很特別的地方,後面咱們會再細細聊。

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

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

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

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

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

你能夠稍微有點困惑:中止可能已經執行了80%的挖礦行爲,那以前80%的工做不是就白作了嘛?!而後,區塊鏈的末尾又是個什麼鬼東西?

對於第一個困惑。我想說,你說的一點沒錯,可是沒辦法,現實就是這麼殘酷,即使工做作了80%,那也得放棄,這80%的工做勞苦幾乎能夠視爲無用功,絕對的傷財勞衆。第二個困惑,區塊鏈和區塊鏈的末尾是什麼鬼?這裏由於事先並無講清楚,可是你能夠簡單想象一下:區塊是週期性不斷的產生和不斷的被挖出來,一個計算機節點可能事先已經執行了N次「從別人手上拿過區塊 -> 校驗小紙條有效性」的流程,確定在本身的節點上早已經存放了N個區塊,這些區塊會按照時間順序整齊的一字排列成爲一個鏈狀。沒錯,這個鏈條,就是你一直以來認爲的那個區塊鏈。若是你仍是不可以理解,不要緊,文章後面還會有不少次機會深刻研究。

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

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

前面咱們說到「大概每十分鐘會憑空產生一個神奇的區塊,這個區塊裏放了一張小紙條,上面記錄了這十分鐘內產生的這惟一一筆交易信息」。顯然,十分鐘內產生的交易確定遠不止一條,多是上萬條,這上萬條數據在區塊鏈世界是如何組織和處理的呢?另外,爲何在紙條上記錄的只是某一次的交易信息,而不是某一我的的餘額?餘額好像更符合咱們現實世界的理解纔對。

既然存在這樣那樣的疑問。如今咱們就把視線暫時從「區塊」、「區塊鏈」這些看起來彷佛較大實體的物質中移開,進入到區塊內更微觀的世界裏一探究竟,看看小紙條究竟是怎麼一回事,它的產生以及它終其一輩子的使命:

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

2.剛剛建立的小紙條立馬被標記成爲「未確認」的小紙條。從地下成功挖出區塊並最終鏈接到區塊鏈裏的小紙條一開始會被標記爲「有效」。若這條有效的小紙條做爲其餘交易的輸入值被使用,那麼,這個有效的小紙條很快會被標記爲「無效」。由於各類緣由,區塊從鏈上斷開、丟棄,曾經這個區塊內被標記爲「有效」的小紙條會被從新標記爲「未確認」。

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

上面的一、二、3僅僅做爲結論一開始強行灌輸給你的知識點,其中有幾個描述可能會有點繞,讓你以爲雲裏霧裏,沒有關係,由於咱們馬上、立刻就開始會細說裏面的細枝末節。

image

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

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

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

這裏咱們再一次重申,區塊鏈世界是沒有餘額的概念,餘額是經過簡單數字的加減最終得到,你擁有所謂的數字貨幣其實是由於你擁一條交易記錄,即 「盜盜轉帳給張三40個比特幣」!這裏,咱們仍是拿這條記錄說事:

追溯「輸出值」是「盜盜」相關的所有有效交易記錄做爲,對有效交易中的數字進行簡單求和,判斷是否大於等於40,若是確實大於等於,則將這些有效的交易記錄合併造成一條新的交易記錄(以下圖)。若是小於40,其實能夠不須要再繼續往下探討。

image

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

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

對追溯到的有效交易數字求和,若是發現大於須要支付的金額,須要將多出的數字從新支付給本身,至關於找零。對應生成了一條全新的交易記錄(以下圖)。

image

就上圖例子來講,咱們最後合併成的交易記錄 「( 小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」都將被視爲已經使用過的交易記錄——今後被貼上「無效」的標籤,意味着這些交易記錄將永遠不會再被追溯到。

咱們最後一次重申,只是但願讓你加深印象:擁有數字貨幣=擁有交易記錄!

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

記錄着交易信息的小紙條藉助區塊這個載體,在分佈式的網絡中以不一樣的軌跡錯綜複雜的傳遞,咱們前面說了,你真正擁有的數字資產其實是一段交易信息,而不是你常規意義上理解的貨幣。因此這個過程就須要重點解決兩個問題:

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

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

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

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

image

上圖,僅僅一個小數點的變化,輸出的結果已經翻天覆地

第二個知識點:非對稱加密。你也只須要了解,任何人手裏都有兩把鑰匙,其中一把只有本身知道,叫作「私鑰」,以及一把能夠公佈於衆,叫作「公鑰」;經過私鑰加密的信息,必須經過公鑰才能解密,連本身的私鑰也無解。公鑰能夠經過私鑰生成多把。

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

image

第一步:小A會先用Hash函數對本身的小紙條進行處理,獲得一個固定長度的字符串,這個字符串就等價於這張小紙條。

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

第三步:小A將「明文的小紙條」、剛剛加密成功的「數字簽名」,以及本身那把能夠公佈於衆的「公鑰」打包一塊兒發給小B。

第四步:當小B收這三樣東西,首先會將明文的小紙條進行Hash()處理,獲得一個字符串,咱們將其命名爲「字符串1」。而後,小B使用小A公佈的公鑰,對發過來的數字簽名進行解密,獲得另一個「字符串2」。經過比對「字符串1」和「字符串2」的一致性,即可充分證實:小B接受到的小紙條就是小A發出來的小紙條,這張小紙條在中途沒有被其餘人所篡改;且這張小紙條確實是由小A所編輯。

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

掌握了這部分知識之後,咱們在這裏回答一下前面沒有解釋清楚的問題,「節點對區塊的檢驗」檢驗的究竟是什麼?實際上就是:

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

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

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

重回「區塊」和「區塊鏈」的世界

好了,對小紙條和交易記錄的研究咱們點到爲止,其實信息量已是巨大的了,讓咱們合上蓋子,重回較大實體、繼續聊聊「區塊」和「區塊鏈」的話題。還記得,我們在一開始講到關於區塊的特徵嗎?區塊創造後被埋在地下,須要通過節點們快馬加鞭的挖採、並且是憑運氣的挖採纔有可能得到——不只僅如此,事實上他還有其餘不少神奇的地方,好比說:

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

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

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

1.同一個週期內,全網並非產生惟一的一個區塊等待挖掘;每一個節點事實上都在週期性的創造區塊和挖出區塊;只是在某一個節點的視野裏,它不能感知到另一個節點上區塊的產生。爲什麼這裏要特別強調「在某一個節點的視野裏」,就是由於咱們剛剛講到,從區塊的視角來講,區塊的憑空產生,是基於即將與之相連的上一個區塊ID;而從節點的視角來看,區塊的憑空產生是基於當前節點區塊鏈末尾的那個區塊ID產生的。

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

挖礦,本質是經過與或運算,去碰撞一個出一個知足規則的隨機數。這個部分要細講的話,估計又能夠寫出兩三千字來。我以爲到目前爲止,並不影響主軸知識點的講解,這一塊會做爲後續知識結構的完善被撰寫(計劃1月24日前完成)。感興趣的同窗能夠Google百度查閱下什麼叫「挖礦」、「工做量證實 POW」等。

分叉

如今,咱們終於對「區塊」這個概念有了更全面的認識,文章開頭講的故事就能夠繼續展開來絮叨絮叨:

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

image

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

咱們大夥都知道挖礦的過程存在巨大的工做量(若是沒有任何難度,把區塊扔在人羣中,必然同一時間發現區塊的節點數量將大大增長,也就會產生無數的支鏈,經過這個例子,你大概也就可以明白,區塊鏈世界爲何須要設置工做難度了吧),而且在計算機的硅基世界裏,不可能出現所謂 「同時」 的概念,哪怕納秒的差異,那也老是會有前後順序。因此理論上,「分叉」的這種僵局很快會在下一個區塊被挖掘出來(以及校驗區塊)的時候被打破,實在不行下下個,或者下下下個……總之機制可讓整個分叉的區塊鏈世界迅速穩定下來。

image

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

就上圖而言,全部基於張衡路節點挖礦得到的區塊以及後續區塊的那條分支被視爲有價值,最終會所有保留了下來;其餘節點會統一效仿那個擁有更長分支鏈的節點所作的決策。另外,值得一提的是,同一時間,較短分支上的區塊會當即丟棄,而裏面的小紙條也會隨之釋放出來,被從新標記上「未確認」。

「雙花」與「51%攻擊」

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

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

image

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都瞬間。節點不得不從新對後續區塊的解鎖以及對區塊內小紙條的校驗。

image

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

除非....

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

至此,我以爲區塊鏈最基礎、最核心的知識已經所有講完了(除了挖礦內部實現原理,做爲一個遺憾留在這裏,有時間會完善掉),相信你已經對它有了一個宏觀的認識。另外,因爲這篇文章採用了適當抽象、類舉的敘事方式,中間或多或少有些地方會跟區塊鏈底層嚴謹的技術實現有出入,歡迎你們來糾錯。另外,也是受限於本身知識結構的缺失,這篇文章會隨着我對區塊鏈更深刻認識後,隨時進行修訂,最後更新時間可參考該回答下方的時間戳。

6

問答部分

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

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

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

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

(文章來源:知乎 編輯:狂熱追隨者)

如下是咱們的社區介紹,歡迎各類合做、交流、學習:)

image

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息