區塊鏈筆記(1)基礎概念掃盲

正如民謠像一杯酒,有故事的人聽不得。深夜失眠的我,無意翻起中本聰的白皮書,就註定了無眠。今夜的我只醉心於技術,別問是真是假。

這是一篇關於區塊鏈基礎的筆記,涉及了我認爲對於初學者來說,想要進一步深入前需要了解的最重要的幾個概念,概括如下圖:
圖片描述

一、金融交易

在深入瞭解區塊鏈的技術細節之前,明白它爲什麼存在對理解它是很有幫助的。

區塊鏈技術,最早是在金融交易領域破土發芽的,但在這之前,金融交易系統已經大體正常運作了許多年。所謂變革的新技術,必定對既有領域中一些核心理念發起了衝擊,並提出了自己的解決方案。只在一個行業領域的“興風作浪”,充其量只能算作改進,若說成是變革,那麼這項技術的思想及提供的解決方案,必定能跨越多個行業領域繼續“興風作浪”。

在我們探究金融交易系統的緣起流變之前,先埋下兩個問題。

  • 金錢在整個金融系統中已無處不在,它到底有什麼價值,讓人們不得不去使用它?
  • 在當前的金融系統中,有什麼我們可以進行改進的方面?

現有的金融系統

假設我們回到金融交易的歷史源頭,來爲人們設計搭建一套金融系統。首先得明白人們的現狀和需求:每個人都擁有屬於自己並可以提供給他人的產品或服務,同時也存在自己所稀缺的。爲了均衡這種稀缺和富餘,每個人可以對自己所擁有東西的價值進行評估,以及所要換取的東西進行預期,這便是貿易的開始。

但以物易物的貿易存在一個不爭的事實:交易雙方需要通過溝通談判,來確定交易時物品的價值。當從小範圍內的交易,擴展到更大範圍的貿易時,相對公允的價格參考就需要被呼喚出來了。而像黃金這樣,存量稀缺有價值、屬性穩定可長存、體積不大便攜帶的物品,作爲價格參考便再合適不過。更進一步地,人們創造出貨幣代替了黃金。

由於貨幣屬於人造物,自然就需要對於基於此的交易進行記錄和管理,已保證人們擁有財富的安全,於是銀行作爲可信賴第三方便出現了。人們可在銀行中安全的存放金錢,信賴基於貨幣進行的交易,這是非常有價值的。

同時不免想問,銀行又是如何做到這一點的呢?

當一個有價值的創新,成爲了日常生活中不可或缺的一部分時,它的實現原理與運行機制,對於大多數使用者來說就會變的透明瞭。

可想而知,在全球貿易如此普遍的今天,銀行維持系統正常運作,所需要的子系統及工具絕對成百上千。這裏介紹其中一個重要的工具:分類賬,它記錄的交易信息包括:發送方、接收方、交易時間、交易額度。銀行可以利用分類賬記錄的信息做一些很酷的事情。比如,由於知道誰有錢,誰負債,以及擁有錢的數額,那麼便可以確保互不認識的交易雙方達成信賴。同時這也幫助解決了所謂的“雙花問題”,所謂雙花問題就是,某人將同一份筆錢花了不止一次。爲使一個金融系統正常運行,這種現象是不被允許的,因爲你可以想象,這完全是在印鈔呀。銀行可以通過分類賬上的記錄,來避免雙花問題,因爲銀行知道第一次交易發生的時間,那麼同筆錢第二次交易時就可以認定爲無效。

區塊鏈的改進

銀行作爲可信賴第三方,對於金融交易信息的全知視角,便是我們長期以來解決這個問題的一種途徑。但是區塊鏈技術提供了一種不同的,或許是更好的方式。因爲現有的金融系統,不可否認地依然存在着一些問題:

交易數據的訪問權

銀行在金融系統中的地位太過重要,它確定擁有我們所有的交易數據,但我們不確定銀行是否將這些數據同樣共享給我們,這樣是否真的合理呢?任何的不公,都是從信息不對稱開始的,你說呢。類似於銀行所用的分類賬,我們可以創建一個共享的分類賬來供所有人訪問。

解決一個問題的同時,總會有新的問題伴隨着產生。

所創建的共享分類賬,是否能達到與目前銀行同樣的安全與信任程度?

類似銀行的可信賴第三方並不唯一

現在我們有一個轉賬需求要完成,可採用的途徑並非去銀行借記一種方式,還可以信用卡、支付寶、微信、PayPal等等。無論你選擇哪種,你都需要給他們提供相關必要的信息。而若當你嘗試進行更加複雜的交易時,可能涉及中間環節的公司也會越來越多,這必然會產生額外的費用以及交易延遲。這也是區塊鏈技術嘗試解決的一點。

區塊鏈技術發展迅速,想法和工具都會層出不窮,只有我們牢牢抓住目標,我們才能做出明智的取捨。

二、關於比特幣

區塊鏈現在已經是一個跨越許多平臺和行業的熱門話題,每天都有許多更新層出不窮,如果我們要去對區塊鏈追根溯源,比特幣是一個不容忽視的里程碑。它的相關概念和想法影響着所有後來的其他區塊鏈應用,所以我們可以通過了解比特幣,來明白它的核心思想,是如何幫助建立起今天所熟知的區塊鏈的。

比特幣使用的概念,來分組和驗證交易信息,將若干個交易打包到一個中進行管理。這個想法對比特幣乃至區塊鏈來說都非常重要,但卻不是比特幣首先提出來的,早在1991年,HaberStornetta 發表了一篇名爲How to Time-stamp a Digital Document的論文,提出了一種驗證文檔的新方式:採用文檔更新的時間戳,將不同的版本按此順序組成一個文檔連。如此看這兩位老鐵也算是區塊鏈的先驅了。

區塊鏈元年2008年,一個叫做中本聰(Satoshi Nakamoto)的神祕作家發表了一封名爲Bitcoin: A Peer to Peer Electronic Cash System的白皮書,奠定了比特幣的基礎,也完全改變了我們看待和理解貨幣的方式。接着在2009年1月3日,中本聰發佈了比特幣軟件,同時將第一個比特幣帶到了這個世界。

中本聰的這篇白皮書真是讀一讀神清氣爽,開篇第一句就開始描述,點對點電子現金系統如何繞過對中心化銀行的需求。通篇談及了交易、時間戳、工作量證明、網絡以及許多關於比特幣如何運作的概念,或許目前你對於這些概念的技術細節還不是很清楚,不過沒關係,當我們初次面對一個新技術的時候都這樣。

讓我們懷着以下問題,繼續往下探索:

  1. 比特幣嘗試在解決什麼問題?
  2. 它提出了怎樣的解決方案?
  3. 開發這個新系統都用到了什麼組件?

三、Hashing

目前我們對區塊鏈技術的起心動念,已經有了一個大體的瞭解。接下來我們逐一簡介,上圖區塊鏈框架中的各部分組件,首先是哈希和一個特殊的哈希函數SHA256

哈希值可以被當做是信息的數字指紋,它是由字母和數字組成的唯一字符串,用以代表或者說是對應一組數據,哈希函數的作用,就是完成給定數據到唯一哈希值得映射。SHA256是一個特殊的哈希函數,SHA是Secure Hashing Algorithm的縮寫,256表示其輸出的哈希值是256位的。除此之外還有許多不同的哈希函數,比特幣從中選擇了SHA256函數,來計算區塊鏈上每個區塊的哈希值,這樣做的原因是方便對區塊的引用,以及完整性的校驗。更詳細的使用方式可以參考JS類庫crypto-js
圖片描述
爲了理解哈希值是如何將數據組成爲鏈的,我們需要對區塊和區塊鏈的概念有更多一點的瞭解。

四、區塊

如字面意思,區塊就是保存區塊鏈上一定量交易信息的容器。如前所述,區塊鏈是一個在網絡中存儲所有交易記錄的共享分類記賬單,當我們讓它無限地運行下去時,就意味着這個記錄所有交易的賬單會變得非常龐大。那麼將所有的記錄作爲一個整體來使用或管理,都會非常困難,明智的方法便是化整爲零,來存儲這些交易信息於許多個小區塊中。

那這樣包含數量有限交易信息的小區塊長什麼樣呢?一個區塊大體分爲主體和頭部,交易信息存儲在主體中,而頭部包含了一些額外信息諸如:

  • 前一個區塊的哈希值。各個區塊也就是通過該值相連構成鏈狀結構的。
  • 區塊被創建的時間戳。每個區塊創建的時間,能夠幫助我們確定某項交易生效的時間,這將有效地解決前面講到的雙花問題。
  • Merkle root。是一個代表區塊中每個交易的哈希值。一個哈希值如何代表區塊中所有的交易呢?這裏的騷操作是這樣的:所有的交易對象兩兩取哈希值,然後再對得到的哈希值再兩兩取哈希值,以此類推,所得到的最後一個哈希值即是Merkle root,說白了就是一個二叉樹的根節點。這麼做的原因是,可以快速查找出區塊中不一致的交易,不一致的產生可能是因爲傳輸損壞或篡改。
  • Nonce隨機數。在創建區塊時,網絡中可能會存在許多個體同時發起請求,想要創建該區塊,這其實就是所謂的“挖礦”,那麼區塊鏈網絡該如何決定由誰來創建一個區塊呢?這就是所謂的創建區塊的複雜度問題。解決方案的關鍵就是這個隨機數,比特幣系統要求每個想要創建下一個區塊的請求方,都要提供一個特定的哈希值,這個哈希值由區塊所包含的內容blockData和這個隨機數nonce,即SHA256({ blockData, nonce}),通過哈希函數計算得到。額外的要求是,所得到的哈希值需要以特定數量0開始,這就需要重複的取哈希值一遍又一遍的計算,直到滿足要求。也可以看出,該特定哈希值開頭要求得0數量越多,創建該區塊的複雜度就越高,反之亦然。
  • 區塊大小。顧名思義,就是一個區塊能存儲信息的大小,這是由開發者在區塊鏈創建時定下來的,當一個區塊寫入的交易信息達到該區塊大小的限制時,就是該創建新區塊的時候了。

五、區塊鏈

區塊鏈是一個共享數字分類賬,它包含了發生在網絡上的所有交易的歷史信息,存儲在區塊鏈上的信息永久保存且不可改變。構成區塊鏈的兩個重要因素是:區塊和哈希值,每一個區塊包含自己的哈希值,以及一個指向前一個區塊的哈希值,通過哈希值將所有區塊按照創建順序連接成區塊鏈。
圖片描述
區塊鏈這種由哈希值鏈接而成的結構,帶來了一個有趣的性質:不易更改。當想要更改一個區塊的內容時,由於哈希值得完整性,該區塊的哈希值也必將更改,又由於該區塊的下一個區塊的頭部中,包含了指向該區塊的哈希值,後繼區塊哈希值的計算包含了指向前序區塊的哈希值,前序區塊哈希值得更改,就必然連鎖的更改所有後繼的哈希值。

區塊鏈不易更改的性質,造就了其安全性。

六、分佈式點對點網絡

運行區塊鏈的網絡比較特殊,叫做分佈式點對點網絡。爲了能夠清楚地理解,就字面可以拆成兩塊來看:點對點網絡和分佈式網絡。

所謂點對點網絡,就是允許網絡中的任意兩個節點,可以相互直接通信,而不需要通過什麼中心化的節點。舉些例子,微信,Google的環聊,Skype都屬於點對點網絡。而分佈式網絡,允許在許多用戶間進行信息傳遞。這樣的定義,我第一次看到也很費解,爲了更好地理解,最好的方法論就是比較與鑑別。我可以把中心化網絡,非中心化網絡以及分佈式網絡拿到一起來看。但在細看之前,需要明白一點,每一種網絡都有他們各自的優勢和使用場景,我們在區塊鏈中採用分佈式網絡,只是由於比較來看,分佈式網絡更適合於區塊鏈應用。
圖片描述
在中心化網絡中,所有的信息都集中於一個節點上,其他節點都與中心節點相連。可以拿圖書館的例子來類比,將所有圖書都集中保存在唯一的一個圖書館中,人們需要查閱資料或借閱圖書,都來這個圖書館就好。好處是書籍與資料集中後便於管理,但問題也是顯而易見的:其一,容災性較差,假如這個唯一的圖書館失火或遭到破壞,由於所有信息只有這裏獨一份,損失後便無法恢復。其二,對於用戶來說,非常不方便,所有人都需要到圖書館才能獲取信息,無論你在何處。

於是就有了非中心化網絡的改進方案,備份出全部或部分圖書館中的資料,建立多個地區或區域性的圖書館,這樣便有了一定的災備性。而分佈式網絡,則是把這個思路做到了極致。不需要圖書館了,每個人家裏書架擺上50來本樹,如果沒有的話再相互借。把上述例子中的圖書換成交易數據,就是我們比特幣網絡的樣子,每個節點雖然不一定存儲了所有的數據,但是通過這個分佈式點對點網絡,他們可以獲取到區塊鏈的所有數據。

七、內存池

我們隨時的起心動念都可以產生一個交易,但這並不意味着網絡處理交易的速度,能夠實時的跟上交易產生的速度。也就是說,一定時間內,產生交易的數量可能會超過網絡處理交易的數量,那麼對於那些暫時未確認寫入區塊鏈的交易,就需要一個地方來存儲這些信息,這個地方就叫做:內存池。

交易信息被寫入區塊之前,需要經過網絡的確認與驗證,這個工作是由區塊鏈網絡中一些叫作“礦工”的節點來完成的。具體到如何挖礦稍後介紹,這裏先大致有一個概念。
圖片描述
blockchain.info這個站點提供了一些比特幣區塊的專業服務以及加密貨幣錢包,除此之外,還有一些區塊狀態的神仙圖標可以免費查看。比如我們可以來關注一下,當前未確認的區塊情況
圖片描述
圖中和日期一行的字符串,是一條交易的哈希值;和綠色箭頭一行的字符串,是交易雙方的錢包,可以類比電子郵箱,只不過這裏是用來發送比特幣的。

一條交易信息離開內存池的原因,除了由礦工校驗過後加入區塊,還有一些其他原因:

  • 一條交易信息在內存池中停留的過久,若超過14天還沒有被礦工寫入區塊,則會被移除。
  • 在內存池的堆棧中,所有的交易都是按照小費的大小,由高到低排序的。當內存池的存儲空間達到上限的時候,此時來了一個小費大於目前內存池中最少小費的交易,那麼小費值最少的交易將會被移除內存池。這個小費的額度,是是由發起交易的人確定的,如果希望自己的交易信息被礦工更早的寫入區塊,可以適當提高小費值。當然並不是不給小費,你的交易信息就不會寫入,這要看節點的具體情況。
  • 如果區塊中已經有了該交易信息,在寫入驗證階段,會將重複的交易信息移除內存池。
  • 如果將要寫入的交易信息,和目前區塊鏈中的交易存在衝突,也將會被移除。

八、共識機制

先來看一個著名的問題:“拜占庭將軍問題”。假設有9個拜占庭的將軍,各自領着一支軍隊圍着一座城的不同方位,他們之間彼此物理隔離,只能通過傳令兵進行通信。他們需要達成共識到底是攻打還是撤退,要麼一同攻打要麼一同撤退,如果有一支軍隊和其他軍隊行動不一致,都會造成失敗。同時這其中還有更復雜的因素,或許有某個將軍已經叛變了,但其他人還不知道,這就意味着叛變的將軍會破壞這次決議的投票;同時負責消息傳遞的傳令兵,在路上也可能發生不可測的狀況,而導致送達的信息失真,也可能壓根沒送到。
圖片描述
我們將將軍換成區塊鏈網絡中的節點,兩個場景中面對的問題是類似的,我們需要一種策略來幫助建立,在通信沒那麼穩定順暢的情況下用戶之間的信任。這便是所謂的共識機制,達成這個目的有許多備選的算法,比如工作量證明,股份證明等等。

8.1 工作量證明

工作量證明最早是比特幣提出的一種解決“拜占庭將軍問題”的方案,基本思想就是利用,前面談到的區塊頭部中那個隨機數以及哈希值。計算出這個有着特定數量0開頭的哈希值比較困難,但網絡中的其他節點驗證起來比較容易。

工作量證明存在的問題:

  1. 高昂的電費;
  2. 礦工對於網絡計算資源的壟斷,間接的造成整個系統的中心化趨勢;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章