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