天天看點

區塊鍊技術指2.1 區塊鍊技術

<b>摘要</b>

區塊鍊基礎

區塊鍊是随着比特币等數字加密貨币的日益普及而逐漸興起的一種全新技術,它提供了一種去中心化的、無需信任積累的信用建立範式,目前已經引起金融行業、科研機構、政府部門和投資公司的高度重視與廣泛關注。區塊鍊技術通過建立一個共同維護且不可被篡改的資料庫來記錄過去的所有交易記錄和曆史資料,所有的資料都是分布式存儲且公開透明的。在這種技術下,任何互不相識的網絡使用者都可以通過合約、點對點記賬、數字加密等方式達成信用共識,而不需要任何的中央信任機構。在這種技術下,我們可以建立數字貨币、數字資産、智能财産以及智能合約等。

通過上一章的介紹,相信大家已經對區塊鍊和比特币有了初步的認識,在本章中,我們将繼續探讨區塊鍊的技術細節。

本章将首先介紹區塊鍊的相關基本概念及其運作原理,然後介紹區塊鍊上可以進行的操作和相關細節,最後再讨論區塊鍊上的交易流程和它的驗證過程。

<b>2.1 區塊鍊技術</b>

<b></b>

區塊鍊本質上是一個對等網絡(peer-to-peer)的分布式賬本資料庫。比特币的底層就采用了區塊鍊的技術架構。區塊鍊本身其實是一串連結的資料區塊,其連結指針是采用密碼學雜湊演算法對區塊頭進行處理所産生的區塊頭哈希值。每一個資料塊中記錄了一組采用雜湊演算法組成的樹狀交易狀态資訊,這樣保證了每個區塊内的交易資料不可篡改,區塊鍊裡連結的區塊也不可篡改。

2.1.1 基本概念

一個完整的區塊鍊系統包含了很多技術,其中有存儲資料的資料區塊及其之上的數字簽名、時間戳等技術,有作為支撐的p2p網絡和維護系統的共識算法,有挖礦和工作量證明機制,有匿名交易機制和比特币錢包,還有鍊齡、utxo、merkle樹、雙花等相關技術概念。正是這些技術,使得區塊鍊在無中心的網絡上形成了運轉不息的引擎,為區塊鍊的交易、驗證、連結等功能提供了源源不斷的動力。

1.?資料區塊

比特币的交易記錄會儲存在資料區塊之中,比特币系統中大約每10分鐘會産生一個區塊,每個資料區塊一般包含區塊頭(header)和區塊體(body)兩部分,如圖2-1所示。

圖2-1 區塊結構

區塊頭封裝了目前的版本号(version)、前一區塊位址(prev-block)、時間戳(timestamp)、随機數(nonce)、目前區塊的目标哈希值(bits)、merkle樹的根值(merkle-root)等資訊。

區塊體中則主要包含交易計數和交易詳情。交易詳情就是比特币系統中的記賬本,每一筆交易都會被永久地記入資料區塊中,而且任何人都可以查詢。區塊體中的merkle樹将會對每一筆交易進行數字簽名,如此可以確定每一筆交易都不可僞造且沒有重複交易。所有的交易将通過merkle樹的hash過程産生一個唯一merkle根值記入區塊頭。關于merkle樹本章後面将詳細介紹。

如果你使用的是比特币核心錢包(bitcoin core),那麼每當你打開用戶端時,區塊資料檔案都會被同步到電腦硬碟中,可以在blocks檔案夾下找到它們。如圖2-2所示的.dat檔案就是我們要找的資料區塊檔案。

我們還可以使用hexdump指令在終端上将資料區塊以十六進制的方式顯示出來。我們可以通過解析這些資料得出交易記錄、區塊大小等基本資訊,是以我們說區塊鍊中的資料是完全公開透明的。如圖2-3所示,我們使用指令hexdump -n 10000 -c blk00000.dat打開了編号為00000的創世區塊(比特币中的第一塊區塊鍊)。

圖2-3 用hexdump指令打開的創世區塊

2.?挖礦與分叉問題

區塊在挖礦過程中産生。所謂挖礦,實際上是窮舉随機數算法,把上個區塊的哈希值加上10分鐘内的全部交易單打包,再加上一個随機數,算出一個256位的字元串哈希值,輸入的随機數nonce使哈希值滿足一定條件就獲得這個區塊的交易記賬權。新産生的區塊需要快速廣播出去,以便其他節點進行對其驗證,以防造假。每個區塊存着上一個區塊的哈希值,可以溯源到源頭,隻有經過驗證後才最終獲得區塊的交易記賬權。比特币系統會讓挖礦的礦工競争記賬權(在主鍊上連結區塊的權利),這個競争機制就是工作量證明機制。挖礦需要付出大量的能源和時間,誰付出的工作量多就能以更大的機率獲得一個區塊的記賬權。擷取記賬權的礦工會将目前區塊連結到前一區塊,形成最新的區塊主鍊,該礦工也會得到系統獎勵的一定數量(2009~2013年每10鐘産生50個比特币,2014年至今每10分鐘産生的比特币将減半成25個)的比特币。所有的區塊連結在一起形成了區塊鍊的主鍊,從創世區塊到目前區塊,在區塊鍊之上的所有資料曆史都可以被追溯和查詢。

需要說明的是,可能會出現不同地區的兩個礦工同時“挖出”兩個新區塊加以連結的情況,這時主鍊上就會出現“分叉”。系統并不會馬上确認哪個區塊不合理,而是約定後續礦工總是選擇累計工作量證明最大的區塊鍊。是以,當主鍊分叉以後,後續區塊的礦工将通過計算和比較,将其區塊連結到目前累計工作量證明最大化的備選鍊上,形成更長的新主鍊,并自動抛棄分叉處的短鍊,進而解決分叉問題。

3.?時間戳和不可篡改性

時間戳是指從格林威治時間1970年01月01日00時00分00秒(中原標準時間1970年01月01日08時00分00秒)起至現在的總秒數,通常是一個字元序列,唯一地辨別某一刻的時間。在比特币系統中,獲得記賬權的節點在連結區塊時需要在區塊頭中加蓋時間戳,用于記錄目前區塊資料的寫入時間。每一個随後區塊中的時間戳都會對前一個時間戳進行增強,形成一個時間遞增的鍊條。時間戳技術本身并沒有多複雜,但在區塊鍊技術中應用時間戳卻是一個重大創新,時間戳為未來基于區塊鍊的網際網路和大資料增加了一個時間次元,使得資料更容易追溯,重制曆史也成為可能。同時,時間戳可以作為存在性證明(proof of existence)的重要參數,它能夠證明特定資料必然在某特定時刻是的确存在的,這保證了區塊鍊資料庫是不可篡改和不可僞造的,這也為區塊鍊技術應用于公證、知識産權注冊等時間敏感領域提供了可能。

4.?分布式資料庫

比特币系統中的區塊就像一個記賬本一樣,記錄了所有比特币的交易資訊,每一個比特币使用者的比特币收支情況都被永久地嵌入了資料區塊中以供别人查詢。這些資料區塊中的交易資料存放在每一個比特币使用者的用戶端節點中,所有的這些節點則組成了比特币及其堅韌的分布式資料庫系統。任何一個節點的資料被破壞都不會影響整個資料庫的正常運轉,因為其他的健康節點中都儲存了完整的資料庫。

5.?utxo交易模式

utxo(unspent transaction outputs)是未花費的交易輸出,它是比特币交易過程中的基本機關。除創世區塊以外,所有區塊中的交易(tx)會存在若幹個輸入(tx_in,也稱資金來源)和若幹個輸出(tx_out,也稱資金去向),創世區塊和後來挖礦産生的區塊中給礦工獎勵的交易沒有輸入,除此之外,在比特币系統中,某筆交易的輸入必須是另一筆交易未被使用的輸出,同時這筆輸入也需要上一筆輸出位址所對應的私鑰進行簽名。目前整個區塊鍊網絡中的utxo會被儲存在每個節點中,隻有滿足了來源于utxo和數字簽名條件的交易才是合法的。是以區塊鍊系統中的新交易并不需要追溯整個交易曆史,就可以确認目前交易是否合法。

6.?哈希函數

哈希函數在比特币系統中也有着重要的應用,區塊鍊中的資料并不隻是原始資料或者交易記錄,還包括它們的哈希函數值,即将原始資料編碼為特定長度的、由數字和字母組成的字元串後,記入區塊鍊。哈希函數有着很多适合存儲區塊鍊資料的

優點:

1)哈希函數處理過的資料是單向性的,通過處理過的輸出值幾乎不可能計算出原始的輸入值;

2)哈希函數處理不同長度的資料所耗費的時間是一緻的,輸出值也是定長的;

3)哈希函數的輸入值即使隻相差一個位元組,輸出值的結果也會迥然不同。比特币系統中最常采用的哈希函數是雙sha256哈希函數,通俗來說就是将不同長度的原始資料用兩次sha256哈希函數進行處理,再輸出長度為256的二進制數字來進行統一的識别和存儲。

總之,哈希函數是比特币系統中的關鍵技術,為比特币系統提供了很多便利。本書後面的章節将會對哈希函數做詳細介紹,此處不贅述。

7.?merkle樹

merkle樹是資料結構中的一種樹,可以是二叉樹,也可以是多叉樹,它具有樹結構的所有特點。如圖2-4所示,比特币區塊鍊系統中的采用的是merkle二叉樹,它的作用主要是快速歸納和校驗區塊資料的完整性,它會将區塊鍊中的資料分組進行哈希運算,向上不斷遞歸運算産生新的哈希節點,最終隻剩下一個merkle根存入區塊頭中,每個哈希節點總是包含兩個相鄰的資料塊或其哈希值。在比特币系統中使用merkle樹有諸多優點:首先是極大地提高了區塊鍊的運作效率和可擴充性,使得區塊頭隻需包含根哈希值而不必封裝所有底層資料,這使得哈希運算可以高效地運作在智能手機甚至物聯網裝置上;其次是merkle樹可支援“簡化支付驗證協定”(spv),即在不運作完整區塊鍊網絡節點的情況下,也能夠對交易資料進行檢驗。是以,在區塊鍊中使用merkle樹這種資料結構是非常具有意義的。本書後面的章節将會對merkle樹做詳細介紹。

8.?雙重支付

雙重支付問題又稱為“雙花”問題,即利用貨币的數字特性用“同一筆錢”完成兩次或者多次支付。在傳統的金融和貨币體系中,由于金錢貨币是實體實體,具有客觀唯一存在的屬性,是以可以避免雙重支付的情況。但在其他的電子貨币系統中,則需要可信的第三方管理機構提供保證。區塊鍊技術則在去中心化的系統中不借助任何第三方機構而隻通過分布式節點之間的互相驗證和共識機制,有效地解決了雙重支付問題,在資訊傳輸的同時完成了價值轉移。區塊鍊技術通過區塊連結形成的時間戳技術加上驗證比特币是否滿足utxo(未花費交易)和數字簽名,有效避免了雙重支付的問題。如果有人用同一筆utxo構造了兩筆付給不同交易方的交易,則比特币用戶端隻會轉發最先被偵聽到的那個。礦工會選擇将那筆交易包入未來區塊,當其中一筆交易所在的區塊後有5個連結的區塊,這筆交易已經得到了6次确認。在比特币區塊鍊上,6次确認後可以基本上保證比特币不被雙花。

9.?p2p網絡

p2p網絡(peer-to-peer network,對等網絡)是一種在對等者(peer)之間配置設定任務和工作負載的分布式應用架構,是對等計算模型在應用層形成的一種組網或網絡形式。是以,從字面上,p2p可以了解為對等計算或對等網絡,p2p網絡示意圖如圖2-5所示。國内的迅雷軟體采用的就是p2p技術。區塊鍊系統是建立在ip通信協定和分布式網絡的基礎上的,它不依靠傳統的電路交換,而是建立于網絡通信之上,完全通過網際網路去交換資訊。網絡中所有的節點具有同等的地位,不存在任何特殊化的中心節點和層級結構,每個節點均會承擔網絡路由、驗證資料區塊等功能。網絡的節點根據存儲資料量的不同可以分為全節點和輕量級節點,全節點存儲了從創世區塊以來的所有區塊鍊資料(比特币網絡現在大約有幾十gb,且還在不斷增長中)。全節點的優點是進行資料校驗時不需要依靠别的節點,僅依靠自身就可以完成校驗更新等操作,缺點是硬體成本較高。輕量級節點隻需要存儲部分資料資訊,當需要别的資料時可以通過簡易支付驗證方式(simplif?ied payment verif?ication,spv)向鄰近節點請求所需資料來完成驗證更新。

圖2-5 p2p網絡

10.?加密算法

除了雜湊演算法以外,比特币中還存在一種為交易加密的非對稱加密算法(橢圓曲線加密算法)。非對稱加密算法指的就是存在一對數學相關的密鑰,使用其中一個密鑰進行加密的資料資訊,隻有使用另一個密鑰才能對該資訊進行解密。這對密鑰中,對外公開的密鑰叫作公鑰,不公開的密鑰就叫作私鑰。打個比方來說,公鑰就像銀行的賬戶,私鑰就像是該賬戶的密碼或者賬戶所有者的簽名。區塊鍊之上的有效交易有一個用于交易發起方私鑰簽名有效的數字簽名,而該交易的簽名可以通過使用交易發起方的公鑰進行驗證。公鑰可以通過算法從私鑰中計算得出,但私鑰卻不能從公鑰中推出。比特币系統中使用的就是一種非常典型的非對稱加密算法——橢圓曲線加密算法(ecc)。

如圖2-6所示,比特币系統一般從作業系統底層的一個密碼學安全的随機源中取出一個256位随機數作為私鑰,私鑰總數為2256個,是以很難通過周遊所有可能的私鑰得出與公鑰的對應的私鑰。使用者使用的私鑰還會通過sha256和base58轉換成易書寫和識别的50位長度的私鑰,公鑰則首先由私鑰和secp256k1橢圓曲線算法生成65位元組長度的随機數。一般情況下,比特币錢包的位址也由公鑰所生成,其生成過程為首先将公鑰進行sha256和ripemd160雙哈希運算,并生成20位元組長度的摘要結果(即hash160結果),這個将作為比特币位址的主體(body)資訊,再在前面加上版本字首0x00,在後面添加4個位元組的位址校驗碼。位址校驗碼通過對摘要結果進行兩次sha256運算,取哈希值的前4位産生。最後通過base58處理把連在一起的版本字首、主體資訊和校驗碼轉換成可以容易讓人識别的比特币字元位址。

圖2-6 比特币非對稱加密機制

11.?數字簽名

數字簽名就是在資訊後面加上另一段内容,作為發送者的證明并且證明資訊沒有被篡改。一般是發送者将資訊用雜湊演算法處理得出一個哈希值,然後用私鑰對該哈希值進行加密,得出一個簽名。然後發送者再将資訊和簽名一起發送給接收者。接收者使用發送者的公鑰對簽名進行解密,還原出哈希值,再通過雜湊演算法來驗證資訊的哈希值和解密簽名還原出來的哈希值是否一緻,進而可以鑒定資訊是否來自發送者或驗證資訊是否被篡改。

12.?比特币的隐私模型

傳統隐私模型(見圖2-7)為交易的參與者提供了一定程度的隐私保護,第三方不會交出交易者的個人身份資訊,公衆所得知的隻是某個人将一定數量的貨币發給了另外一個人,但是難以将該交易與某個特定身份的人聯系起來,公衆無法知道這人到底是誰。這同股票交易所釋出的資訊是類似的,每一手股票買賣發生的時間、交易量是記錄在案且可供查詢的,但是交易雙方的身份資訊卻不予透露。但實際上,交易雙方的個人資訊是存放在第三方機構,是以一定程度上交易參與者的隐私資訊還是會有洩露的風險。

圖2-7 傳統隐私模型

在比特币的隐私模型(見圖2-8)中,所有的交易不需要第三方的操控,也不需要提供任何身份資訊,隻需要提供比特币的位址就可以跟任何人完成一次準匿名的交易。在一定程度上,交易不可追溯到交易者本身,是以比特币上的交易可以在一定程度上擺脫監管。但通過對區塊鍊上交易的位址以及交易額做關聯分析,也可以獲得有關交易者的蛛絲馬迹。是以,比特币的交易還不是純粹的匿名交易機制,而是準匿名(pseudo-anonymous)交易機制。

圖2-8 比特币的隐私模型

2.1.2 架構與特點

1.?架構簡介

目前大多數區塊鍊技術的應用與比特币類似,大部分是在比特币架構基礎上的擴充。目前,區塊鍊技術在金融行業得到廣泛關注,被認為可以用來從最底層重構傳統金融業現有的it基礎架構。我們将區塊鍊的基礎架構分為三層來進行講解,如圖2-9所示。

圖2-9 區塊鍊基礎架構

首先,在網絡層之上,區塊鍊是建立在ip通信協定和對等網絡的基礎上的一個分布式系統,和傳統帶中心的分布式系統不一樣,它不依靠中心化的伺服器節點來轉發消息,而是每一個節點都參與消息的轉發。是以p2p網絡比傳統網絡具有更高的安全性,任何一個節點被攻擊都不會影響整個網絡,所有的節點都儲存着整個系統的狀态資訊。

其次,在資料層面上,區塊鍊就是一個隻可追加、不可更改的分布式資料庫系統,是一個分布式賬本。如果是公開的區塊鍊,也就是公有鍊,那麼這個賬本可以被任何人在任何地方進行查詢,完全公開透明。在區塊鍊網絡中,節點通過使用共識算法來維持網絡中賬本資料庫的一緻性。同時采用密碼學的簽名和雜湊演算法來確定這個資料庫不可篡改,不能作僞,并且可追溯。例如,在比特币系統中,隻有在控制了51%的網絡算力時才有可能對區塊鍊進行重組以修改賬本資訊。由于比特币系統的設計者中本聰在系統設計中巧妙地加入了帶有經濟激勵的挖礦工作量證明(pow)機制,使得即使擁有網絡51%以上算力的人也不會損害其自身利益而發起對網絡的攻擊。是以,比特币系統自上線7年多來一直持續不斷地正常運作,沒有出現過因為比特币系統本身缺陷而造成的安全故障。

再次,在應用層面,我們可以用區塊鍊代替傳統的登記、清算系統。2016年6月22日,波士頓咨詢公司指出,到2030年,全球支付業務收入預計将會達到8070億美元。基于區塊鍊技術的彙兌和支付屬于區塊鍊的1.0應用版,其安全性、交易時間、成本都會對傳統支付業務進行颠覆式改進。花旗銀行也明确指出,到2020年,如果各大金融機構都使用區塊鍊技術,每年能夠節省超過200億美元的成本。國信證券分析報告指出,通過區塊鍊的點對點分布式的時間戳伺服器來生成依照時間前後排列并加以記錄的電子交易證明,可以解決雙重支付問題,進而帶來結算成本趨零的可能性。根據德國銀行的一份引用波士頓咨詢的研究報告,歐洲銀行的it成本支出平均占據銀行整體運作成本的16%[5]。一個重要原因就是傳統銀行在賬本的維護、支付交易的結算和清算方面的架構過于複雜,維護成本過高。

在應用方面,區塊鍊平台能夠提供程式設計環境讓使用者編寫智能合約。通過智能合約,可以把業務規則轉化成在區塊鍊平台自動執行的合約,該合約的執行不依賴可信任的第三方,也不受人為的幹預。理論上隻要一旦部署,一旦符合合約執行的條件就會自動執行。執行結果也可以在區塊鍊上供公開檢查,提供了合約的公正性和透明性。是以,智能合約可以降低合約建立、執行和仲裁中所涉及的中間機構成本。區塊鍊的智能合約奠定了未來建立可程式設計貨币、可程式設計金融,甚至是可程式設計社會的基礎。

2.?架構特點

區塊鍊具有去中心化、可靠資料庫、開源可程式設計、集體維護、安全可信、交易準匿名性等特點。如果一個系統不具有以上特征,将不能被視為基于區塊鍊技術的應用。

(1)去中心化

區塊鍊資料的存儲、傳輸、驗證等過程均基于分布式的系統結構,整個網絡中不依賴一個沒有中心化的硬體或管理機構。作為區塊鍊一種部署模式,公共鍊網絡中所有參與的節點都可以具有同等的權利和義務。

(2)可靠資料庫

區塊鍊系統的資料庫采用分布式存儲,任一參與節點都可以擁有一份完整的資料庫拷貝。除非能控制系統中超過一半以上的算力,否則在節點上對資料庫的修改都将是無效的。參與系統的節點越多,資料庫的安全性就越高。并且區塊鍊資料的存儲還帶有時間戳,進而為資料添加了時間次元,具有極高的可追溯性。

(3)開源可程式設計

區塊鍊系統通常是開源的,代碼高度透明公共鍊的資料和程式對所有人公開,任何人都可以通過接口查詢系統中的資料。并且區塊鍊平台還提供靈活的腳本代碼系統,支援使用者建立進階的智能合約、貨币和去中心化應用。例如,以太坊(ethereum)平台即提供了圖靈完備的腳本語言,供使用者來建構任何可以精确定義的智能合約或交易類型。關于以太坊的更多内容請參考2.2節。

(4)集體維護

系統中的資料塊由整個系統中所有具有記賬功能的節點來共同維護,任一節點的損壞或失去都不會影響整個系統的運作。

(5)安全可信

區塊鍊技術采用非對稱密碼學原理對交易進行簽名,使得交易不能被僞造;同時利用雜湊演算法保證交易資料不能被輕易篡改,最後借助分布式系統各節點的工作量證明等共識算法形成強大的算力來抵禦破壞者的攻擊,保證區塊鍊中的區塊以及區塊内的交易資料不可篡改和不可僞造,是以具有極高的安全性。

(6)準匿名性

區塊鍊系統采用與使用者公鑰挂鈎的位址來做使用者辨別,不需要傳統的基于pki(public key infrastructure)的第三方認證中心(certif?icate authority,ca)頒發數字證書來确認身份。通過在全網節點運作共識算法,建立網絡中誠實節點對全網狀态的共識,間接地建立了節點間的信任。使用者隻需要公開位址,不需要公開真實身份,而且同一個使用者可以不斷變換位址。是以,在區塊鍊上的交易不和使用者真實身份挂鈎,隻是和使用者的位址挂鈎,具有交易的準匿名性。。

區塊鍊技術的核心優勢是去中心化,能夠通過運用雜湊演算法、數字簽名、時間戳、分布式共識和經濟激勵等手段,在節點無需互相信任的分布式系統中建立信用,實作點對點交易和協作,進而為中心化機構普遍存在的高成本、低效率和資料存儲不安全等問題提供了解決方案。近年來,伴随着國内外研究機構對區塊鍊技術的研究與應用,區塊鍊的應用前景受到各行各業的高度重視,被認為是繼大型機、個人電腦、網際網路、移動/社交網絡之後計算範式的第5次颠覆式創新,是人類信用進化史上繼血親信用、貴金屬信用、央行紙币信用之後的第4個裡程碑。它被視為下一代雲計算的雛形,有望徹底重塑人類社會活動形态,并實作從現在的資訊網際網路到價值網際網路的轉變。

2.1.3 區塊鍊運作的核心技術

1.?區塊鍊的連結

顧名思義,區塊鍊即由一個個區塊組成的鍊。每個區塊分為區塊頭和區塊體(含交易資料)兩個部分。區塊頭包括用來實作區塊連結的前一區塊的哈希(prevhash)值(又稱散列值)和用于計算挖礦難度的随機數(nonce)。前一區塊的哈希值實際是上一個區塊頭部的哈希值,而計算随機數規則決定了哪個礦工可以獲得記錄區塊的權力。區塊鍊的連結模型如圖2-10所示。

圖2-10 區塊鍊的連結模型

2.?共識機制

區塊鍊是伴随比特币誕生的,是比特币的基礎技術架構。可以将區塊鍊了解為一個基于網際網路的去中心化記賬系統。類似比特币這樣的去中心化數字貨币系統,要求在沒有中心節點的情況下保證各個誠實節點記賬的一緻性,就需要區塊鍊來完成。是以區塊鍊技術的核心是在沒有中心控制的情況下,在互相沒有信任基礎的個體之間就交易的合法性等達成共識的共識機制。

區塊鍊的共識機制目前主要有4類:pow、pos、dpos、分布式一緻性算法。

(1)pow

pow(工作量證明),也就是像比特币的挖礦機制,礦工通過把網絡尚未記錄的現有交易打包到一個區塊,然後不斷周遊嘗試來尋找一個随機數,使得新區塊加上随機數的哈希值滿足一定的難度條件,例如前面10位是零。找到滿足條件的随機數,就相當于确定了區塊鍊最新的一個區塊,也相當于獲得了區塊鍊的本輪記賬權。礦工把滿足挖礦難度條件的區塊在網絡中廣播出去,全網其他節點在驗證該區塊滿足挖礦難度條件,同時區塊裡的交易資料符合協定規範後,将各自把該區塊連結到自己版本的區塊鍊上,進而在全網形成對目前網絡狀态的共識。

優點:完全去中心化,節點自由進出,避免了建立和維護中心化信用機構的成本。隻要網絡破壞者的算力不超過網絡總算力的50%,網絡的交易狀态就能達成一緻。

缺點:目前比特币挖礦造成大量的資源浪費;另外挖礦的激勵機制也造成礦池算力的高度集中,背離了當初去中心化設計的初衷。更大的問題是pow機制的共識達成的周期較長,每秒隻能最多做7筆交易,不适合商業應用。

(2)pos

pos權益證明,要求節點提供擁有一定數量的代币證明來擷取競争區塊鍊記賬權的一種分布式共識機制。如果單純依靠代币餘額來決定記賬者必然使得富有者勝出,導緻記賬權的中心化,降低共識的公正性,是以不同的pos機制在權益證明的基礎上,采用不同方式來增加記賬權的随機性來避免中心化。例如點點币(peercoin)pos機制中,擁有最多鍊齡長的比特币獲得記賬權的幾率就越大。nxt和blackcoin則采用一個公式來預測下一個記賬的節點。擁有多的代币被選為記賬節點的機率就會大。未來以太坊也會從目前的pow機制轉換到pos機制,從目前看到的資料看,以太坊的pos機制将采用節點下賭注來賭下一個區塊,賭中者有額外以太币獎,賭不中者會被扣以太币的方式來達成下一區塊的共識。

優點:在一定程度上縮短了共識達成的時間,降低了pow機制的資源浪費。

缺點:破壞者對網絡攻擊的成本低,網絡的安全性有待驗證。另外擁有代币數量大的節點獲得記賬權的幾率更大,會使得網絡的共識受少數富裕賬戶支配,進而失去公正性。

(3)dpos

dpos(股份授權證明)機制,類似于董事會投票。比特股(bitshares)采用的pos機制是持股者投票選出一定數量的見證人,每個見證人按序有兩秒的權限時間生成區塊,若見證人在給定的時間片不能生成區塊,區塊生成權限交給下一個時間片對應的見證人。持股人可以随時通過投票更換這些見證人。dpos的這種設計使得區塊的生成更為快速,也更加節能。

優點:大幅縮小參與驗證和記賬節點的數量,可以達到秒級的共識驗證。

缺點:選舉固定數量的見證人作為記賬候選人有可能不适合于完全去中心化的場景。另外在網絡節點數少的場景,選舉的見證人的代表性也不強。

(4)分布式一緻性算法

分布式一緻性算法是基于傳統的分布式一緻性技術。其中有分為解決拜占庭将軍問題的拜占庭容錯算法,如pbft。另外解決非拜占庭問題的分布式一緻性算法(pasox、raft),詳細見本書第5章的共識算法。該類算法目前是聯盟鍊和私有鍊鍊場景中常用的共識機制。

優點:實作秒級的快速共識機制,保證一緻性。

缺點:去中心化程度不如公有鍊上的共識機制;更适合多方參與的多中心商業模式。

3.?解鎖腳本

腳本是區塊鍊上實作自動驗證、自動執行合約的重要技術。每一筆交易的每一項輸出嚴格意義上并不是指向一個位址,而是指向一個腳本。腳本類似一套規則,它限制着接收方怎樣才能花掉這個輸出上鎖定的資産。

交易的合法性驗證也依賴于腳本。目前它依賴于兩類腳本:鎖定腳本與解鎖腳本。鎖定腳本是在輸出交易上加上的條件,通過一段腳本語言來實作,位于交易的輸出。解鎖腳本與鎖定腳本相對應,隻有滿足鎖定腳本要求的條件,才能花掉這個腳本上對應的資産,位于交易的輸入。通過腳本語言可以表達很多靈活的條件。解釋腳本是通過類似我們程式設計領域裡的“虛拟機”,它分布式運作在區塊鍊網絡裡的每一個節點。

比特币的腳本目前常用的主要分為兩種,一種是普通的p2pkh(pay-to-public-key-hash),即支付給公鑰的哈希位址,接收方隻需要使用位址對應的私鑰對該輸出進行簽名,即可花掉該輸出。另一種是p2sh(pay-to-script-hash),即支付腳本的哈希。以多重簽名來舉例,它要求該輸出要有n把私鑰中的m把私鑰(m≤n)同時簽名才能花掉該資産,它類似于現實生活中需要多把鑰匙才能同時打開的保險櫃,或是多人簽名才能使條約生效一樣,隻是它是自動執行。

比如在比特币中,p2pkh的腳本規則如下:

pubkey script: op_dup op_hash160 &lt;pubkeyhash&gt; op_equalverify op_checksig

signature script: &lt;sig&gt; &lt;pubkey&gt;

p2sh的腳本規則如下:

pubkey script: op_hash160 &lt;hash160(redeemscript)&gt; op_equal

signature script: &lt;sig&gt; [sig] [sig...] &lt;redeemscript&gt;

在上述的兩種腳本規則裡,pubkey script代表鎖定腳本,signature script代表解鎖腳本。op_開頭的單詞是相關的腳本指令,也是“虛拟機”所能解析的指令。這些指令規則根據pubkey script的不同來進行劃分,它也決定解鎖腳本的規則。

比特币中的腳本機制相對簡單,隻是一個基于堆棧式的、解釋相關op指令的引擎,能夠解析的腳本規則并不是太多,不能實作很複雜的邏輯。但它為區塊鍊可程式設計提供了一個原型,後續一些可程式設計區塊鍊項目其實是基于腳本的原理發展起來的,比如以太坊就是深入增強了腳本機制,腳本機制裡不再單單是簡單的op指令,而是支援腳本的一套圖靈完備語言,該腳本語言可以通過“虛拟機”去執行。以太坊實作了一個支援圖靈完備腳本語言的區塊鍊平台。

腳本的機制對于區塊鍊來說非常重要,它類似于區塊鍊技術提供的一個擴充接口,任何人都可以基于這個接口開發基于區塊鍊技術的應用,比如智能合約的功能。腳本機制也讓區塊鍊技術作為一項底層協定成為可能。未來很多基于區塊鍊的颠覆性應用,都有可能通過區塊鍊的腳本語言來完成。

4.?交易規則

區塊鍊的交易就是構成區塊的基本機關,也是區塊鍊負責記錄的實際有效内容。一個區塊鍊交易可以是一次轉賬,也可以是智能合約的部署等其他事務。

就比特币而言,交易即指一次支付轉賬。其交易規則如下:

1)交易的輸入和輸出不能為空。

2)對交易的每個輸入,如果其對應的utxo輸出能在目前交易池中找到,則拒絕該交易。因為目前交易池是未被記錄在區塊鍊中的交易,而交易的每個輸入,應該來自确認的utxo。如果在目前交易池中找到,那就是雙花交易。

3)交易中的每個輸入,其對應的輸出必須是utxo。

4)每個輸入的解鎖腳本(unlocking script)必須和相應輸出的鎖定腳本(locking script)共同驗證交易的合規性。

對于以太坊來說,交易還可能是智能合約的部署。交易規則就确定了符合一定文法規則的合約才能被部署在區塊鍊上。

5.?交易優先級

區塊鍊交易的優先級由區塊鍊協定規則決定。對于比特币而言,交易被區塊包含的優先次序由交易廣播到網絡上的時間和交易額的大小決定。随着交易廣播到網絡上的時間的增長,交易的鍊齡增加,交易的優先級就被提高,最終會被區塊包含。對于以太坊而言,交易的優先級還與交易的釋出者願意支付的交易費用有關,釋出者願意支付的交易費用越高,交易被包含進區塊的優先級就越高。

6.?merkle證明

merkle證明的原始應用是比特币系統(bitcoin),它是由中本聰(satoshi nakamoto)在2009年描述并且創造的。比特币區塊鍊使用了merkle證明,為的是将交易存儲在每一個區塊中。使得交易不能被篡改,同時也容易驗證交易是否包含在一個特定區塊中,merkle樹說明詳見4.2節。比特币的merkle證明樹如圖2-11所示。

圖2-11 比特币的merkle證明樹

merkle樹的一個重要使用場景就是快速支付驗證,也就是中本聰描述的“簡化支付驗證”(spv)的概念:輕量級節點(light client)不用下載下傳每一筆交易以及每一個區塊,可以僅下載下傳鍊的區塊頭,每個區塊中僅包含下述5項内容,資料塊大小為80位元組。

上一區塊頭的哈希值

時間戳

挖礦難度值

工作量證明随機數(nonce)

包含該區塊交易的merkle樹的根哈希

如果一個輕用戶端希望确定一筆交易的狀态,它可以簡單地要求一個merkle證明,顯示出一個在merkle樹特定的交易,其根是在主鍊(main chain,非分叉鍊)上的區塊頭。

merkle證明可以讓區塊鍊得到更廣闊的應用,但比特币的輕客戶有其局限性。雖然可以證明包含的交易,但無法證明任何目前的狀态(例如:數字資産的持有,名稱注冊,金融合約的狀态等)。一筆交易影響的确切性質(precise nature)可以取決于此前的幾筆交易,而這些交易本身則依賴于更為前面的交易,是以最終你需要驗證整個鍊上的每一筆交易。為了解決這個問題,以太坊進行了更進一步的創新。

以太坊的每一個區塊頭中并非隻包含一棵merkle樹,而是包含了3棵merkle樹(見圖2-12),分别對應了以下3種對象:

交易(transactions)

收據(receipts,基本上,它是展示每一筆交易影響的資料條)

狀态(state)

圖2-12 以太坊的merkle證明樹

這三棵樹允許輕用戶端輕松地進行并核實以下類型的查詢答案:

1)這筆交易被包含在特定的區塊中了嗎?

2)告訴我這個位址在過去30天中,發出x類型事件的所有執行個體(例如,一個衆籌合約完成了它的目标)。

3)目前我的賬戶餘額是多少?

4)這個賬戶是否存在?

5)假裝在這個合約中運作這筆交易,它的輸出會是什麼?

第一種是由交易樹(transaction tree)來處理的;第3和第4種則是由狀态樹(state tree)負責處理,第2種則由收據樹(receipt tree)處理。計算前4個查詢任務是相當簡單的。在伺服器簡單地找到對象,擷取梅克爾分支,并通過分支來回複輕用戶端。第5種查詢任務同樣也是由狀态樹處理。

7.?rlp

rlp(recursive length pref?ix,遞歸長度字首編碼)是ethereum中對象序列化的一個主要編碼方式,其目的是對任意嵌套的二進制資料的序列進行編碼。

以太坊中的所有資料都以“遞歸長度字首編碼”(recursive length pref?ix encoding,rlp)形式存儲,這種編碼格式将任意長度和次元的字元串構成的數組串連接配接成字元串。例如,['dog', 'cat']被串接(以位元組數組格式)為[130,67,100,111,103,67,99,97,116];其基本的思想是把資料類型和長度編碼成一個單獨的位元組放在實際資料的前面(例如‘dog’的位元組數組編碼為[100,111,103],于是串接後就成了[67,100,111,103])。注意rlp編碼正如其名字表示的一樣,是遞歸的;當rlp編碼一個數組時,實際上是在對每一個元素的rlp編碼級聯成的字元串編碼。需要進一步提請注意的是,以太坊中所有資料都是整數;是以,如果有任何的以一個或多個0位元組開頭的哈希或者位址,這些0位元組應該在計算出現問題的時候去除。以太坊中沒有串接資料結構包含任何以0開頭的數值。整數以大端基礎(big endian)256格式存儲(例如32767位元組數組格式為[127,255])。

2.1.4 區塊鍊交易流程

以比特币的交易為例,區塊鍊的交易并不是通常意義上的一手交錢一手交貨的交易,而是轉賬。如果每一筆轉賬都需要構造一筆交易資料會比較笨拙,為了使得價值易于組合與分割,比特币的交易被設計為可以納入多個輸入和輸出,即一筆交易可以轉賬給多個人。從生成到在網絡中傳播,再到通過工作量證明、整個網絡節點驗證,最終記錄到區塊鍊,就是區塊鍊交易的整個生命周期。整個區塊鍊交易流程如圖2-13所示。

圖2-13 區塊鍊交易流程

交易的生成。所有者a利用他的私鑰對前一次交易和下一位所有者b簽署一個數字簽名,并将這個簽名附加在這枚貨币的末尾,制作成交易單。

交易的傳播。a将交易單廣播至全網,每個節點都将收到的交易資訊納入一個區塊中。

工作量證明。每個節點通過相當于解一道數學題的工作量證明機制,進而獲得建立新區塊的權力,并争取得到數字貨币的獎勵。

整個網絡節點驗證。當一個節點找到解時,它就向全網廣播該區塊記錄的所有蓋時間戳交易,并由全網其他節點核對。

記錄到區塊鍊。全網其他節點核對該區塊記賬的正确性,沒有錯誤後他們将在該合法區塊之後競争下一個區塊,這樣就形成了一個合法記賬的區塊鍊。