区块链技术指南笔记(三):区块链运作的核心技术
前言
在學習區塊鏈的時候,有很多知識點,作為讀者的我們不能第一時間去消化它(也沒必要第一遍就弄懂),某些方面的設計思想看的也是一知半解。我遇到這種情況,一般會將書多看幾遍,再去尋找各個知識點之間的關系,從而了解設計者的構思。區塊鏈的基本知識就好像是積木一樣,有了這些積木就擁有了搭建一個房子的材料。至于如何搭,那就要學習它們之間的關系了。上一篇的筆記是一些基本概念,它可以使我們對區塊鏈技術中所包含的知識有所了解,至于區塊鏈是怎么運作的,并沒有涉及太多。正如原書中的編寫思路,在介紹完基礎概念后,便向讀者介紹了區塊鏈運作的核心技術。在學習過程中,有的概念會重復出現。我的建議是不要跳過這些部分,哪怕是快速的瀏覽一遍,加深印象也不錯。
?
區塊鏈基礎框架
將區塊鏈的基礎架構分為三層。分別是應用層、數據層和網絡層。
其中應用層包括:可編程貨幣、可編程金融等。
數據層包括:公共總賬本、共識算法和密碼學等。
網絡層包括:P2P網絡、TCP/IP協議等。
首先,在網絡層之上,區塊鏈是建立在TCP/IP通信協議和對等網絡的基礎上的一個分布式系統,和傳統帶中心的分布式系統不一樣,它不依靠中心化的服務器節點來轉發消息,而是每一個節點都參與消息的轉發。因此P2P網絡比傳統網絡具有更高的安全性,任何一個節點被攻擊都不會影響整個網絡,所有的節點都保存著整個系統的狀態信息。
其次,在數據層面上,區塊鏈就是一個只可追加、不可更改的分布式數據庫系統,是一個分布式賬本。如果是公開的塊鏈,也就是公有鏈,那么這個賬本可以被任何人在任何地方進行查詢,完全公開透明。在區塊鏈網絡中,節點通過使用共識算法來維持網絡中賬本數據庫的一致性。同時采用密碼學的簽名和哈希算法來確保這個數據庫不可篡改,不能作偽,并且可追溯。例如,在比特幣系統中,只有在控制了50%的網絡算力時才有比較大的概率對區塊鏈進行重組以修改賬本信息。由于比特幣系統的設計者中本聰在系統設計中巧妙的加入了帶有經濟激勵的挖礦工作量證明(PoW)機制,使得即使擁有網絡50%以上算力的人也不會損害其自身利益而發起對網絡的攻擊。因此,比特幣系統在上線7年多來一直持續不斷地正常運行,沒有出現過因為比特幣系統本身缺陷而造成的安全故障。
再次,在應用層面,我們可以用區塊鏈代替傳統的登記、清算系統。國信證券分析報告指出,通過區塊鏈的點對點分布式的時間戳服務器來生成依照時間前后排列并加以記錄的電子交易證明,可以解決雙重支付問題,從而帶來結算成本趨零的可能性。
在應用方面,區塊鏈平臺能夠提供編程環境讓用戶編寫智能合約。通過智能合約,可以把業務規則轉化成在區塊鏈平臺自動執行的合約,該合約的執行不依賴可信任的第三方,也不受人為的干預。理論上只要一旦部署,一旦符合合約執行的條件就會自動執行。執行結果也可以在區塊鏈上供公開檢查,提供了合約的公正性和透明性。因此,智能合約可以降低合約建立、執行和仲裁中所涉及的中間機構成本。區塊鏈的智能合約奠定了未來建立可編程貨幣、可編程金融,甚至是可編程社會的基礎。
?
區塊鏈具有去中心化、可靠數據庫、開源可編程、集體維護、安全可信、交易準匿名性等特點。如果一個系統不具有以上特征,將不能被視為基于區塊鏈技術的應用。
(1)去中心化
區塊鏈數據的存儲、傳輸、驗證等過程均基于分布式的系統結構,整個網絡中不依賴一個沒有中心化的硬件或管理機構。作為區塊鏈一種部署模式,公共鏈網絡中所有參與的節點都可以具有同等的權利和義務。
(2)可靠數據庫
區塊鏈系統的數據庫采用分布式存儲,任一參與節點都可以擁有一份完整的數據庫拷貝。除非能控制系統中超過一半以上的算力,否則在節點上對數據庫的修改都將是無效的。參與系統的節點越多,數據庫的安全性就越高。并且區塊鏈數據的存儲還帶有時間戳,從而為數據添加了時間維度,具有極高的可追溯性。
(3)開源可編程
區塊鏈系統通常是開源的,代碼高度透明公共鏈的數據和程序對所有人公開,任何人都可以通過接口查詢系統中的數據。并且區塊鏈平臺還提供靈活的腳本代碼系統,支持用戶創建高級的智能合約、貨幣和去中心化應用。例如,以太坊平臺即提供了圖靈完備的腳本語言,供用戶來構建任何可以精確定義的智能合約或交易類型。
(4)集體維護
系統中的數據塊由整個系統中所有具有記賬功能的節點來共同維護,任一節點的損壞或失去都不會影響整個系統的運作。
(5)安全可靠性
區塊鏈技術采用非對稱密碼學原理對交易進行簽名,使得交易不能被偽造;同時利用哈希算法保證交易數據不能被輕易篡改,最后借助分布式系統各節點的工作量證明等共識算法形成強大的算力來抵御破壞者的攻擊,保證區塊鏈中的區塊以及區塊內的交易數據不可篡改和不可偽造,因此具有極高的安全性。
(6)準匿名性
區塊鏈系統采用與用戶公鑰掛鉤的地址來做用戶標識,不需要傳統的基于PKI的第三方認證中心頒發數字證書來確認身份。通過在全網節點運行共識算法,建立網絡中誠實節點對全網狀態的共識,間接地建立了節點間的信任。用戶只需要公開地址,不需要公開真實身份,而且同一個用戶可以不斷變換地址。因此,在區塊鏈上的交易不和用戶真實身份掛鉤,只是和用戶的地址掛鉤,具有交易的準匿名性。
區塊鏈技術的核心優勢是去中心化,能夠通過運用哈希算法、數字簽名、時間戳、分布式共識和經濟激勵等手段,在節點無需互相信任的分布式系統中建立信用,實現點對點交易和協作,從而為中心化機構普遍存在的高成本、低效率和數字存儲不安全等問題提供了解決方案。
?
區塊鏈運作的核心技術
1.區塊鏈的連接
每個區塊分為區塊頭和區塊體(含交易數據)兩個部分。區塊頭包括用來實現區塊鏈接的前一區塊的哈希值(又稱散列值)和用于計算挖礦的隨機數(nonce)。前一區塊的哈希值實際是上一個區塊頭部的哈希值,而計算隨機數規則決定了哪個礦工可以獲得記錄區塊的權力。區塊鏈的鏈接模型如下:
2.共識機制
區塊鏈是伴隨比特幣誕生的,是比特幣的基礎技術架構。可以將區塊鏈理解為一個基于互聯網的去中心化記賬系統。類似比特幣這樣的去中心化數字貨幣系統,要求在沒有中心節點的情況下保證各個誠實節點記賬的一致性,就需要區塊鏈來完成。所以區塊鏈技術的核心是在沒有中心控制的情況下,在互相沒有信任的基礎的個體之間就交易的合法性等達成共識的共識機制。
區塊鏈的共識機制目前主要有4類:PoW、PoS、DPoS、分布式一致性算法。
PoW(工作量證明)
工作量證明,也就像比特幣的挖礦機制,礦工通過把網絡尚未記錄的現有交易打包到一個區塊,然后不斷遍歷嘗試來尋找一個隨機數,使得新區塊加上隨機數的哈希值滿足一定的難度條件例如前面10位是零。找到滿足條件的隨機數,就相當于確定了區塊鏈最新的一個區塊,也相當于獲得了區塊鏈的本輪記賬權。礦工把滿足挖礦難度條件的區塊在網絡中廣播出去,全網其他節點在驗證區塊滿足挖礦難度條件,同時區塊里的交易數據符合協議規范后,將各自把區塊鏈接到自己版本的區塊鏈上,從而在全網形成對當前網絡狀態的共識。
優點:完全去中心化,節點自由進出,避免了建立和維護中心化信用機構的成本。只要網絡破壞者的算力不超過網絡總算力的50%,網絡的交易狀態就能達成一致。
缺點:目前比特幣挖礦造成大量的資源浪費;另外挖礦的激勵機制也造成礦池算力的高度集中,背離了當初去中心化設計的初衷。更大的問題是PoW機制的共識達成的周期較長,每秒只能最多做7筆交易,不適合商業應用。
?
PoS(權益證明)
權益證明要求節點提供擁有一定數量的代幣證明來獲取競爭區塊鏈記賬權的一種分布式共識機制。如果單純依靠代幣余額來決定記賬者必然使得富有者生出,導致記賬權的中心化,降低共識的公正性,因此不同的PoS機制在權益證明的基礎上,采用不同方式來增加記賬權的隨機性來避免中心化。例如點點幣PoS機制中,擁有最長鏈齡的比特幣獲得記賬權的幾率就越大。NXT和Blackcoin則采用一個公式來預測下一個記賬的節點。擁有多的代幣被選為記賬節點的概率就會大。未來以太坊也會從目前的PoW機制轉為PoS,目前,以太坊的PoS機制將采用節點賭注來賭下一區塊,賭中者有額外以太幣獎,賭不中者會被扣以太幣的方式來達成下一區塊的共識。
優點:在一定程度上縮短了共識達成的時間,降低了PoW機制的資源浪費。
缺點:破壞者對網絡攻擊的成本低,網絡的安全性有待驗證。另外擁有代幣數量大的節點獲得記賬權的幾率更大,會使得網絡的共識受少數富裕賬戶支配,從而失去公正性。
?
DPoS(股份授權證明)
股權授權證明機制類似于董事會投票。比特股采用的PoS機制是持股者投票選出一定數量的見證人,每個見證人按序有兩秒的權限時間生成區塊,若見證人在給定的時間片不能生成區塊,區塊生成權限交給下一個時間片對應的見證人。持股人可以隨時通過投票更換這些見證人。DPoS的這種設計使得區塊的生成更為快速,也更加節能。
優點:大幅縮小參與驗證和記賬節點的數量,可以達到秒級的共識驗證。
缺點:選舉固定數量的見證人作為記賬候選人有可能不適合于完全去中心化的場景。另外在網絡節點數少的場景,選舉的見證人的代表性也不強。
?
分布式一致性算法
分布式一致性算法是基于傳統的分布式一致性技術。其中分為解決拜占庭將軍問題的拜占庭容錯算法。另外解決非拜占庭問題的分布式一致性算法(Paxos、Raft)。該類算法目前是聯盟鏈和私有鏈場景中常用的共識機制。
優點:實現秒級的快速共識機制,保證一致性。適合多方參與的多中心商業模式。
缺點:去中心化程度不如公有鏈上的共識機制。
?
3.解鎖腳本
腳本是區塊鏈上實現自動驗證、自動執行合約的重要技術。每一筆交易的每一項輸出嚴格意義上并不是指向一個地址,而是指向一個腳本。腳本類似一套規則,它約束著接收方怎樣才能花掉這個輸出上鎖定的資產。
交易的合法性驗證也依賴于腳本。目前它依賴于兩類腳本:鎖定腳本和解鎖腳本。鎖定腳本是在輸出交易上加上的條件,通過一段腳本語言來實現,位于交易的輸出。解鎖腳本與鎖定腳本相對應,只有滿足鎖定腳本要求的條件,才能花掉這個腳本上對應的資產,位于交易的輸入。通過腳本語言可以表達很多靈活的條件。解釋腳本是通過類似我們編程領域里的”虛擬機”,它分布式運行在區塊鏈網絡里的每一個節點。
?
4.交易規則
區塊鏈的交易就是構成區塊的基本單位,也是區塊鏈負責記錄的實際有效內容。一個區塊鏈交易可以是一次轉賬,也可以是智能合約的部署等其他事物。
就比特幣而言,交易即指一次支付轉賬。其交易規則如下:
(1)交易的輸入和輸出不能為空。
(2)對交易的每個輸入,如果其對應的UTXO輸出能在當前交易池中找到,則拒絕該交易。因為當前交易池是未被記錄在區塊鏈中的交易,而交易的每個輸入,應該來自確認的UTXO。如果在當前交易池中找到,那就是雙花交易。
(3)交易中的每個輸入,其對應的輸出必須是UTXO。
(4)每個輸入的解鎖腳本必須和相應輸出的鎖定腳本共同驗證交易的合規性。
對于以太坊來說,交易還可能是智能合約的部署。交易規則就確定了符合一定語法規則的合約才能被部署在區塊鏈上。
?
5.交易優先級
區塊鏈交易的優先級有區塊鏈協議規定決定。對于比特幣而言,交易被區塊包含的優先次序由交易廣播到網絡上的時間和交易額的大小決定。隨著交易廣播到網絡上的時間的增長,交易的鏈齡增加,交易的優先級就被提高,最終會被區塊包含。對于以太坊而言,交易的優先級還與交易的發布者愿意支付的交易費用有關,發布者愿意支付的交易費用越高,交易被包含進區塊的優先級就越高。
?
6.Merkle證明
Merkle證明的原始應用是比特幣系統,比特幣區塊鏈使用了Merkle證明,為的是將交易存儲在每一個區塊中,使得交易不能被篡改,同時也容易驗證交易是否包含在一個特定區塊中。比特幣的Merkle證明樹如圖:
Merkle樹的一個重要使用場景就是快速支付驗證,也就是中本聰描述的”簡化支付驗證”(SPV)的概念:輕量級節點不用下載每一筆交易以及每一個區塊,可以僅下載鏈的區塊頭,每個區塊中僅包含下述5項內容,數據塊大小為80字節。
(1)上一區塊頭的哈希值
(2)時間戳
(3)挖礦難度值
(4)工作量證明隨機數(nonce)
(5)包含該區塊交易的Merkle樹的根哈希
如果一個輕客戶端希望確定一筆交易的狀態,它可以簡單地要求一個Merkle證明,顯示出一個在Merkle樹特定的交易,其根是在主鏈上的區塊頭。
Merkle證明可以讓區塊鏈得到更廣闊的應用,但比特幣的輕客戶有其局限性。雖然可以證明包含的交易,但無法證明任何當前的狀態(例如:數字資產的持有,名稱注冊,金融合約的狀態等)。一筆交易影響的確切性質可以取決于此前的幾筆交易,而這些交易本身則依賴于更為前面的交易,所以最終需要驗證整個鏈上的每一筆交易。為了解決這個問題,以太坊進行了更進一步的創新。
以太坊的每一個區塊頭中并非只包含一顆Merkle樹,而是包含了3棵Merkle樹,分為3種對象:交易(Transaction)、數據(Receipts)和狀態(State)。
這三顆樹允許輕客戶端輕松地進行并核實以下類型的查詢答案:
1)這筆交易被包含在特定的區塊中了嗎?
2)這個地址在過去30天中,發出X類型事件的所有實例(例如,一個眾籌合約完成了它的目標)。
3)目前賬戶余額是多少?
4)這個賬戶是否存在?
5)假裝在這個合約中運行這筆交易,它的輸出會是什么?
第1種是由交易樹來處理的;第3、4種則是由狀態樹負責處理;第2種則由收據樹處理。計算前4個查詢任務是相當簡單的。在服務器簡單地找到對象,獲取Merkle分支,并通過分支來回復輕客戶端。第5種查詢任務同樣也是由狀態樹處理。
?
7.RLP
RLP(Recursive Length Prefix,遞歸長度前綴編碼)是Ethereum中對象序列化的一個主要編碼方式,其目的是對任意嵌套的二進制數據的序列進行編碼。
以太坊中的所有數據都以”遞歸長度前綴編碼”形式存儲,這種編碼格式將任意長度和維度的字符串構成的數組串連接成字符串。例如,[‘dog’,’cat’]被串接(以字節數組格式)為[200,131,100,111,103,131,99,97,116];其基本的思想是把數據類型和長度編碼成一個單獨的字節放在實際數據的前面(例如’dog’的字符數組編碼為[100,111,103],于是串接后就成了[131,100,111,103])。’dog’是字符串,有24字節,RLP編碼規則是當字符串長度為0~55字節時,0x80加上字符串長度,這里是3。因此是0x83,轉成十進制是131.[‘dog’,’cat’]是個list,RLP規則是當長度小于55字節時,第1字節為0xc0加上list長度,這里是8,所以是0xc8,轉成十進制應該是200。注意RLP編碼正如其名字表示的一樣,是遞歸的;當RLP編碼一個數組時,實際上是在對每一個元素的RLP編碼級聯成的字符串編碼。需要注意的是,以太坊中所有數據都是整數;所以,如果有任何的以一個或多個0字節開頭的哈希或者地址,這些0字節應該在計算出現問題的時候去除。以太坊中沒有串接數據結構包含任何以0開頭的數值。整數以大端基礎256格式存儲。
?
區塊鏈交易流程
以比特幣的交易為例,區塊鏈的交易并不是通常意義上的一手交錢一手交貨的交易,而是轉賬。如果每一筆轉賬都需要構造一筆交易數據會比較笨拙,為了使得價值易于組合與分割,比特幣的交易被設計為可以納入多個輸入和輸出,即一筆交易可以轉賬給多個人。從生成到在網絡中傳播,再到通過工作量證明、整個網絡節點驗證,最終記錄到區塊鏈,就是區塊鏈交易的整個生命周期。整個區塊鏈交易流程如圖:
(1)交易的生成。所有者A利用他的私鑰對前一次交易和下一位所有者B簽署一個數字簽名,并對這個簽名附加在這枚貨幣的末尾,制作成交易單。
(2)交易的傳播。A將交易單廣播至全網,每個節點都將收到的交易信息納入一個區塊中。
(3)工作量證明。每個節點通過相當于解一道數學題的工作量證明機制,從而獲得創建新區塊的權力,并爭取得到數字貨幣的獎勵。
(4)整個網絡節點驗證。當一個節點找到解時,它就向全網廣播該區塊記錄的所有時間戳交易,并由全網其他節點核對。
(5)記錄到區塊鏈。全網其他節點核對該區塊記賬的正確性,沒有錯誤后他們將在該合法區塊之后競爭下一個區塊,這樣就形成了一個合法記賬的區塊鏈。
總結
以上是生活随笔為你收集整理的区块链技术指南笔记(三):区块链运作的核心技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链技术指南笔记(二):区块链技术
- 下一篇: C/C++中输入带空格的字符串 str