目錄
淺談區塊鏈
區塊鏈技術理念
作業流程
區塊鏈技術堆疊
區塊鏈賬本
共識機制(篩選演算法)
密碼演算法
腳本系統
網路路由
淺談區塊鏈
從一個賬本說起,早些時候,農村一般都會有一個賬房先生,村子里的公共開銷都有賬房先生來記賬,大部分情況下沒有人去查賬本,賬本也就是賬房先生來保管,一直相安無事,下圖便是賬本的記賬權

但是有一天,有個人無意發現數字對不上,這可不行,立即保告了其他人,結果大家都不干了,經過一番討論大家決定,輪流來記賬,這個月張三,下個月李四,大家輪著來,防止賬本在一個人手里,于是賬本的記賬權發生了如下圖所示:

通過上圖可以看到,大家輪流來記賬一切又相安無事了,知道有一天李四想挪用公款但是他又怕被后面記賬的人發現,于是他就燒掉了其中一部分,這樣別人就查不到了,回頭告訴大家是不小心碰到蠟燭了,別人也沒辦法,果然出了這個事情之后大家也無可奈何,緊接著王五也不小心碰蠟燭了...........于是大家重新坐下來討論這件事情,經過一番討論大家決定啟用一種新的記賬方式,每個人擁有自己的一個賬本,任何人改動都要告知其他人,其他人在自己賬本上也記一筆,如果發現新改動的賬目不對,可拒絕改動,到最后以大多數一至的賬本為準,
使用這個方法后一段時間都沒有發生事情,但是時間長了有人就偷懶了,不愿意這個麻煩的記賬,就希望別人記好了拿過來抄一遍,這樣記賬最勤快的人就有意見了,最終大家開會決定每天早上擲骰子,根據點數來決定誰記當天的賬,這時候記賬權就變成了這樣:

經過幾次風雨后,大家還是決定共同來記賬,這樣比較安全,后來大家還決定,每天被擲到要記賬的人能獲得一些獎勵,從當天的記賬總額中劃出一定的獎勵比例,
實際上最后大家決定的做法,就是區塊鏈中記賬方法的雛形,
區塊鏈技術理念
區塊鏈在本質上就是一種記賬方法,當然了,并不是通過人來記賬,而是通過一種軟體,我們暫且成為區塊鏈客戶端,上一篇例子中,張三、李四、王五相當于一個個區塊鏈客戶端,他們運行在不同的設備上,彼此之間獨立作業,通常我們把運行的客戶端稱之為節點,這些節點運行后,彼此之間會認識一下,是這樣認識的:張三認識李四也認識王五,趙六聯系到了張三,張三把他認識的人的聯系方式告訴趙六,這樣趙六也就認識了李四和王五,通過這種方式大家就形成了一張網,有什么事只要招呼一聲,立馬訊息就會傳遍整個網路節點,這種跟新聞轉發差不多,不需要依靠某一個人,大家就能互通訊息了,在區塊鏈軟體結構中,這種互相通信的功能叫做網路路由,
在這個網路中,每個節點維護著自己的賬本,賬本記錄著網路中發生的一筆筆賬務,區塊鏈技術屬于一種技術方法,可以來實作各種不同的業務場景,小到日常記賬,大到復雜的商業合約等,記錄的資料也就不同,網路中的節點是獨立記賬,記賬的內容要保持彼此一致,所用的方法就是設定一個游戲規則,通過這個規則選出一個記賬的節點,如上篇的擲骰子,在區塊鏈中這個所謂的擲骰子成為“共識演算法“,就是大家都遵守的篩選方案,現在可以先簡單的理解,選出一個節點后一段時間內所有的賬務都由這個節點為準,這個節點記錄后會把資料廣播出去,告訴其他節點,其他節點只需要通過網路來接受資料就可以,接收后根據自己賬本進行驗證,有沒有不匹配和不規范的,如果沒問題就存盤,
在有些系統里,會考慮到被骰子投中的節點勞動付出,畢竟他是要整理資料,驗證資料,打包資料,還有廣而告之,這個活挺辛苦的,于是會設計一個激勵機制,負責打包資料的節點獲得相應的獎勵,這個獎勵類似于論壇積分,站著技術角度就是一個資料,這個資料可視為獎勵,有時候大家會很積極的去爭取獎金,希望篩子投中自己,有些區塊鏈系統中在這個環節會設計一種帶有競爭的機制,讓各個節點去搶,誰能搶到誰就有打包資料的權利及的到這筆獎金,這個競爭程序叫做挖礦,
那么話又說回來,我們將一個個可運行的客戶端稱為節點,那到底怎么標記不同的使用者呢?通過用戶實名注冊嗎?實則不然,在區塊鏈中,這個地方設計的很有意思,是通過一種密碼演算法來實作的,具體來說是通過一種公開的秘鑰演算法的機制來實作的,我們知道,對于一種密碼演算法來說,無論演算法程序是什么樣的,最終都會得到一個秘鑰,而公開秘鑰演算法有一對秘鑰,彼此配合使用,可以互相用來加解密,私鑰自己保管好,公鑰就是用來識別用戶身份的,一般不會直接使用公鑰,不容易讓人記住,實際處理的時候會進行轉換,轉換后會形成一個地址,這個地址就代表著一個用戶,
為什么區塊鏈中要用這么奇怪的用戶身份表示呢,這里再簡單的介紹一下公開秘鑰演算法的特別能力,之前提到這種演算法有一對秘鑰,那他們是怎么作業的呢?用公鑰加密的資料必須用對應的私鑰進行解密,而用私鑰加密(通常稱為簽名)的資料必須對應公鑰來解密,這個特點發揮很大的作用,比如,張三要發送一張支票給李四,怎么傳送呢?于是張三想了一個辦法,在他的支票上用李四的公鑰加了個密,然后再簽上自己的名字(自己的私鑰簽名),這時候就算其他人拿到這張支票也沒什么用,只有李四的私鑰才能解開這個支票,這種功能在區塊鏈中稱為腳本系統,
張三用李四公鑰加密,再用自己私鑰加密;李四先用張三公鑰解密,再用李四私鑰解密;
公鑰私鑰的原則:
- 一個公鑰對應一個私鑰,
- 密鑰對中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰,
- 如果用其中一個密鑰加密資料,則只有對應的那個密鑰才可以解密,
- 如果用其中一個密鑰可以進行解密資料,則該資料必然是對應的那個密鑰進行的加密,

現在我們知道了,區塊鏈的技術理念,其實就是大家共同參與記賬,通過一種規則來不斷的選出賬務打包者,其他節點接受驗證,并且每一個用戶都有一對秘鑰表示自己,通過腳本系統的功能實作在公共網路中定向發送有價值的資料,
作業流程
通過前兩篇文章,相信大家對區塊鏈有了基本的認識,區塊鏈系統有很多種,第一個應用區塊鏈的軟體就是位元幣,事實上區塊鏈就是位元幣帶出來的,到現在為止,已經出現很多基于區塊鏈的系統了,比如超級賬本、以太坊等,每一類系統都有自己的特點,無論是什么型別的系統,他們的作業方式及作業流程是類似的,在本質上他們是同一類技術結構的產物,接下來闡述一下區塊鏈的作業流程,
比如一個轉賬交易的流程,轉賬交易本質上就是發送一筆資料,這個資料可以表示為資產,也可以表示為訂單或其他形式,我們來看下圖:

圖中我們可以看到,整個資料發送的程序還是很簡單的,
資料發送出去后會被打包成區塊,
然后廣播出去給所有的節點進行確認,
確認沒有問題后寫入各自的區塊鏈賬本中,
當網路的大多數節點都確認后,這個轉賬程序算是完成了
有朋友可能會問,在這種分布式網路中,怎么能知道大多數節點確認寫入了呢?這里并沒有服務器登記呀?這個問題我們先留著,在下面說到區塊鏈分類的時候再詳細講解,
這個作業流程圖是有代表性的,其他各種系統都是在這個基礎上進行擴展的,比如有些會加入身份認證功能,以確保只有符合身份的用戶才能發送資料,有些則擴展交易資料的表達能力,但不能用來表示一般的交易轉賬,還能表示更復雜的商業邏輯,應用很多但是萬變不離其宗,
實際上,說一千道一萬,整個區塊鏈網路,就是大家共同來維護的一個公共賬本,注意了,這個公共賬本是個邏輯概念,每個節點各自都是獨立維護自己的賬本資料,而所謂的公共賬本,是說各自的賬本要保持一致,保持一致的部分就是公共賬本,我們看下圖:

如圖所示,有些節點在廣播新的資料,有些節點在接收資料,大家公同維護一個賬本,確保達成一致,區塊鏈技術其實就是圍繞如何保持資料一致,如何讓這個公共賬本的資料不被篡改來展開的,為了解決這些問題,區塊鏈技術擁有一套技術堆疊,我們下一篇來闡述,
區塊鏈技術堆疊
區塊鏈本身是一種資料的記錄方式,就像我們平常使用的Excel、Word等,按照一定的格式存盤到電腦上,與傳統的記錄格式不同的是,區塊鏈將產生的資料按照一定的時間間隔,分成一個個的資料庫記錄,然后再根據資料塊的先后關系串聯起來,也就是所謂的區塊鏈了,按照這種規則,沿著時間線不斷增加新的區塊就好像是時光記錄儀一樣,記錄發生的每一筆操作,
這種資料記錄格式很新穎,在這種記錄方式下,資料很難被篡改或洗掉,有朋友可能會說,這有什么不好修改、洗掉的!比如我在自己電腦保存一份Excel資料,再怎么復制的格式我也可以隨便改呀!如果區塊鏈的資料格式只是應用在單機環境或者一個中心化服務器上,那確實是,畢竟自己對自己的資料擁有完全的支配力,然而一切才剛剛開始,我們接著看,
如果區塊鏈代表的僅僅只是一個記錄格式的話,那么也算不上什么偉大的發明,也看不出什么特別的能力,比如難以篡改之類,事實上區塊鏈是一整套技術組合的代表,在這一組技術的配合下,才能煥發出驚人的能力,區塊鏈系統有很多種,就像聊天軟體有很多種,而無論什么樣的區塊鏈系統,其技術組件都是類似的,不管是位元幣、萊特幣、以太坊還是其他,核心結構和作業原理都是共同的,我們看下圖基本的技術組合有哪些:

如圖所示,這是區塊鏈系統結構的基本組成,各系統本質上都是在這個經典結構之上直接實作或擴展實作,這些零件裝配在一起,組成了一個區塊鏈系統,運行起來就稱之為一個節點,多個這樣不同的節點在不同的計算機上運行起來,就組成了一個網路,在這個網路中每個節點都是平等的,大家互相為對方提供服務,這種網路被稱為點對點的對等網路,接下來我會一一進行解釋,
區塊鏈賬本
區塊鏈表示一種特有的資料記錄格式,區塊鏈就是“區塊+鏈”,所謂的區塊就是資料塊的意思,每一個區塊之間通過某個標志連接起來,從而形成一條鏈,如下圖:

如圖所示,一個區塊一個區塊的銜接,大家可以發現在生活中有很多相似的記錄方式,比如企業會計賬本,每個月會將記賬憑證匯總并且月結,這樣一段時間下來,就按月形成了一個連續賬本,每個月的資料就相當于一個區塊,區塊與區塊之間通過年月進行串聯,以位元幣來說,大約10分鐘產生一個區塊,區塊中主要包含了交易事務資料以及區塊的摘要資訊,我們看下位元幣中區塊鏈資料組成示意圖:

通過上圖我們可以看到位元幣中區塊鏈賬本的資料組成及關系,并且可以看到區塊資料在邏輯上分成了區塊頭和區塊體,
每個區塊頭中通過梅克爾根(梅克爾根也稱為梅克爾根哈希值,具體概念后續詳細介紹,暫且可以認為是一個區塊中所有交易事務的集體身份證號)關聯了區塊中眾多的交易事務,而每個區塊之間通過區塊頭的哈希值串聯起來,這是一個很有趣的資料格式,它將連續不斷的資料分成一個一個的資料塊,在下載同步這些資料的時候,可以并行的從各個節點來獲得,無論資料的先后,到達本地后在根據身份證號進行組裝起來就行,另外,這是一種鏈條格式,鏈條最大的特點就是一環扣一環,很難從中間去破壞,比如有人篡改了中間的2號區塊,那就得吧2號區塊后的所有區塊全部改掉,這樣的難度非常大,在區塊鏈系統中,一個節點產生的資料和更改的資料要發送到網路中其他節點去確認,而其他節點是不會確認通過一個被篡改的資料的,因為跟自己本地區塊鏈賬本匹配不起來,這也就是區塊鏈資料不可篡改的一個很重要的設計,
這種格式還有一個巧妙的地方,如果這個資料總是由一個人來記錄那就沒什么意思了,但是如果放到網上,大家共同來維護這個資料,這也才會體現出價值,每個區塊由誰來記錄或打包,可以有一個規則,比如擲骰子,大家約定好一個規則,贏者就讓他來記錄下一個區塊的資料,為了補償她的勞動投入,獎勵他一部分收益,位元幣就是使用了這樣的原理來不斷的發行新的位元幣出來,獎勵給打包記錄區塊資料的那個人的位元幣就是新發行的位元幣,這個也叫做挖礦,
共識機制(篩選演算法)
所謂共識,就是指大家都打成一致的意思,在生活中也有許多需要達成共識的場景,比如開會討論,雙方或多方簽訂一份協議,在區塊鏈系統中,每個節點必須要做的事情就是讓自己的賬本跟其他節點保持一致,如果是在傳統的軟體結構中,這幾乎就不是問題,因為一個中心服務器的存在,也就是所謂的主庫,其他從庫向主庫看齊就好,在實際生活中,很多事情人們也是按照這邏輯來的,比如企業老板發布了一個通知,員工照著做,但是區塊鏈是一個分布式的對等網路結構,在這個結構中沒有哪個節點是“老大”,一切都要商量著來,在區塊鏈系統中,如何讓每一個節點通過一個規則將各自節點的資料保持一致是一個很核心的問題,這個問題的解決方案就是制定一套共識演算法,
共識演算法其實就是一種規則,每個節點都按這個規則去確認各節點的資料,我們暫且拋開演算法的原理,先來想一想在生活中我們會如何解決這個問題,假設一群人開會,這群人沒有一個領導,大家各抒己見,到最后如何統一一個最終的結果出來呢?實際處理的時候,我們一般在某個時間段選出一個人來發表意見,那個負責匯總大家的內容,然后發布完整的意見,其他人投票表決,每個人都有機會來匯總表達,最后票數最多的按最終意見,這種思路就是一種共識演算法了,然而在實際程序中,如果人數多并數量是確定的,那還好處理些,如果人數很多并且數量不可確定,那么很難讓每個人去發表意見再投票了,這樣效率太低了,我們需要一個機制選出一個代表的人,在共識演算法中就是篩選出具有代表性的節點,
如何篩選呢?其實就是設定一組條件,就像我們篩選運動員一樣,給一組指標讓大家完成,誰能更好的完成指標,誰就有機會被選上,在區塊鏈系統中,存在著多種這樣的篩選方案,比如PoW(Proof of Work)作業量證明、PoS(Proof of Stake)權益證明、DPoS(Delegate Proof of Stake)委托權益證明、PBFT(Practical Byzantine Fault Tolerance)實用拜占庭容錯演算法等,各種不同的演算法,其實就是不同的游戲玩法,這里暫且不進行演算法的程序詳述,大家只要知道這些都是一些篩選演算法就行了,區塊鏈系統就是通過這種篩選演算法或者共識算法來使用網路中各個節點的賬本資料打成一致的,
密碼演算法
密碼演算法的應用在區塊鏈中是個很巧妙的東西,它應用的點也很多,我們在這里不詳細介紹密碼演算法的原理,就從幾個關鍵的應用來介紹一下,
首先我們回顧一下區塊鏈賬本格式,通過上述講解我們已經知道,區塊鏈賬本就是連接起來的一個個區塊,那么到底是通過什么來連接的呢?
學過資料結構的朋友都知道,在資料結構中有一種變數叫做指標,它可以用來指向某資料的地址,那么區塊的連接是不是用過這樣的方式呢?生活中地址連接的例子很多,比如路牌、門牌等,
然而區塊之間的連接,往往都不是靠資料地址來連接的,而是靠一種叫做哈希值的資料來關聯的,什么叫哈希值?這是通過密碼演算法中的哈希演算法計算得出的,哈希演算法可以通過對一段資料計算后得出一段摘要字串,這種摘要字串與原始資料是唯一對應的,什么意思呢?如果對原始資料進行修改,哪怕修改一點點,那么計算出來的哈希值都會完全變化,
區塊鏈賬本對每個區塊都會計算一個哈希值,稱為區塊哈希,通過區塊哈希來串聯區塊,這里有個很好的作用就是,如果有人篡改了中間的某一區塊資料,那么后面的區塊都要進行修改,這個時候并不是簡單的修改一下后面區塊的地址指向就能結束,由于后面的區塊是通過區塊哈希來指向的,只要前面的區塊發生變動,這個區塊哈希就無效了,就指不到正確的區塊了,
另外一個對密碼演算法的應用就是梅克爾樹結構,梅克爾樹在之后會詳細講解,我們先初步認識一下,通過上述講解我們知道,每個區塊會被計算出一個哈希值,實際上,除了整個區塊會被計算哈希值之外,區塊中包含的每一筆事務資料都會計算一個哈希值,稱為事務哈希,每一個事務哈希都可以唯一的表示一個事務,對一個區塊中所有事務進行哈希計算后,可以得出一組事務哈希,再通過對這些事務哈希進行加工處理,最終得出一顆哈希樹的資料結構,哈希樹的頂部就是樹根,稱為梅克爾根,通過這個梅克爾根就可以將整個區塊中的事務約束起來,只要區塊中的事務有任何改變,梅克爾根就會發生變化,利用這一點可以保證區塊資料的完整性,
當然,密碼演算法在區塊鏈系統中的應用還遠不止這些,比如通過密碼演算法來創建賬戶、地址、簽名交易事務等,這些應用在后續會逐步介紹,
腳本系統
腳本系統在區塊鏈中是個比較抽象的概念,也是其中一個很重要的功能,可以說區塊鏈系統之所以能形成一個有價值的網路,依靠的就是腳本系統,他就像是一個發動機一樣,驅動著區塊鏈系統不斷進行著各種資料的收發,
所謂腳本,就是指一組程式規則,在區塊鏈中,有些系統的程式規則是固定的,比如在位元幣系統中,只能進行位元幣的發送與接收,這個發送與接收的程序就是通過實作在位元幣中的一組腳本程式來完成的,而有些系統是允許用戶自行撰寫一組程式規則的,撰寫好后可以部署在區塊鏈賬本中,這樣就可以擴展區塊鏈系統的功能,比如以太坊就是通過實作一套可以自定義功能的腳本系統進而實作了智能合約的功能,
腳本系統使區塊鏈中可以實作各種各樣的業務功能,本來大家只是通過區塊鏈來記賬,通過腳本系統,大家可以使用區塊鏈來記錄各種各樣的資料,比如訂單、眾籌賬戶、物流資訊,供應鏈資訊,這些資料一旦可以記錄到區塊鏈上,那么區塊鏈的有點就能夠充分發揮出來,
網路路由
這個功能模塊比較簡單,區塊鏈系統是一個分布式網路,這些網路的節點如何來彼此進行連接通信呢?依靠的就是網路路由功能,前面我們說到,張三、李四、王五、趙六是通過彼此介紹來認識的,這個其實就是網路路由的雛形了,在分布式網路結構中,不存在一個指定的服務器,大家沒法通過一個服務器來直接交換彼此的身份資訊,就只能依靠彼此聯系并傳播資訊,在區塊鏈中,這個功能一般會定義成一種協議,稱為“節點發現協議”,
除了發現節點外,更重要的一個功能就是同步資料,節點要保持自己的賬本資料是最新的,就必須要實時更新自己的資料,從哪更新呢?既然沒有服務器下載,那就是通過臨近的節點了,通過向臨近節點發送資料請求來獲取最新資料,節點彼此都充當服務者和被服務者,通過這種方式,網路中的每一個節點都會在某一時刻達成資料上的一致,
網路路由可以說是區塊鏈中的觸角,通過大量的觸角將每一個節點連入網路,從而形成一個功能強大的區塊鏈共識網路,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/301585.html
標籤:區塊鏈
