摘要:區塊鏈元年年,一個叫做中本聰的神秘作家發表了一封名為的白皮書,奠定了比特幣的基礎,也完全改變了我們看待和理解貨幣的方式。
正如民謠像一杯酒,有故事的人聽不得。深夜失眠的我,無意翻起中本聰的白皮書,就注定了無眠。今夜的我只醉心于技術,別問是真是假。
這是一篇關于區塊鏈基礎的筆記,涉及了我認為對于初學者來說,想要進一步深入前需要了解的最重要的幾個概念,概括如下圖:
在深入了解區塊鏈的技術細節之前,明白它為什么存在對理解它是很有幫助的。
區塊鏈技術,最早是在金融交易領域破土發芽的,但在這之前,金融交易系統已經大體正常運作了許多年。所謂變革的新技術,必定對既有領域中一些核心理念發起了沖擊,并提出了自己的解決方案。只在一個行業領域的“興風作浪”,充其量只能算作改進,若說成是變革,那么這項技術的思想及提供的解決方案,必定能跨越多個行業領域繼續“興風作浪”。
在我們探究金融交易系統的緣起流變之前,先埋下兩個問題。
金錢在整個金融系統中已無處不在,它到底有什么價值,讓人們不得不去使用它?
在當前的金融系統中,有什么我們可以進行改進的方面?
現有的金融系統假設我們回到金融交易的歷史源頭,來為人們設計搭建一套金融系統。首先得明白人們的現狀和需求:每個人都擁有屬于自己并可以提供給他人的產品或服務,同時也存在自己所稀缺的。為了均衡這種稀缺和富余,每個人可以對自己所擁有東西的價值進行評估,以及所要換取的東西進行預期,這便是貿易的開始。
但以物易物的貿易存在一個不爭的事實:交易雙方需要通過溝通談判,來確定交易時物品的價值。當從小范圍內的交易,擴展到更大范圍的貿易時,相對公允的價格參考就需要被呼喚出來了。而像黃金這樣,存量稀缺有價值、屬性穩定可長存、體積不大便攜帶的物品,作為價格參考便再合適不過。更進一步地,人們創造出貨幣代替了黃金。
由于貨幣屬于人造物,自然就需要對于基于此的交易進行記錄和管理,已保證人們擁有財富的安全,于是銀行作為可信賴第三方便出現了。人們可在銀行中安全的存放金錢,信賴基于貨幣進行的交易,這是非常有價值的。
同時不免想問,銀行又是如何做到這一點的呢?
當一個有價值的創新,成為了日常生活中不可或缺的一部分時,它的實現原理與運行機制,對于大多數使用者來說就會變的透明了。
可想而知,在全球貿易如此普遍的今天,銀行維持系統正常運作,所需要的子系統及工具絕對成百上千。這里介紹其中一個重要的工具:分類賬,它記錄的交易信息包括:發送方、接收方、交易時間、交易額度。銀行可以利用分類賬記錄的信息做一些很酷的事情。比如,由于知道誰有錢,誰負債,以及擁有錢的數額,那么便可以確保互不認識的交易雙方達成信賴。同時這也幫助解決了所謂的“雙花問題”,所謂雙花問題就是,某人將同一份筆錢花了不止一次。為使一個金融系統正常運行,這種現象是不被允許的,因為你可以想象,這完全是在印鈔呀。銀行可以通過分類賬上的記錄,來避免雙花問題,因為銀行知道第一次交易發生的時間,那么同筆錢第二次交易時就可以認定為無效。
區塊鏈的改進銀行作為可信賴第三方,對于金融交易信息的全知視角,便是我們長期以來解決這個問題的一種途徑。但是區塊鏈技術提供了一種不同的,或許是更好的方式。因為現有的金融系統,不可否認地依然存在著一些問題:
交易數據的訪問權銀行在金融系統中的地位太過重要,它確定擁有我們所有的交易數據,但我們不確定銀行是否將這些數據同樣共享給我們,這樣是否真的合理呢?任何的不公,都是從信息不對稱開始的,你說呢。類似于銀行所用的分類賬,我們可以創建一個共享的分類賬來供所有人訪問。
解決一個問題的同時,總會有新的問題伴隨著產生。
所創建的共享分類賬,是否能達到與目前銀行同樣的安全與信任程度?
類似銀行的可信賴第三方并不唯一現在我們有一個轉賬需求要完成,可采用的途徑并非去銀行借記一種方式,還可以信用卡、支付寶、微信、PayPal等等。無論你選擇哪種,你都需要給他們提供相關必要的信息。而若當你嘗試進行更加復雜的交易時,可能涉及中間環節的公司也會越來越多,這必然會產生額外的費用以及交易延遲。這也是區塊鏈技術嘗試解決的一點。
區塊鏈技術發展迅速,想法和工具都會層出不窮,只有我們牢牢抓住目標,我們才能做出明智的取舍。二、關于比特幣
區塊鏈現在已經是一個跨越許多平臺和行業的熱門話題,每天都有許多更新層出不窮,如果我們要去對區塊鏈追根溯源,比特幣是一個不容忽視的里程碑。它的相關概念和想法影響著所有后來的其他區塊鏈應用,所以我們可以通過了解比特幣,來明白它的核心思想,是如何幫助建立起今天所熟知的區塊鏈的。
比特幣使用塊的概念,來分組和驗證交易信息,將若干個交易打包到一個塊中進行管理。這個想法對比特幣乃至區塊鏈來說都非常重要,但卻不是比特幣首先提出來的,早在1991年,Haber和Stornetta 發表了一篇名為How to Time-stamp a Digital Document的論文,提出了一種驗證文檔的新方式:采用文檔更新的時間戳,將不同的版本按此順序組成一個文檔連。如此看這兩位老鐵也算是區塊鏈的先驅了。
區塊鏈元年2008年,一個叫做中本聰(Satoshi Nakamoto)的神秘作家發表了一封名為Bitcoin: A Peer to Peer Electronic Cash System的白皮書,奠定了比特幣的基礎,也完全改變了我們看待和理解貨幣的方式。接著在2009年1月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個拜占庭的將軍,各自領著一支軍隊圍著一座城的不同方位,他們之間彼此物理隔離,只能通過傳令兵進行通信。他們需要達成共識到底是攻打還是撤退,要么一同攻打要么一同撤退,如果有一支軍隊和其他軍隊行動不一致,都會造成失敗。同時這其中還有更復雜的因素,或許有某個將軍已經叛變了,但其他人還不知道,這就意味著叛變的將軍會破壞這次決議的投票;同時負責消息傳遞的傳令兵,在路上也可能發生不可測的狀況,而導致送達的信息失真,也可能壓根沒送到。
我們將將軍換成區塊鏈網絡中的節點,兩個場景中面對的問題是類似的,我們需要一種策略來幫助建立,在通信沒那么穩定順暢的情況下用戶之間的信任。這便是所謂的共識機制,達成這個目的有許多備選的算法,比如工作量證明,股份證明等等。
工作量證明最早是比特幣提出的一種解決“拜占庭將軍問題”的方案,基本思想就是利用,前面談到的區塊頭部中那個隨機數以及哈希值,計算出這個有著特定數量0開頭的哈希值比較困難,也就意味著你在為這件事情付出成本(人們往往會為自己付出成本做的事情負責任,反之如果沒有任何成本約束,你說你認真負責,我信你個鬼),同時還需要網絡中的其他節點驗證起來比較容易,這樣可行性才會高。
嘗試解題計算這個特定哈希值的節點稱作礦工,礦工挖礦解題的過程會消耗計算機的電量,如果你在諸多節點的競爭計算中,獲得了下個區塊寫入區塊鏈的資格,那么你消耗的電量是值得的。同時可想而知,那些沒有競爭成功的節點,所消耗的電量真的就是打水漂了。
那為什么有那么多節點前仆后繼地要參與到這場算力的競爭中呢?因為獲得資格成功寫入區塊鏈的節點,會獲得比特幣網絡獎勵的比特幣,并且這是網絡產生新比特幣的唯一方式。當然礦工除了從這種方式獲得比特幣外,他還可以從發生的交易中收取小費。
工作量證明存在的問題:
高昂的電費;
礦工對于網絡計算資源的壟斷,間接的也會造成整個系統的中心化趨勢;
第一個問題如前所述,對于第二個問題,具體來說,由于解出特定哈希值問題快慢的概率,和幾點擁有的計算資源大小成正比。也就是說,你擁有越多的資源你就越容易獲得寫入下一個區塊的資格,也就意味著你獲得比特幣獎勵的概率越大。利益的驅使下,全網的算力資源就會逐漸傾向聚集到少數人身上。
8.2 股權證明股權證明是另一種共識機制算法,這種機制中沒有礦工,也不需要投資計算設備用以挖礦獲得數字貨幣,因為從一開始所有的數字貨幣就已經存在了。取而代之的角色叫做驗證者,或者股東,為了驗證交易和創建區塊,股東需要使用他們的數字貨幣進行下注,如果他們驗證了一個虛假的交易,他們將失去所下注的數字貨幣,以及未來參與驗證的機會,這將會驅策系統只驗證正確的交易。
在股權證明機制中,下注越大的股東,獲得寫入下個區塊資格的概率越大。驗證者將會按照其下注的比例獲得數字貨幣作為獎勵,這就會引出一個問題,對于一個雞賊的驗證者,如果他同時對多個區塊進行下注,那么在最后他也并不會損失什么?這無疑是一個潛在的問題,所以網絡的策略是對在錯誤支鏈上下注的驗證著給予處罰,或者對在所有可能的支鏈上下注的驗證者給予處罰。
誰在使用股權證明機制:
以太坊
Dash,也是股權證明的先驅之一,它建立在核心比特幣平臺之上,同時增加了隱私和快速交易的特性。
List,旨在允許開發人員創建自己的非中心化應用程序,功能類似于以太坊和NEO,同時允許開發者使用JavaScript。特殊的是,Lisk的共識機制叫做委托的股權證明,網絡中只有前101個委托者可以下注,而這些委托者是系統隨機選出來的。
8.3 委托式拜占庭容錯Delegated Byzantine fault tolerance,簡稱DBFT,是一種基于給不同節點賦予角色來協調共識的一致性算法。
DBFT同樣沒有礦工角色的節點,取而代之的是將節點分成了普通節點和共識節點,網絡中的絕大多數節點屬于普通節點,只能進行轉化或交易資產,但是他們不能參與到區塊的驗證;只有共識節點有權驗證寫入區塊鏈中的每個區塊,它相當于網絡中其它節點的代表,類似于我天朝的人民代表制度。普通節點可以轉變成共識節點,但不同的平臺需要滿足的轉變標準又太一致。
當決定往區塊鏈寫入新區塊的時候,會從所有的共識節點中隨機選取一個負責寫入。在Neo中,這個被選出來寫入區塊的共識節點叫做speaker(報告人),其余共識節點叫做delegates(代表)。在報告人創建出一個新區塊后,并將它提交給諸位代表,如果有2/3的代表證明通過,則這個新區塊就被加入到區塊鏈中;如果沒有被證明通過,被選擇的報告人節點將變成普通的代表,新的報告人節點會被重新選擇。
DBFT對比工作量證明更快且消耗的資源更少,同時避免了股權證明可能會出現的區塊鏈分叉現象,這并不是說DBFT就完美無缺了:
我們假定有一個不誠實的報告人節點存在(這是可能發生的,因為報告人節點是從所有共識節點中隨機選取的),如果發生了,那么網絡就需要依賴誠實的代表節點數量能過超過2/3。
很難避免代表節點存在行為上的欺詐,系統會將代表的歷史行為數據,公開給所有選民進行查看。
總的來說,目前還沒有完美的共識機制,目測以后也不可能會有,因為這需要根據具體的需求和使用場景進行權衡。同時了解新出現的區塊鏈應用,所提出自己的共識機制,并分析其優缺點,是很開眼界且有趣的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24637.html
摘要:書接上回區塊鏈筆記基礎概念掃盲,我們討論了關于比特幣以及區塊鏈的許多基礎概念,可能通過我略帶類比的描述,讓你初步有了一些概念,但是對于一個比特幣到底長什么樣以及如何使用比特幣進行交易可能還不是很清楚,說的直白點就是聽過豬叫,但沒吃過豬肉。 解惑是每個人都在走的一條路,可誰又能解這漫漫無期呢?路上總是麻醉的人多,釋懷的人少。 書接上回區塊鏈筆記(1)基礎概念掃盲,我們討論了關于比特幣以及...
摘要:介紹了一些關于比特幣的概念與機制,為了加深理解,本文基于來實現一個簡單的區塊鏈原型,后續再對其進行不斷豐富。概述如前所述區塊鏈模型的組成部分,包括區塊,區塊構成的區塊鏈,以及保存區塊鏈的數據持久層等。 介紹了一些關于比特幣的概念與機制,為了加深理解,本文基于JavaScript來實現一個簡單的區塊鏈原型,后續再對其進行不斷豐富。 1. 概述 如前所述區塊鏈模型的組成部分,包括區塊,區塊...
閱讀 1768·2021-10-11 10:57
閱讀 2352·2021-10-08 10:14
閱讀 3393·2019-08-29 17:26
閱讀 3340·2019-08-28 17:54
閱讀 3020·2019-08-26 13:38
閱讀 2885·2019-08-26 12:19
閱讀 3608·2019-08-23 18:05
閱讀 1277·2019-08-23 17:04