如何在 5 分鐘內讀懂區塊鏈的架構思維?

作為入門者,如何在最短的時間了解區塊鏈技術,區塊鏈思維,以及比特幣的金融原理呢?本文嘗試從比特幣的架構設計思維出發,讓人從宏觀上搞清楚區塊鏈的技術本質。


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

本文授權轉載自阿里技術


作者 | 鄭吉



塊鏈不是一種技術實現,而是一個系統的架構設計,使用一系列的技術組合用于完成去中心化的數據存儲。比特幣在區塊鏈之上融入了金融學,貨幣學,博弈學,甚至一定程度的哲學思想,用于電子貨幣的發行,運行和交易。在學習區塊鏈之前有一些基礎知識需要提前掌握好,后面將不再對具體技術展開描述,而是從這個技術解決了什么問題,為什么要用這個技術這個角度去描述。


  • P2P

  • 不可逆算法

  • 不對稱加密算法

  • Merkle樹

  • CAP理論

  • 最終一致性算法



比特幣要做什么?


如果你是一個架構師,做一個系統的架構,你首先要搞清楚這個系統要做什么?要解決一個什么問題?帶著這個問題進行分析,設計系統整體的架構。對于比特幣也一樣,首先搞清楚比特幣是要做什么,要解決什么問題?然后帶著這些問題去解析比特幣的技術實現。


如果用一句話來描述比特幣要做什么,那么可以這樣描述:做一個去中心化電子貨幣發行交易系統。這里有三個關鍵詞:

1. 去中心化
2. 電子貨幣發行
3. 電子貨幣交易



分析和設計


本章針對上述比特幣的三個關鍵詞,去中心化,電子貨幣發行,貨幣交易,進行分析和設計。


去中心化


當今世界的所有貨幣交易都是有一個第三方可信任的金融機構提供服務處理,任何人不能訪問由這個第三方機構中心化存儲的數據,理論上來說如果這個金融機構發生了欺詐或倒閉,那么存儲在這個機構中的貨幣,以及所做的交易就會存在風險。?當然比特幣的去中心化,不是因為擔心這種風險,而是根本就不需要這個第三方機構了。這也是區塊鏈的強大顛覆性之一,凡是需要某個第三方可信任的機構需要安全保存處理的數據,都可以去中心化安全存儲,所有人都可以訪問。


從技術角度分析,如何做到去中心化?


中心化對應的就是分布式,去中心化就是分布式。把原先存儲在某個第三方機構,中心化存儲的數據,進行分布式存儲。



分布式存儲要解決的3個基本問題


1. 網絡結構
2. 數據不可篡改性
3. 最終一致性


網絡結構


去中心化的分布式存儲是指整個發行的電子貨幣,以及貨幣交易數據由不同機構,不通個人的成千上萬的計算機共同存儲,共同維護了同一份相同的數據,只有共同維護的這份相同的數據才是認為最終正確的數據,任何個人篡改自己的數據都沒有意義,并且存儲的數據所有人都可訪問。


如果做為架構師,你會選擇什么樣的網絡結構去實現這個分布式存儲?一種方式是可采用類似Hadoop中HDFS的方式,由某個中心節點NameNode進行協調訪問,但這種方式就會帶來單點風險,破壞了中心節點,整個體系都將不可訪問。或者采用Cassandra無中心化投票機制維護整個集群狀態,但是這種方式在全球化開放式部署中會導致根本無法收斂。


所以比特幣采用了一種更加簡單直接的方式,利用P2P協議維護整個比特幣網絡集群,不需要某個中心節點協調節點之間的通信,不需要所有機器投票維護集群狀態。而是通過P2P協議進行節點之間的數據傳輸,任何節點都可以隨時加入或者離開比特幣網絡集群,而不會對比特幣網絡集群產生影響,也不需要特意去修復這個集群中的故障機器。


利用P2P協議進行節點之間數據傳輸主要有兩個功能點


a. 把需要存儲的數據廣播到所有節點上進行儲存。
b. 查詢整個網絡集群中所有節點的最新數據,如果自己節點的數據與大部分節點的數據不一致,則更新自身的數據與大部分節點存儲的數據一致。

比特幣是去中心化存儲,最大的風險是整個比特幣網絡集群被破壞,篡改了整個網絡存儲的數據。但是上述第二個功能點能夠有效的防止這種風險,由于系統會自動更新為整個集群中大部分節點存儲的相同數據,所以要篡改數據,必須要同時篡改整個網絡一半以上的數據,這不是說做不到,但是比特幣利用區塊鏈的方式再加上利益博弈機制,當你擁有這種能力的時候,也不需要去做篡改這種投入產出比這么低的事了,在數據不可篡改性一節中再詳細描述。


通過圖示看一下比特幣網絡結構的運行:



640?wx_fmt=png



Jack把某一筆交易數據往A服務器上提交,A服務器驗證數據合法性后存儲到自身的數據庫中,同時把這筆交易數據點對點的傳輸到比特幣網絡集群的所有B,C,D,E節點上。A和所有其它的B,C,D,E節點保持點對點通信,自動更新為這個集群中大多數節點維護的相同的數據。如果B,C,D三臺服務器保存的數據相同,但是與A,E不一致,則A和E自動更新為與B,C,D相同的數據。所以Jack的這筆交易,需要等待這個比特幣網絡集群中所有節點都接受到,并且認為合法存儲后,才認為這筆交易成功完成。當然在現實情況下,不需要等待所有節點都確認完成,通常只需要少數服務器確認完成后即可認為交易完成,因為每個服務器維護的自身與整個網絡集群的數據狀態,當少量服務器都認為與整個集群一致時,此時從概率上就是一致的。在最終一致性一節中將繼續對這種網絡結構下的數據存儲進行描述。


數據不可篡改性


在設計了比特幣系統運行的網絡結構之后,需要考慮數據的不可篡改性,因為這種數據存儲是去中心化的,任何人都可以訪問,那么就容易被篡改,上節描述了在這種網絡結構的運行機制下,要篡改數據,必須同時更改這個網絡集群上一半以上的節點數據,如果每個節點沒有一個安全的保護機制的話,那是很容易做到被同時修改網絡集群中一半以上節點的數據。


先想想,如果你是架構師,你會如何設計這個保護機制,確保存儲的數據無法被篡改?在傳統上,我們把交易數據一條記錄一條記錄的保存在數據庫表中,數據庫放在某個第三方機構的服務器上,這個第三方機構給服務器所處的網絡,服務器,數據庫設置了嚴格的訪問限制用于數據的安全性。但是在一個去中心化,沒有一個機構或者一個人可以控制系統的訪問權限的情況下,如何去保護數據的安全性?


一種方式是每個人把自己的插入的這條數據hash后用自己的密鑰進行簽名,然后附帶上自己的公鑰,系統可以用簽名和公鑰驗證插入的數據是否被修改過。如果把數據庫表比喻為一本帳本,表中的每一條數據就認為是賬本中記錄的每一筆交易。這里還有兩個問題,第一,不能隨意插入數據,如果你沒有比特幣,但還是插入一條轉帳給某人的數據,系統需要發現是不合法的,拒絕此次插入請求。第二,除了不能隨意插入和修改外,也需要防止刪除數據,上述把每條記錄進行簽名并不能阻止被惡意刪除。帶著這些問題,如果你是架構師,你會做什么樣的架構設計實現這些需求?


這里就開始要引出區塊鏈的設計了。上面把數據庫表比喻為一本帳本,如果系統中只有一張表,也就是一本帳本,那么這本帳本中的數據很容被更改。如果讓系統每10分鐘自動生成一張表,也就是生成一本新帳本,新的交易記錄都記錄在新帳本中。?并且創建這個新帳本需要一定的條件,用當前帳本的順序號,上一個帳本的所有記錄的hash值,系統時間戳(10分鐘一個維度),再找一個隨機值,幾個數據加在一起Hash后滿足一定的條件,比如開始多少位都是0,那么系統就接收這個新帳本。產生的新帳本通過帳本順序號串在上個帳本之后,形成一個帳本的鏈式結構,新的帳本依賴于上一個帳本的數據和當前系統時間戳,因此一旦新帳本產生后,歷史帳本的數據就無法被篡改,因為一旦篡改,就與之后的帳本對不上,帳本被破壞,按照上節網絡結構中描述的自動更新為網絡集群中大部分節點維護的相同的帳本。



640?wx_fmt=png



一旦形成了鏈式帳本后就無法去更改某個歷史帳本中的數據,更改了某個歷史帳本,那么在它之后的所有帳本都需要更改,但是每個帳本都是根據當前的系統時間戳驗證hash值是否滿足條件才能接收,所以無法去篡改歷史帳本的數據。所能做的只能另外投入非常大的代價再構建一個比特幣集群,這個集群超過當前的集群,那么數據就自動按照新構建的集群為準。這就是多個帳本的相互保護機制比單個帳本更難以被篡改。后續貨幣的發行和交易中再會描述,當你有能力重新構建一個新的比特幣網絡集群用于去攻擊篡改數據時,你獲得的收益將遠遠低于你投入的成本。


為了防止上個帳本的數據被篡改,產生新的帳本需要依賴于上一個帳本中的所有交易記錄的hash值,這樣一旦上個帳本的數據發生變化就與新帳本對應不上。但是帳本中所有交易記錄計算hash值是一件耗時的計算,因此比特幣采用了merkle樹對某個帳本中的所有交易記錄進行hash計算。它主要是解決帳本中交易記錄hash計算的效率問題。如下圖HA,HB...HP是具體的交易記錄,每相臨的兩條交易記錄向上形成一個Hash值,再與相鄰的節點再往上形成hash值,一直到樹根形成所有交易記錄的唯一hash值。



640?wx_fmt=png



之前描述的網絡結構和本節描述的帳本鏈式結構,本質上都是用于解決去中心化的數據安全存儲。


最終一致性


是分布式存儲就繞不開CAP理論,比特幣也一樣,比特幣采用P2P協議進行節點之間的數據傳輸,放棄了CAP中的Consistency,采用了AP兩個維度。如果放棄了Consistency這個屬性,那么就產生了拜占庭將軍問題,這么多節點如何達成數據一致性。拜占庭軍隊都是一個個小分隊組成,每個小分隊都有一個將軍負責,將軍們通過號令兵傳達一系列行動,但是當中出現一些叛將,故意破壞號令怎么辦?


分布式存儲系統和拜占庭將軍問題一樣,做到一致性是很難的,在比特幣開放式的全球化部署的系統集群更是如此。所以比特幣放棄了強一致性,并且通過P2P點對點通信,沒有中心節點,整個集群中的服務器故障,離開,加入集群都不會對整個集群產生影響。


上節中描述了帳本的產生基本機制,用當前帳本的順序號,上一個帳本的所有記錄的hash值,系統時間戳(10分鐘一個維度),再找一個隨機值,幾個數據加在一起Hash后滿足一定的條件,比如開始多少位都是0,那么系統就接收這個新帳本,這就是這個集群中所有節點的共識,所有節點只接收這樣的帳本,而尋找這個隨機值是需要龐大的計算能力。在比特幣中稱它為Proof-of-Work(POW)挖礦。


當每隔10分鐘找到這個值,就是生成了新的帳本。但網絡集群都是開放的,可能同時找到了兩個值,在集群中少部分節點中產生了2個帳本,針對這種情況比特幣系統設計為:整個網絡集群采用少數服從多數原則,集群中大部分采用了哪個帳本,少數節點服從多數節點,丟棄沒被大多數采用的帳本,達到最終一致性。


電子貨幣發行


上一章節去中心化中,主要描述了一個去中心化系統,如何做到安全的數據存儲,不被篡改。它主要采用了P2P網絡結構+區塊鏈式結構解決了數據的安全存儲。但是對于一個貨幣,還需要解決一個貨幣的發行,如何發行,發行給誰?如何讓比特幣系統能夠讓所有的人自發的運行下去?貨幣的發行需要公平,公開,公正,而且貨幣不能發行到某個第三方機構中,任何人只要符合一定的條件就能獲取發行的貨幣。想一想,如果你是架構師,你會如何設計系統去發行貨幣?


本質上講,比特幣系統自身就可以尋找一個隨機值,產生新的帳本。但是比特幣把發行貨幣和尋找新帳本背后的計算力結合在一起。尋找新帳本需要消耗計算力,誰找到了符合新帳本條件的隨機值,代表了他消耗了大量的計算力,新帳本一旦被系統接收,那么系統自動在該新帳本中記錄一條轉帳給他一定個數比特幣的紀錄,就完成了貨幣的發行。


比特幣的運行必須依賴于新帳本的產生,而誰找到新帳本,誰就能獲得系統自動生成的轉帳紀錄,也就是獲得了一定數量的比特幣,這就是挖礦。這也就激勵了人們不斷的投入到挖礦中,不斷的挖出新帳本,通過激勵維持著比特幣系統的運行。


這里體現設計天才的地方是,比特幣融入了金融學,貨幣學,博弈學,通過系統形成了一定的運行機制,激勵著人們讓這個系統能夠自發的運行下去。


電子貨幣交易


上節電子貨幣發行一節中描述了,誰通過算力找到了新的帳本,系統就會自動記一筆賬,轉一定數量的比特幣給誰,他也就獲得了比特幣。那么如何確認記錄的這筆交易是屬于你的,而不被別人拿走呢?做為架構師的你如何解決這個問題?


比特幣采用了非對稱加密技術對用戶的帳戶操作,公鑰就是用戶的帳戶號碼,誰找到了新帳本,系統自動往新帳本發現者的公鑰帳戶,記一條特定數量比特幣的紀錄。當用戶要消費比特幣時,需要用私鑰進行簽名,系統會用帳戶號碼也就是公鑰驗證簽名是否正確,并且根據用戶的帳戶號碼從歷史的交易中計算出當前帳戶中的真實金額,確保用戶操作的資金在帳戶真實金額之內。這里的設計有兩個要點


  1. 插入的每一條紀錄都需要用私鑰簽名,系統用帳戶號碼也就是公鑰進行驗證簽名是否正確,驗證正確則認為合法。

  2. 如果滿足第一個條件,則驗證插入的紀錄中轉帳金額是否正確,驗證的方式是對該公鑰以往的所有交易紀錄進行計算得出該帳戶當前的金額,如果不超過該金額值則為合法。圖示如下:



640?wx_fmt=png



這種機制能夠保證只能對自己的帳戶進行操作,再結合P2P網絡結構下的最終一致性原則,以及帳本的鏈式結構,一個攻擊者需要建立超過目前比特幣網絡集群,并且算力超過目前的集群下才能創建另外一個帳本分之,而且也只能更改自己的帳戶,所以這種攻擊投入和產出的收益極低,而對于比特幣系統來說,你構建了龐大的集群以及強大的算力,即使攻擊成功了,獲得了一部分的收益,反過來卻讓比特幣系統更加的穩健了。



區塊鏈的應用


比特幣系統解決了去中心化的安全存儲問題,解決了貨幣的發行問題,解決了貨幣交易的帳戶安全問題后,就構建了一個當前的比特幣電子虛擬貨幣系統了。而比特幣使用的區塊鏈被認為是一個顛覆性的技術,革命性的技術,那他的顛覆性體現在什么地方呢?它不是技術上面的顛覆,主要是在思想層面上的,商業運作模式層面上的革命性。就比如一個國家從集權式的到民主式的轉變,對這個國家和社會就是一個革命性的變化。而區塊鏈技術帶來兩個基本功能:


1. 去中心化的數據存儲
2. 保證帳戶的安全性


理論上讓原先需要通過某個第三方機構提供的數據服務,都可以革命性更改為去中心化的方式提供服務,比如比特幣可以替代各個國家的法幣使用。區塊鏈這種特性也會衍生出各行各業的商業模式顛覆性的變化。



原文發布時間為:2018年03月19日
本文作者:區塊鏈大本營
本文來源:CSDN,如需轉載請聯系原作者。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

魅族Flyme5.x以上系統INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

用android studio 連接魅族flyme5.0安裝app,報 Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 解決方法: 1、進入手機管家 2、權限管理 3、usb安裝管理 4、關閉 完美解決問題

php取key的value值,獲取數組中key和value的值

方法1:PHP 4 引入了 foreach 結構,和 Perl 以及其他語言很像。這只是一種遍歷數組簡便方法。foreach 僅能用于數組,當試圖將其用于其它數據類型或者一個未初始化的變量時會產生錯誤。有兩種語法,第二種比較次要但卻是第一種的有用…

arduino 上傳項目出錯_Arduino多核編程:簡單例子

不管你是Arduino領域的新手還是經驗豐富的開發人員,很可能你還只使用過單核在進行編程。 這沒有什么好笑的---- 事實上,直到幾天前我才使用Arduino IDE進行了第一次多核編程。 我和所有其他Arduino粉絲都非常喜歡IDE的易用性以及MicroController 開發所需…

Hadoop-RPC應用demo

Hadoop里的rpc框架可以單獨拿出來使用。jar包全在hadoop-common工程里。 導入hadoop-common工程里(hadoop-2.7.3為例): hadoop-common-2.7.3.jar \hadoop-2.7.3\share\hadoop\common\lib下的全部jar包 實例 rpc.client 客戶端 rpc.pr…

php 變量 可用拼音表示,php漢字轉拼音的示例

. 代碼如下:class Helper_Spell{public $spellArray array();static public function getArray() {return unserialize(file_get_contents(pytable_without_tune.txt));}/*** desc 獲取字符串的首字母* param $string 要轉換的字符串* param $isOne 是否取首字母* param $uppe…

Opencv-Python:圖像尺寸、圖像的讀取、顯示、保存與復制

Opencv-Python:圖像尺寸、圖像的讀取、顯示、保存與復制 原創 2017年11月23日 21:30:494440在使用opencv的方法時,首先必須導入opencv包。新的opencv導入cv2,這里也和cv做了一個對比 [python] view plaincopy import cv2 一、圖像尺寸 圖像的…

寶塔面板服務器ip地址修改_「網站」快速搭建服務器環境及網站

目錄:「NAS」我的搭建NAS全過程在文章開頭我想說明的是,此文章中所使用的工具為 BT 面板即寶塔面板,適合小白使用但是對于想要提升個人能力來說, BT 面板并不是一個好選擇,而作為新手來說,可以使用該面板進…

redis啟動報錯-磁盤滿了

imjournal: fopen() failed for path: ‘/var/lib/rsyslog/imjournal.state.tmp’: Structure needs cleaning [v8.24.0-57.el7_9.1 try http://www.rsyslog.com/e/2013 ] 1.查看服務狀態 systemctl status rsyslog 2.嘗試重啟服務 systemctl restart rsyslog 3.查看分區占用情…

楊輝三角python_Python面試150題匯總,都是常問的面試題!

周末,Python面試題每日一題暫停更新,下面把最近整理的1-50篇Python面試文整理一下,平時文章都放在比較末尾,閱讀量都不高,相信很多人都沒看過,如果對于Python感興趣的,建議可以認真閱讀一下&…

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS flg

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.nokia.wlanapp, PID: 18526java.lang.RuntimeException: Error receiving broadcast Intent { actandroid.net.wifi.SCAN_RESULTS flg0x4000010 (has extras【外部】) } in com.nokia.wlanapp.Receive…

shell 整數條件判斷

兩個整數的比較 整數1 -eq 整數2 判斷整數1是否和整數2相等(相等為真) 整數1 -ne 整數2 判斷整數1是否和整數2不相等(不相等位置) 整數1 -gt 整數2 判斷整數1是否大于整數2(大于為真) 整數1 -lt 整數2 判斷整數1是否小于整數2(小于為真) 整數1 -ge 整數2 判斷整數1是否大于等于…

php處理上傳文件的步驟,php文件上傳步驟

我們在開發網站的時候,經常會遇到需要制作文件上傳功能,下面我們就為大家介紹一下php制作文件上傳功能的詳細步驟。推薦教程:PHP視頻教程第一步:創建一個文件上傳表單允許用戶從表單上傳文件是非常有用的。請看下面這個供上傳文件…

matlab求傅里葉級數展開式_傅里葉級數:從向量的角度看函數

幫助你理解線性代數與機器學習緊密結合的核心內容下文節選自北大出版社《機器學習線性代數基礎》, [遇見]已獲授權許可. 這本書不同于傳統教材, 從新的角度來介紹線性代數的核心知識, 講解也很棒, 又剛好參加參加了當當每滿100-50的活動, 感興趣的朋友可以關注下. 傅里葉級數&a…

c++實現超聲回波包絡檢測_超聲波物位計的選用

超聲波物位計超聲波在氣體、液體和固體介質中以一定速度傳播時因被吸收而衰減,但衰減程度不同,在氣體中衰減最大,而在固體中衰減最小;當超聲波穿越兩種不同介質構成的分界面時會產生反射和折射,且當這兩種介質的聲阻抗…

Android應用開發:CardView的使用及兼容

原文:http://blog.csdn.net/airk000/article/details/39520977 點擊閱讀原文 --------------------------------------------------------------- 引言 在Google I/O 2014上,Google公布了Android L Preview版本,此版本的UI有了非常大的改變…

云海技術u盤怎么恢復成普通盤_BITLOCKER加密中斷數據無法讀取恢復一例

同行求助此問題,密碼客戶是知道的,輸入密碼后提示如圖:如果點擊RESUME則提示如下:無視提示關閉提示框后再次提示分區需要格式化:PC3000 DE中可以添加虛擬驅動器解析BITLOCKER加密的分區,但該例添加虛擬驅動…

git 未能順利結束(退出碼1)

按照這個博客上安裝完小烏龜git后:https://blog.csdn.net/jdsjlzx/article/details/51098588win10下安裝完烏龜git后無法上傳文件進行文件上傳時出現錯誤如下:git 未能順利結束(退出碼1)(922ms2018/4/17 22&#xff1a…

php sql跳過前四條數據,mysql實現每組取前N條記錄的sql,以及后續的組數據量限制...

select a.msg_id, a.com_id, a.data, a.ctime from sns_user_03.user_request_86 a where 5 (select count(*) from sns_user_03.user_request_86 where uid8880386 and com_id a.app_id and msg_id a.msg_id ) order by a.ctime; 上面的sql實現分組查詢,select a.…

交際過程的兩個基本環節_男女相處,若不介意這些“小動作”,基本可以確定“關系曖昧”...

當你對我說再見的時候,我看到你的笑容里有祝福,眼神里卻有遺憾……——南明夫人愛情中最美好幸福的事,莫過于你深愛的人,恰好也鐘情于你。這種兩情相悅的愛情總是如此難得,讓人心生羨慕。這份甜蜜與美好,讓…

Android之NetworkOnMainThreadException異常

原文鏈接:http://blog.csdn.net/mad1989/article/details/25964495 點擊閱讀原文 ------------------------------------------------------------------ 看名字就應該知道,是網絡請求在MainThread中產生的異常 先來看一下官網的解釋: Cl…