1 貨幣的演變-從貝殼到比特幣
當社會分工產生之后,人類就產生了商品交換的需求。在貨幣被發明之前,人類是以以物換物的方式進行的。但顯然以物換物存在著商品價值無法精確衡量,效率低下的問題。試想一下,老王扛著一只羊走了一公里山路到老張家里想換幾只雞好過年,但是換6只雞老王覺得虧,換7只老張又不干。于是人類發明了貨幣,作為一般等價物,貨幣可以對商品價值進行精確度量,利于提高商品交換的效率,老王也再也不用扛著羊走山路了,拿著貨幣去買就好。但是最早的貨幣是實物貨幣,也就是貝殼、金、銀、銅這些東西。能充當實物貨幣的東西都具有一定的稀缺性,即一般人不是那么容易就能搜尋或挖掘到很多的,存量有限。后來隨著社會經濟的發展,交易越來越頻繁,人們發現實物貨幣也存在著很多的弊端。比如易損耗,保存、攜帶都很不方便、不安全。于是紙幣就被發明出來了。紙幣最早在我國北宋年間就出現了,被稱為“交子”,由官方發行。相較于實物貨幣本身具有收藏價值,紙質貨幣本身只是一張紙,并沒有什么價值,它的價值完全依賴于發行該紙幣的政府的信用。因為人們預期拿著這張紙是可以從政府那里換到金子銀子的。看上去這并沒有什么問題,但是一旦政府失信,紙幣也就形同廢紙。政府失信的事在歷史不是沒有發生過,比如清朝國庫存銀緊張時,民眾手里的銀票就只能打折換銀子,再比如民國后期,政府瘋狂印刷金圓券,物價飛漲,民眾手里的紙幣飛速貶值。政府在法定貨幣上的失信相當于掠奪了民眾手里的財富。
現代社會,是不是所有的財富都需要印刷成紙幣在社會上流通呢?也不是,紙幣所代表的財富只占社會總財富很小的一部分,國家發行紙幣的總量只要滿足市場交易的需要即可,大部分財富是以數字貨幣的形式存在,每個人的財富只是一串數字,這些數字統統記錄在銀行的賬本上,當然銀行的賬本現在表現就是計算機里的數據庫。在這種情況下,假設小李從蘇寧買了臺價值3000元的空調,收銀的時候只要將小李的銀行賬戶余額C(小李)-3000,再將蘇寧的銀行賬戶余額C(蘇寧)+3000就可以了。當然現在也可能需要支付寶或者銀聯等第三方支付提供商做中介完成這筆交易。銀行在修改余額即賬本數據的時候,需要做一些檢查,首先需要小李提供賬戶密碼,用以證明小李對賬戶余額具有使用權,接著銀行還要檢查小李的賬戶余額是否大于等于3000,如果余額不足返回交易失敗提示。整個交易過程中,銀行作為第三方機構,獨立完成了這次交易支付。由于我們國家的國有銀行有政府做信用背書,所以小李和蘇寧都選擇相信銀行不會有欺詐行為。但是不是就完全沒有風險了呢?并不是。即使銀行不會主觀上產生欺詐的想法,但同樣存在記賬錯誤,或是外來惡意攻擊的風險。一旦銀行的賬本數據發生錯誤或被惡意篡改,小李和蘇寧將沒有辦法證明自己所擁有的準確的財富。
2009年,中本聰在網上發表了比特幣白皮書《比特幣:⼀個點對點的電子現金系統》,宣告了比特幣的誕生。由于刻意隱藏,至今沒有人知道中本聰的真實身份,但是比特幣確是一個天才式的創造。比特幣參考了在它之前被發明的數十種加密數字貨幣所取得的成果,這些貨幣由于各種原因都失敗了,一個主要的原因是無法解決“雙重支付”問題,所謂“雙重支付”是指同一筆貨幣被重復支付給不同的賬戶。中本聰認為之前的加密數字貨幣之所以失敗,主要是因為它們都不同程度上存在一個中心機構,一旦這個中心機構失效,整個加密貨幣系統就崩潰了。所以比特幣被設計成一個去中心化的系統,它運用分布式賬本和特有的共識機制解決了“雙重支付”問題。
2 比特幣與區塊鏈的基本原理
2.1 比特幣簡介
之前已經介紹過,數字貨幣的本質就是一個賬本。當有交易發生,資金所有權發生轉移(或稱價值轉移),就通過在這個賬本上記賬來體現。傳統貨幣金融系統,央行承擔貨幣發行的職責,商業銀行承擔放貸和吸儲的職責,每筆交易記錄、每個賬戶余額都存在銀行的賬本上,銀行此時是作為一個中心機構。比特幣系統完全運行在互聯網上,并沒有一個中心機構替用戶保存賬本。相反,每一個持有比特幣、運用比特幣完成交易的節點(完全節點)都會在本地保存一份賬本,并從網絡上接收新的交易數據對自己的賬本進行更新。所以說,不同于傳統貨幣交易賬本由銀行私密保存,比特幣的賬本是公開的,分布式存儲在每一個參與交易的節點上。
比特幣系統是一種P2P網絡系統,網絡中并不存在任何中心節點,所有P2P網絡中的節點地位都是相等的,每個節點從網絡接收資源和服務的同時也向網絡中的其它節點提供資源和服務。想加入比特幣網絡也很簡單,從比特幣官方網站下載比特幣客戶端并安裝到自己的計算機,保證本地存儲系統有足夠的空間來存儲公共賬本數據,運行比特幣客戶端并聯入互聯網,客戶端端口會自動連接到若干現有節點,此時這臺計算機就可以作為比特幣網絡中的一個節點存在了。初始加入的比特幣節點可以從其它節點接收賬本數據并保存下來。比特幣網絡中的節點時時刻刻都是在動態變化的,一個節點可以隨時選擇退出,重新加入時只需要連接其它節點并接收它離開期間新增的交易數據就可以。
雖然每個節點都保存有比特幣交易賬本,但為了保持所有賬本副本的一致性,每筆交易只能安排一個節點記賬,其它節點同步新增的交易數據。那到底哪個節點擁有記賬的資格呢?比特幣系統采用了競爭記賬的機制。所有節點共同參與一個解方程大賽,由于這個方程解空間巨大且無任何求解的規律可言,每個參與競賽的節點只能采用隨機嘗試的辦法搜索方程的解。這樣一來,解方程大賽就變成了對各節點計算機運算能力的一場考驗,擁有最強大運算能力的節點顯然可能更快找到解。一旦某個節點率先找到一個滿足要求的解,它就搶到了本次競賽的記賬權。這樣的解方程競賽大約每10分鐘在全網舉行一次,搶到記賬權的節點迅速將過去10分鐘全網發生的交易數據記錄到一個新的區塊(區塊鏈的基本單位,可以看成是一個具有特定數據結構的文件),并將這個區塊馬上向全網分發,網上的其它節點接收到這個區塊時,它就意識到本次解方程大賽已經結束了,進而馬上停止本輪的解方程競賽,同時開始下一輪解方程大賽。
比特幣交易的過程完全是匿名的。比特幣客戶端有錢包的功能,比特幣錢包并不存儲貨幣,存儲的是地址和私鑰。根據非對稱加密的原理,一對非對稱密鑰分為公鑰和私鑰,私鑰私密保存,公鑰可以公開出來,其它節點想給當前節點加密發送消息時,可以用公鑰對消息進行加密,只有擁有私鑰的節點才能對消息解密,這樣就保證了信息傳輸不會被泄漏。在比特幣網絡,每個節點的私鑰由錢包加密存儲,用戶也可以備份成其他形式存儲。公鑰經雙Hash運算得到的字符串,被稱為地址,其實就是另一種形式的公鑰。一個比特幣地址和它對應的私鑰就可以看成一個賬戶,地址可以看做用戶名,私鑰看做賬戶密碼。擁有私鑰的人就擁有這個地址上的所有資金。比特幣的賬本數據中并不存在賬戶余額的概念。事實上賬本數據中如果用余額字段來表示每個節點擁有的資產,那么余額字段的數據是很容易被惡意篡改的。既然沒有余額數據,那么交易時就沒有辦法通過對相關節點余額字段的修改實現。事實上,比特幣交易中“花費”的是在交易中生成的“未使用的交易輸出(UTXO)”。每一筆交易轉賬相當于將一筆錢注冊到新的地址上。比特幣地址并沒有余額,有的是遍布在賬本里所有注冊在這個地址上的UTXO。相當于這個地址所擁有的資金分布在一筆筆交易記錄中。比特幣客戶端顯示的賬戶余額其實是對賬本數據中隸屬于當前節點的UTXO逐一統計得到的結果。
2.2 比特幣交易
比特幣將貨幣、交易、賬本全都變成了一種數據結構,所以看一下一筆交易的數據結構你會更理解。
表2-1 交易結構
如表2-1所示,一筆交易可以包含多個輸入并形成多個輸出。尚未被“花費”的交易輸出即UTXO(unspent transaction output),所謂“花費”指將這筆錢注冊到其它地址(資金所有權轉移)。時間戳標記這筆交易發生的時間。再來看一下交易輸出(表2-2)和輸入(表2-3)的數據結構。
表2-2 交易輸出結構
交易輸出的數據結構很簡單,主要就是資金總量和鎖定腳本。資金總量表明了轉賬了多少錢。鎖定腳本其實表明了這筆錢的所有權。鎖定腳本里包含的最重要的內容是轉賬的目標地址,之前我們也介紹過,比特幣地址其實就是公鑰轉換得到的。交易輸出里包含了目標地址相當于用公鑰給這筆錢(交易輸出)上了一把鎖,只有唯一那個有對應鑰匙(私鑰)的用戶才可以使用它。
交易輸入的數據結構如表2-3,主要包括指向UTXO的指針和解鎖腳本。注意到,比特幣賬本里只有交易輸出才記錄了資金,交易輸入只是使用資金時用的那把鑰匙。其中指向UTXO的指針字段表明要“花費”哪個UTXO。解鎖腳本包含了用戶的私鑰,正確的私鑰可以解密UTXO鎖定腳本中的公鑰加密。解鎖腳本和鎖定腳本一起運行就可以正確使用UTXO完成交易了。
表2-3 交易輸入結構
現在小李從蘇寧購買了一臺空調,需要支付0.15比特幣,小李的比特幣客戶端里的錢包模塊會從所有注冊在小李地址上的UTXO中選出一個數額最合適的,假設最合適的UTXO的面值是0.2比特幣。現在,小李的錢包就會創建一筆新的交易,輸入就是面值0.2比特幣的UTXO,生成一筆0.15比特幣的輸出(一個UTXO),輸出鎖定腳本包含蘇寧的地址。與此同時生成一筆地址為自己的輸出0.04比特幣(另一個UTXO),也就是找零。但是這里0.2-0.15-0.04=0.01,剩余的0.01比特幣作為交易費用,用來獎勵承擔記賬工作的節點,贏得記賬權的節點會自動收集的。
2.2.1 交易周期
一筆比特幣交易的生命周期從它被創建的那一刻開始,節點會將這筆交易在比特幣網絡上廣播,收到這筆交易數據的節點會對交易有效性進行獨立檢驗。檢驗內容包括語法和數據格式是否有誤、交易輸入和輸出是否為空等等。通過獨立驗證的交易會被放入節點自己的交易池,同時繼續向其它節點廣播,沒有通過檢驗的交易直接被拒絕并不再廣播。等到這筆交易被網絡上的大部分節點驗證,可能耗時不到一秒鐘,交易會最終被一個挖礦節點驗證并記錄到區塊鏈上一個還記錄有很多其他交易的區塊上(挖礦節點:參與解方程大賽并取得當次記賬權的節點)。此時這筆交易的交易輸出(UTXO)還不能被使用,等到區塊鏈中在這個區塊之上又生成足夠多的區塊,交易才成為區塊鏈總賬簿的一部分,這時交易輸出UTXO就可以被新的資金擁有者在下一筆交易中使用了,這樣就進入下一個交易周期了。
2.3 比特幣網絡與節點
比特幣運行在互聯網上并采用P2P協議,P2P網絡又稱對等網絡,網絡中每個節點的地位都是相等的。比特幣設計的核心原則是去中心化,采用P2P網絡很好的體現了這個核心原則。雖然比特幣網絡中每個節點的地位相等,但不同節點的功能還是不一樣的。但是,任何節點都包含四個基本功能中的一個或者多個:錢包、礦工、完整區塊鏈、網絡路由節點。
所有節點都是網絡路由節點,可以對新創建的交易和區塊進行驗證,對通過驗證的交易和區塊進行轉發。
一個具備全部四個功能的節點被稱為全節點。全節點在本地存儲完整的區塊鏈數據(賬本),可以獨立的對交易和區塊數據進行驗證而不需要依賴于其他節點。
圖2-1 全節點
全節點同時具備挖礦功能,即參加算力競賽(解方程大賽)來贏得記賬權的能力。之所以稱競爭記賬權的行為為“挖礦”。這是為了類比于傳統實物貨幣(金、銀)的挖掘開采行為。每個在算力競賽中獲勝的節點能夠獲得一定數量的比特幣做獎勵,目前是12.5個比特幣,獎勵的數量大約每4年會減少一半。除全節點之外,也有單獨的挖礦節點。
全節點同時具備錢包功能。錢包是用來生成并保存地址和私鑰,同時創建交易的模塊。
相比于全節點,有些節點只存儲了部分區塊鏈數據,它通過“簡易支付驗證(SPV)”的方式來完成交易驗證,稱為SPV節點或輕量級節點。SPV節點一般具備網絡路由節點和錢包功能。為了讓智能手機這種資源有限的終端具備比特幣交易的能力,SPV節點現在越來越普遍。
2.4 比特幣區塊鏈
區塊鏈的英文名字 Block Chain 更容易理解。Block其實是一個常用的數據量大小的度量單位。比如在Linux/Unix系統里有一個數據塊(Data Block)的概念,數據塊是文件系統讀寫的最小單元,在Linux/Unix系統中是512個字節,一個文件所占大小就是數據塊的整數倍。又比如在Google分布式文件系統HDFS中,也有一個塊(Block)的概念,也是數據存儲的一個基本單元,不同之處在于HDFS為了提高大數據的效率和集群的吞吐量,將一個塊的大小設置成64MB。所以區塊鏈里的“區塊”也是指一個數據單元,而“鏈”其實就是將很多數據單元(區塊)一個個串聯起來,就像一個鏈表。但是鏈表是通過指針將數據串聯起來的,而區塊鏈是通過在每個區塊中存儲前一個區塊的唯一標識符來鏈接的。具體可以看區塊和區塊頭的數據結構。
表2-4 區塊結構
一個區塊主要分為兩部分:區塊頭和交易數據。區塊頭里記錄的是這個區塊的元數據,具體見區塊頭數據結構表2-5。交易數據部分記錄了從上一個區塊被挖出到當前區塊被挖出的約10分鐘時間內,全網發生的所有比特幣交易。比特幣系統中一個區塊大小并沒有嚴格限制,區塊頭的大小固定是80個字節,平均每個交易至少是250個字節,而平均每個區塊至少包含超過500個交易。交易的數據結構之前已經介紹過,下面來看一下區塊頭的數據結構。
表2-5 區塊頭結構
“父區塊哈希值”字段存儲了前一個區塊數據的Hash值,嚴格來說,并不是整個區塊數據的Hash值,而是區塊頭數據的Hash值。其實是運用SHA256算法對區塊頭數據做兩次Hash運算得出的。由于每個區塊頭數據具有唯一性,它的Hash值基本可以作為區塊的主標識符。所以將前一個區塊(父區塊)的標識符存在當前區塊的區塊頭里,也就相當于將這兩個區塊連接了起來。
“Merkle根”字段相當于是區塊內所有交易數據的一個數字指紋,要得到Merkle根先要創建一棵Merkle樹。假設現在有A,B,C,D四筆交易,創建的Merkle樹圖2-2。
圖2-2 包含A、B、C、D四筆交易的Merkle樹/div>
Merkle樹是自底向上創建的,是一種Hash二叉樹。首先將交易數據輸入SHA256算法得到每筆交易的Hash值Ha、Hb、Hc、Hd,這四個Hash值作為葉子節點,將葉子節點Hash值兩兩連接起來繼續輸入SHA256算法可以得到上一層節點的Hash值,計算示例如下。如果葉子節點個數為奇數,將最后一個節點復制一份。
Ha=SHA256(SHA256(交易A))
Hab=SHA256(SHA256(Ha+Hb))
如此循環進行,直到只剩一個節點,也就是Merkle樹根。考慮到SHA256算法的特性,Merkle根可以看成是所有交易數據的一個歸納,也可以看成是所有交易數據的數字指紋,因為即使任意交易數據被微小篡改,它生成的Hash值也會有很大變化,而葉子節點Hash值的變化,又會影響從該葉子節點連接到Merkle根的路徑上所有節點Hash值的變化,最終使Merkle根產生很大的變化。因此Merkle根可以唯一標識一批交易數據,也可以驗證一批交易數據是否被篡改過。由于SHA256算法輸出固定是32個字節,所以Merkle樹中所有節點包括Merkle樹根的值都固定是32個字節。Merkle樹在比特幣系統中的一個主要用處是可以高效的驗證一筆交易是否存在于區塊中。假設某區塊記錄了N筆交易,利用Merkle樹可以最多計算2*log2(N)次就可以判斷一筆交易是否存在于這個區塊中。
區塊頭數據結構中的“難度目標”字段是用來動態調節挖礦難度的,約兩周時間會調整一次,為了保證能夠在大概在10分鐘左右的時間挖出一個區塊(解出方程)。Nonce字段也是在挖礦(解方程大賽)時用到的,Nonce字段的值作為方程未知變量的一部分,不斷修改Nonce字段值以獲得滿足難度目標的解。
區塊鏈就是就是將包含交易信息的區塊從后往前依次連接起來的數據結構。它可以存儲在文件系統,也可以存儲在一個簡單數據庫。區塊鏈可以被視為一個垂直的棧,第一個區塊(創世區塊)作為棧的底部,后續創建的區塊依次向上疊加,這樣就可以用一些術語,“高度”來表示當前區塊離第一個區塊之間的距離,用“頂部”表示最新生成的區塊,用“深度”表示當前區塊距離頂部區塊的距離。
每個區塊的區塊頭數據經SHA256算法得到區塊Hash值,每個區塊的區塊Hash值并不存在于自身數據當中,而是在創建它的子區塊(棧內上一層區塊)時臨時計算得出并存儲在子區塊“父區塊哈希值”字段中。由于區塊Hash值可以在區塊鏈中唯一識別出一個區塊,因此通過“父區塊哈希值”就可以引用前一個區塊。這樣就通過“父區塊哈希值”字段將每個區塊依次鏈接起來形成了一條一直可以追溯到首區塊(創世區塊)的鏈條,見圖2-3。每個區塊都只有一個父區塊,但可能存在多個子區塊,這被稱為“區塊鏈分叉”。這種情況只在兩個礦工幾乎同時挖掘出新區塊時才可能出現,但也只是暫時存在,很快區塊鏈系統就會選出工作量最大的鏈條作為主鏈。
圖2-3 區塊通過引⽤⽗區塊的區塊頭哈希值的⽅式,以鏈條的形式進⾏相連
區塊哈希值雖然只是區塊頭數據的Hash值,但是區塊頭中包含的Merkle根字段是對所有交易數據的一個概括。上面介紹過,任何對交易數據的微篡改都會導致Merkle根發生很大變化,進而導致區塊哈希值也發生變化。由于子區塊會存儲父區塊的區塊哈希值,所以如果父區塊任意數據有變動,就會導致子區塊數據產生變動,而子區塊數據變動又會導致孫區塊值發生變動,等等以此類推。很明顯,對區塊鏈中任意區塊數據的篡改都會導致它后續所有區塊的數據發生變動,除非將后續所有區塊都重新生成,否則無法修改區塊鏈中的數據。而重新生成區塊面臨著巨大的工作量(解出每個區塊中的方程),當區塊的“深度”到達6時,由于巨大的工作量導致實際上想篡改這個區塊的數據已經變得不可能。這種區塊鏈歷史數據不可更改的特性是區塊鏈可信的一個關鍵原因。同時,這也是比特幣安全性的一個關鍵原因。
2.5 比特幣挖礦
將比特幣網絡中節點之間競爭記賬權的行為稱為“挖礦”。“挖礦”是比特幣系統中一個非常聰明的設計,它同時實現了三個目標:
(1)一種激勵機制,使得比特幣節點有動力去記錄交易數據。
(2)實現了新幣發行。
(3)通過工作量證明算法(解方程大賽)使得區塊鏈歷史數據實際上不可更改。
之前說節點之間競爭記賬權其實是在參加每10分鐘一場在全網舉行的解方程大賽。每場競賽的獲勝者將獲得本輪記賬權,有權創建一個新區塊并將前10分鐘全網發生的比特幣交易記錄到新區塊。解方程大賽的規則被一個稱為“工作量證明(Proof of Work)”的算法所定義。工作量證明算法定義每輪競賽中所有挖礦節點獨立求解一道包含Hash函數的方程,誰先求出滿足難度目標的解,誰就獲勝。
什么方程?Hash(區塊頭數據)=滿足難度目標的哈希值。
其實就是通過不斷修改區塊頭中的Nonce字段值(通常是遞增1),使得區塊頭哈希值滿足難度目標。難度目標就是區塊頭“難度目標”字段值。這個難度目標字段值通常類似于:哈希函數的輸出值十六進制表示以0開頭。從概率角度看,平均隨機嘗試16次可以得到一個滿足難度目標的解(十六進制數字取值0到F)。從數字角度看,要找一個輸出小于0x10000000......0的輸入。顯然,這個字段的值可以看成一個難度閾值。如果將難度閾值繼續降低,要找到一個滿足要求的解會變得越來越困難。2014年的時候,一個礦工平均要嘗試10^15次才能找到一個合適的Nonce使得區塊頭信息哈希值足夠小。這幾年隨著計算機運算能力的快速進步,挖礦設備越來越專業,難度閾值也設置的越來越小,才能保證全網10分鐘左右挖出一個新區塊。難度目標的調整是依據最新的2016個區塊(約兩周時間)與20160分鐘的比較得出的。
挖礦過程中,每次嘗試雖然是Nonce值遞增,但其實是在隨機嘗試。這是由哈希函數的三個性質決定的:
(1)不可逆。不可能根據哈希函數的輸出值反推出輸入值。
(2)抗碰撞。兩個不同的輸入值得到相同哈希輸出的可能性極低。
(3)高靈敏。當輸入有微小變化時哈希值輸出都會產生巨大的變化。
以上三個性質保證在搜索解時,沒有辦法用前面的前一步經驗來指導后續的搜索,只能一直處于隨機搜索的狀態。這保證了想參與挖礦或者說在工作量證明中獲勝的節點唯一的選擇就是不斷提高自己的算力,而沒有任何其它的“捷徑”,而這點正是區塊鏈安全性的基石。
挖礦是比特幣系統運行的核心環節,但是參與挖礦的節點需要投入大量的資源,包括挖礦設備和電力消耗。顯然如果沒有激勵機制,節點是沒有動力去挖礦的。比特幣的設計是,節點挖出一個新區塊以后,它記錄的第一筆交易并不是從全網接收到的交易,而是自己創建的一筆特殊交易——創幣交易或者稱coinbase交易。假設A節點挖出了一個新區塊,它創建的創幣交易內容類似于“向A節點的地址支付12.5個比特幣”。這12.5個全新的比特幣是之前不存在于區塊鏈賬本中的增量,也是作為對挖礦節點的獎勵。創幣交易的特殊在于不消耗UTXO,即沒有交易輸入只有交易輸出。所以給挖出新區塊的節點的獎勵包括兩部分:新幣獎勵和交易費用。目前礦工獲得的主要收益還是新幣獎勵為主,交易費用占比還比較小。
可以看出,挖礦設計的高明之處在于它不僅是一種激勵記賬的機制,同時解決了加密數字貨幣新幣發行的難題。從2009年1月每個區塊獎勵50個比特幣開始,每四年獎勵的比特幣數量減少一半(準確地說是210,000個區塊),直到2100萬比特幣全部發行完畢(大約2140年),目前每個新區塊獎勵12.5個比特幣。可以看出,比特幣是一種總量有限的緊縮貨幣。
2.6 去中心化共識機制
一種貨幣體系很重要的組成部分就是要有一份所有參與者一致信任的賬本。這在傳統貨幣體系中很容易實現,銀行作為貨幣體系的中心結構,保存這樣一份賬本并在新交易發生時維持對賬本的更新。但比特幣網絡是由分布在互聯網上的數以萬計的節點組成,并沒有中心機構來保存賬本,那么那么多節點之間如何形成一份一致認可的賬本?中本聰的一個主要創新就在于設計了一種去中心化共識機制,解決了古老的“拜占庭將軍難題”,即如何在不可信的環境中在異步節點之間達成共識。共識是網絡中數以萬計的獨立節點遵守了簡單的規則,獨立異步地交互形成的產物,主要包括以下四個方面:
(1)每個節點對接收到的交易的有效性進行獨立檢驗
(2)每個節點通過工作量證明算法競爭記賬權并對近期的交易獨立打包記錄到新區塊
(3)每個節點對接收到的新區塊進行獨立檢驗并組裝到區塊鏈
(4)每個節點獨立地選擇區塊鏈,在工作量證明機制下選擇累計工作量最大的區塊鏈
節點對交易數據的獨立檢驗所遵循的規則都是統一規定好的,可能的詐騙、錯誤等無效交易無法在網絡中繼續傳播。
工作量證明算法一方面實現了比特幣賬本不會被中心節點所控制,另一方面實現區塊鏈歷史數據實際不可更改。這兩點之前已經介紹過。
每個完全節點獨立保存并更新區塊鏈。所以當節點從網絡接收到一個新區塊時,它要檢驗并決定是否組裝到本地的區塊鏈上。檢驗的內容包括:
(1)區塊的數據結構語法上有效
(2)區塊頭的哈希值小于目標難度(確認包含足夠的工作量證明)
(3)第⼀個交易(有且只有第⼀個)是創幣交易
(4)使用檢查清單驗證區塊內的交易并確保它們的有效性。
。。。。。。
每個節點對每個新區塊的獨立檢驗確保了礦工無法欺詐。假設一個欺詐礦工創建一筆交易向自己支付一大筆比特幣。接收到這個區塊的節點基于相同的檢驗規則將很快能發現,從而選擇拒絕這個新區塊,這樣這個欺詐礦工不僅不會得到額外的錢,反而會浪費挖礦耗費的大量投入。
去中心化共識會遇到的一個情況就是區塊鏈“分叉”。當兩個節點幾乎同時挖出新區塊時。由于互相都沒有收到對方的新區塊,所以它們會將自己挖出的新區塊廣播出去。網絡上的其它節點就可能在幾乎同時接收到兩個新區塊,而且都可以有效的組裝到現有區塊鏈上。這個時候節點會把兩個區塊都保存下來,形成區塊鏈的兩條分叉。“分叉”只是暫時現象,解決辦法就是看這兩條分叉誰的工作量累計的更快,節點獨立地選擇累計工作量最大的鏈作為主鏈。當所有節點都獨立選擇最長的鏈作為區塊鏈主鏈時,很快全網節點就會重新達成共識。
去中心化共識唯一的隱患是可能遭受“共識攻擊”,典型的是“51%攻擊”。之前介紹過,工作量證明算法使得區塊鏈歷史數據實際上不可更改,因為區塊的生成需要巨大的工作量,背后需要巨大的算力支撐。但是一旦網絡中有超過一半的算力被攻擊者掌控,它就可能篡改交易數據。針對記錄目標交易的區塊,攻擊者重新構造一個新區塊,并故意與之形成分叉,在新區塊中,攻擊者可以重新生成一筆與目標交易數額相等但支付地址不同的交易,如果支付地址改為自己掌握的節點地址就可以把這筆錢轉給自己。在后續的累計工作量競賽中,攻擊者利用自己掌握的超過一半算力獲勝,進而使得故意分叉的鏈條成為全網的主鏈,最終實現交易欺詐。所以為了保證大額交易安全,建議在大宗商品交易用比特幣支付時,接收方要等到記錄此交易的區塊深度超過6時,再進行商品交付。
3 區塊鏈的應用與發展
區塊鏈是比特幣的底層技術之一,比特幣是區塊鏈的一個應用,也是目前為止區塊鏈最成功的應用。在比特幣里,區塊鏈被看成是一個分布式的公開賬本。區塊鏈可以存儲賬本,當然也可以存儲其它數據,比如合約、證書、法律文件等等,所以本質上區塊鏈是一個分布式數據庫,可以應用在很多領域。但是并不是說區塊鏈只是一個數據庫,相反區塊鏈數據存儲成flat file和Google的LevelDB數據庫,都不是區塊鏈的創新點。區塊鏈的核心創新點是去中心化共識機制。區塊鏈為了實現去中心化共識機制用到了很多的技術,包括P2P協議、非對稱加密技術、哈希加密技術、時間戳、Merkle樹、UTXO、工作量證明算法(PoW)等。所以,可以將區塊鏈技術看成是一個技術集合。
區塊鏈脫胎于比特幣,早期大家的關注點主要是以比特幣為代表的加密數字貨幣,這兩年大家越來越關注區塊鏈技術在各個領域的應用。很多人認為,區塊鏈的現狀就像早期的互聯網,區塊鏈技術給人類社會帶來的影響將不亞于互聯網。所以我們講區塊鏈不僅僅是指比特幣里的區塊鏈技術,還包括很多在它之上的創新和發展。
比特幣的區塊鏈技術在應用時存在的四個主要問題是:
(1)腳本語言太復雜,開發難度大。
(2)生態系統基礎比較差。既沒有完善的開發工具,也沒有文檔和教程。
(3)腳本語言并非圖靈完備。圖靈完備指一切可計算的問題都可以用該語言描述并計算。由于沒有圖靈完備,限制了比特幣腳本語言的用途,沒有辦法開發更高級的應用,例如沒有辦法實現去中心化的交易所。
(4)比特幣區塊鏈協議的擴展性不足。比特幣系統中只有一種符號——比特幣,沒有辦法用戶自定義其它的符號,比如公司的股票、債券等,這使比特幣失去了在其它領域應用的可能性。
(5)工作量證明算法耗費耗費大量的設備和電力資源。
2013年一位叫做 Vitalik Buterin 的俄羅斯少年發表了以太坊白皮書——《以太坊:下一代智能合約和去中心化應用平臺》。以太坊解決了比特幣區塊鏈擴展性不足,智能記錄交易不能記錄其它數據的問題。此外,以太坊通過其豐富的編程語言和完善的開發工具,解決了針對開發者不友好的問題,它讓任何人都能很輕松的在以太坊上建立新的協議和智能合約。目前,以太坊已經成為應用最廣泛的區塊鏈技術。
除以太坊之外,還有很多的區塊鏈項目出現。這里將目前有影響力的區塊鏈項目做一個分類,大致可以分為四類:數字資產;智能合約平臺;全球支付與結算;平臺類的應用服務。
3.1 數字資產
數字資產分為一般數字資產和主打匿名應用的匿名數字資產。
一般數字資產包括比特幣、萊特幣、新經幣(NEM),Decred,狗狗幣Dogecoin等。以比特幣為代表它們要解決的就是跨中心情況下的支付問題。跟比特幣比較起來,其它代幣原理類似,但針對自己的使用場景有一些改進。
萊特幣的交易確認時間是2.5分鐘,也就是每2.5分鐘有一個區塊被挖出,相較于比特幣的10分鐘,確認時間大大縮短,交易效率更高。
新經幣的共識機制是重要性證明(Proof of Importance),根據交易量、活躍度等維度而不僅僅是根據工作量來決定區塊鏈的記賬權。
Decred強調社區投入、公開治理以及可持續挖礦。它的特點是共識機制采用工作量證明PoW和權益證明PoS結合的方式。相比于工作量證明算法,權益證明算法不要求挖礦節點完成大量的計算工作,而是節點能夠對一定數量的錢展示所有權。權益證明由于不需要挖礦,避免了類似工作量證明算法消耗大量設備和電力的問題,所以受到廣泛關注。
狗狗幣是結合Doge文化發展起來的,有自己獨特的社區文化,具有交易便捷、轉賬速度快、確認時間短等特點,在小費、慈善等場景應用的活躍度很高。
匿名數字資產要解決的是如何在保護隱私的情況下完成支付的問題。我們知道比特幣匿名機制在于你無法知道比特幣地址背后所有者的真實身份,但是比特幣區塊鏈是公開賬本,每個地址的交易數據都是完全公開的。尤其是當用戶在比特幣交易網站注冊時,往往會填寫身份信息,這樣就可能暴露用戶身份信息。匿名數字資產比較知名的有達世幣Dash、門羅幣Monero以及采用零知識證明的零幣Zcash等。
達世幣的匿名性通過“混幣”的機制實現。原理是先將不同人的幣先混在一起,再將各自擁有的份額拿回去,這樣就無法知道轉賬人了。
門羅幣采用“環形簽名”的機制實現匿名。網絡首先將轉賬者的密鑰對和另外一個密鑰對集合混在一起得到一個新集合,然后用集合中的私鑰逐一簽名。其它節點用公鑰解密的時候就不確定到底哪個簽名是轉賬者的簽名。
零幣特色是采用了零知識證明機制實現匿名。原理類似于我們入住酒店時,不需要向前臺提供全部個人身份信息,而是公安系統提供一個接口,我們把信息提供給公安系統的接口,公安系統驗證身份之后返回結果就可以了。這樣就實現了對酒店前臺的匿名效果。
目前,全球數字資產超過1000種,充當的都是一般貨幣的功能,用于交易支付。目前也遇到應用場景有限、自身價值波動過大等問題。
3.2 智能合約平臺
智能合約就是在區塊鏈上運行的計算機程序。當滿足程序中預先設定的觸發條件時,智能合約自動執行。觸發條件可以是時間、事件或者交易等。由于區塊鏈歷史數據的不可更改特性,智能合約一旦在區塊鏈上注冊之后,就不能更改,無法違約。例如,房屋租賃合同協議的智能合約,注冊之后,當業主收到定金時會觸發執行,自動將房屋的鑰匙密鑰發送到房客的賬戶。到了租金交付時間,合約會自動從房客的賬戶向業主轉賬預先商定的租金。
再舉一個智能合約應用在航班延誤險的例子。我們經常坐飛機會買飛機延誤險,但是真的延誤之后,你還要打電話咨詢、在線下開證明、找保險公司,才能執行完你的飛機延誤險賠付。如果有智能合約,在區塊鏈上注冊好合約以后,連接到航班數據,就能確保航空公司在航班延誤之后自動給你賠付了。
比特幣區塊鏈可以看做區塊鏈1.0。但比特幣區塊鏈因為不是圖靈完備的。圖靈完備是指一切可計算的問題都能計算,這樣的虛擬機或者編程語言就是圖靈完備的。比特幣區塊鏈不能支持所有種類的計算,無法為賬戶取款額度提供精細的控制,缺少更豐富的狀態記錄,導致比特幣區塊鏈的擴展性比較差,不能應用在除比特幣以外的其它應用上,無法支持復雜的智能合約。
智能合約的區塊鏈平臺被稱為區塊鏈2.0,代表項目是以太坊。針對比特幣區塊鏈擴展性差、缺少圖靈完備等特點,以太坊建立了一個可編程、圖靈完備的區塊鏈平臺。在這個平臺上,你可以通過編寫簡單的程序方便的實現數字資產的生產,對鏈上運行的各類數字資產的精確控制,比如這個資產是待支付還是被鎖定還是有額度限制、和其他資產的自動兌換等等。同時,你也可以開發很多的智能合約,來實現非區塊鏈資產的功能,比如投票、對賭、條件合同等。因為要支持智能合約,以太坊上有兩類賬戶地址。一種是普通賬戶,和比特幣賬戶地址差不多,一種是合約賬戶,主要用于智能合約。簡單點說,以太坊就是區塊鏈加智能合約。
由于以太坊有著強大的可擴展性和完善的生態支持,在區塊鏈的應用開發上,很多開發者和企業都選擇了以太坊區塊鏈作為他們的底層技術平臺。
接觸過以太坊的人都知道,除了以太坊之外,還有一個以太坊經典,那么這兩者是什么關系呢?2016年7月份,由于以太坊網絡上,價值6000萬美元的以太幣(以太坊網絡上使用的代幣)被黑客盜取,為了追回被盜資金,以太坊創始人Vitalik組織并主導了一次硬分叉,通過在新的鏈上改寫了被黑客篡改的交易記錄實現資金追回。這次硬分叉將以太坊區塊鏈分成了兩條區塊鏈,由Vitalik主導、接受升級的區塊鏈稱為以太坊,它的代幣簡稱ETH(Ethereum,ETH),不接受這次升級的區塊鏈稱為以太坊經典,它的代幣簡稱ETC(Ethereum Classic,ETC)。
以太幣是以太坊網絡上使用的代幣,是以太坊內置的區塊鏈資產,類似比特幣。但是以太幣的主要目的并不是交易支付,而是用于支付智能合約運行的費用。智能合約的運行需要付費,相當于設定了一個門檻,這個門檻對于真的想做應用的用戶來說比較低,但對于大量運行垃圾智能合約項目和攻擊者來說就是比較大的負擔,因此可以有效防止惡意攻擊,確保區塊鏈的穩定安全。
3.3 全球支付與結算
目前用于全球支付與結算的區塊鏈項目較為成功的是Ripple和Tether。以Ripple為例來介紹一下。
瑞波Ripple是目前區塊鏈金融領域比較成功的項目之一,支持全球不同網絡、不同幣種之間即時、低成本的國際支付。銀行等機構用戶都可以利用瑞波在不同網絡之間發送實時的國際付款。與其他區塊鏈項目都由開發者組織進行維護相比,瑞波的運行維護全都由一家叫Ripple Labs的公司負責。瑞波公司是一家組織嚴格,完全按照法律法規注冊的公司,并且獲得了很多大公司、投資機構、銀行的投資,包括Google、埃森哲、渣打銀行等。這種特點也與瑞波公司的目標客戶有關。瑞波區塊鏈不向個人開發者開放,主要面向機構客戶特別是銀行、支付機構等,支持機構客戶實現快速、低成本的跨境匯款。瑞波公司大量與銀行等支付機構合作,推動瑞波的應用落地。例如2017年7月,日本和泰國之間首個基于瑞波區塊鏈的即時匯款服務正式開始。這項區塊鏈服務能實現個人資金從日元到泰銖的轉移,經過2至5秒就能存到收款方的賬戶上,而現在兩國之間常規的匯款都需要花上兩個工作日的時間。
瑞波區塊鏈實現跨境支付主要通過內置的代幣瑞波幣作為中介來實現,瑞波幣可以兌換多種法幣。瑞波幣的發行并不是通過挖礦來實現的,而是通過業務開發交易來分發瑞波幣,獎勵那些更小差價的流動性提供商,另外向那些有興趣投資瑞波幣的機構銷售瑞波幣。如果沒有挖礦,瑞波幣是如何實現交易確認和記賬的呢?答案是協議共識機制。不同于工作量證明算法需要網絡上巨大的算力維持,瑞波區塊鏈將網絡上的節點分為普通節點和驗證節點,協議共識機制規定一筆交易只需要驗證節點的投票就能完成驗證和確認。因此瑞波交易確認的時間非常短。
瑞波幣被人詬病的一點是它的中心化運作,即由瑞波公司完全負責。而且,瑞波公司目前持有約三分之二的瑞波幣,完全有能力操縱瑞波幣的價格,這也是瑞波的一個隱患。當然,瑞波公司也一再發表聲明,等瑞波發展成熟之后,會逐漸退出中心化團隊的影響,比如去掉驗證節點,使瑞波真正成為一個去中心化的區塊鏈網絡。
3.4 平臺類應用
平臺類應用大多是基于以太坊設計并運行的區塊鏈項目,可以看出以太坊的可擴展性,即通過編程可以在它上面實現很多應用。這里介紹三個平臺類應用:市場預測平臺Augur,計算資源交易平臺Golem,數字代幣化平臺DigixDAO。
市場預測平臺Augur是以太坊上的第一個應用。用戶基于數據對未來事件的結果進行預測,預測正確的用戶會獲得獎勵,預測錯誤的用戶會失去“投注”。用戶參與預測之前,先要“下注”,即進行資金充值,Augur會將錢存進智能合約中,等到結果出來之后,合約自動執行,可以有效防止用戶賴賬和中心節點作弊風險。任何用戶都可以創建一個市場問題或者選擇參與某個市場問題。事件結果來自于所有持有代幣的人共同決定。注意Augur的代幣叫REP,并不是以太幣,用戶可以用以太幣購買REP。
計算交易平臺Golem允許用戶通過網絡交易計算資源,可以把它看做是目前共享經濟的一個案例。兩類用戶:一類為算力資源賣家,另一類為買家。買家創建任務并將任務上傳到網絡。Golem的代幣是GNT,用于買方購買算力時支付酬勞。
數字代幣化平臺DigixDAO是一個基于以太坊區塊鏈構建的資產代幣化平臺。DigixDAO的一大貢獻是在區塊鏈虛擬資產和黃金之類的實物資產之間建立了一種對應關系,為實物資產的代幣化和文檔化提供了思路,為之后其它實體資產上鏈提供了一個范例。DigixDAO中的名詞“上鏈”,也就是實物資產上到區塊鏈上,變成區塊鏈資產。上鏈顯然是區塊鏈項目能夠與其它領域結合、落地到真實場景的必經步驟。那DigixDAO是如何將實體資產上鏈的呢?主要是設計了一個證明資產存在和所有權的制度,并且證明記錄會通過星際文件系統(目標取代HTTP協議的P2P分布式文件系統)和以太坊永久性地發布和保護。DigixDAO獨創了PoA資產證明(Proof of Assets, PoA)。
可以通過DigixDAO的鑄幣來認識PoA。比如現在要對黃金上鏈,一克黃金的價值,由黃金供應商、托管商、審計商之類的“監管鏈”參與者通過連續數字簽名進行認證,將這一克黃金的信息注冊成資產證明(PoA)資產卡,永久性地上傳到去中心化數據庫中。PoA卡被保存在以太坊錢包里,當PoA資產卡被發送到鑄幣智能合約時,DigixDAO的代幣DGX就生成了。每個DGX代幣代表1克被倫敦金銀市場協會認可的金條黃金。這就是DigixDAO的鑄幣過程。
4 總結
區塊鏈技術的核心是它能解決去中心化條件下的信任問題。并不是所有的行業都適合應用區塊鏈,區塊鏈也不能包治百病。非常適合區塊鏈技術應用的領域有以下特征:(1)目前沒有一個信任中心;(2)建立一個信任中心的成本非常高;(3)需要有顯示映射機制保障實施。
由于很多消耗了大量時間和資源成本的社會機制,都是為了在參與方之間建立信任關系,而區塊鏈可以讓人們在相互無信任的情況下,無地域限制地進行大規模協作。顯然,區塊鏈給社會帶來了一種新的提升效率和降低成本的技術手段。目前,雖然大家對以比特幣為代表的加密數字貨幣的未來看法不一,但對區塊鏈的未來大家卻一致看好,認為區塊鏈是一項革命性的技術。
目前區塊鏈在各行業的應用已經逐步展開,重點應用領域如圖4-1所示。在具體的行業應用中,區塊鏈能產生明顯效益的地方在于優化業務流程、降低運營成本、提升協作效率。
圖4-1 區塊鏈當前重點應用領域
該文章在 2018/3/30 9:02:12 編輯過