丁怡心,廖勇毅
(廣州民航職業(yè)技術(shù)學(xué)院航空港管理學(xué)院,廣州 510800)
2021年2月,比特幣價(jià)格再創(chuàng)新高,突破5萬(wàn)美元每枚,比特幣再次成為世界焦點(diǎn)。比特幣的價(jià)值不在本文的討論范圍,但是它背后的區(qū)塊鏈技術(shù)具有非凡的革新意義,值得深入研究。
區(qū)塊鏈?zhǔn)且环N數(shù)字化數(shù)據(jù)的存儲(chǔ)方法,數(shù)據(jù)是以區(qū)塊的形式出現(xiàn),這些區(qū)塊鏈接在一起,為其內(nèi)部數(shù)據(jù)賦予了不可變性。當(dāng)一個(gè)數(shù)據(jù)塊被鏈接到了這條鏈上,其內(nèi)部數(shù)據(jù)就再也無(wú)法更改了,里面的數(shù)據(jù)對(duì)任何人都是公開(kāi)可見(jiàn)的。利用這項(xiàng)技術(shù),可以用來(lái)記錄我們能想到的幾乎所有數(shù)據(jù)(例如,財(cái)產(chǎn)、合同、病歷等),同時(shí)不存在被篡改的風(fēng)險(xiǎn)。比特幣作為區(qū)塊鏈技術(shù)的杰出代表作,對(duì)我們研究區(qū)塊鏈技術(shù)有重要意義。
2008年,中本聰[1]發(fā)表比特幣白皮書(shū)《比特幣:一種點(diǎn)對(duì)點(diǎn)式的電子現(xiàn)金系統(tǒng)》,2009年,他發(fā)布了首個(gè)比特幣軟件,從此比特幣貨幣系統(tǒng)正式啟動(dòng)。比特幣最重要的三個(gè)特征是:去中心化、不可篡改性及匿名性,這些特征保證比特幣系統(tǒng)長(zhǎng)期穩(wěn)定運(yùn)行。同時(shí)比特幣系統(tǒng)規(guī)定以下內(nèi)容:
(1)比特幣的總量是2100萬(wàn)枚,任何人都不能修改,這是比特幣稀缺性的一種保障。
(2)比特幣伴隨區(qū)塊產(chǎn)生而產(chǎn)生。2100萬(wàn)枚比特幣不是一次性產(chǎn)生的,而是伴隨賬本數(shù)據(jù)塊的產(chǎn)生而產(chǎn)生,每10分鐘會(huì)產(chǎn)生一個(gè)賬本數(shù)據(jù)塊,該賬本數(shù)據(jù)塊被稱(chēng)作區(qū)塊,整個(gè)產(chǎn)生過(guò)程將用131年。
(3)每過(guò)21萬(wàn)個(gè)區(qū)塊,比特幣獎(jiǎng)勵(lì)減少一半。按照每10分鐘產(chǎn)生1個(gè)區(qū)塊,一天24小時(shí)則產(chǎn)生 24×6=144個(gè)區(qū)塊,210000÷(144×365)≈4,也就是說(shuō)每過(guò)4年比特幣的獎(jiǎng)勵(lì)會(huì)減半。所以從2009年開(kāi)始每個(gè)區(qū)塊獎(jiǎng)勵(lì)50枚比特幣;到2013年之后,每個(gè)區(qū)塊獎(jiǎng)勵(lì)25枚比特幣;2017年以后每區(qū)塊獎(jiǎng)勵(lì)12.5枚比特幣。
總結(jié)以上內(nèi)容,有以下結(jié)論:①比特幣總量2100萬(wàn)枚。②目前只剩下約300萬(wàn)枚可以挖采。③每過(guò)4年每枚比特幣的挖采成本翻倍。因此在比特幣得到認(rèn)可的前提下,這些正是它價(jià)格不斷升高的重要邏輯。
比特幣背后的區(qū)塊鏈技術(shù)是本文研究的重點(diǎn),本節(jié)從區(qū)塊鏈結(jié)構(gòu)、不可篡改性、工作量證明、防止攻擊及比特幣交易5個(gè)內(nèi)容分析比特幣區(qū)塊鏈工作原理及相關(guān)核心技術(shù)。
區(qū)塊鏈?zhǔn)且环N數(shù)字化數(shù)據(jù)的存儲(chǔ)方法,比特幣區(qū)塊鏈上存儲(chǔ)著比特幣的交易數(shù)據(jù)。它是一個(gè)龐大的交易記錄庫(kù),每一筆比特幣交易記錄都可追溯,這些交易記錄庫(kù)保存在比特幣系統(tǒng)中的每個(gè)節(jié)點(diǎn)。目前比特幣區(qū)塊鏈中約有60萬(wàn)個(gè)區(qū)塊,每個(gè)區(qū)塊不超過(guò)1 MB。區(qū)塊中的核心數(shù)據(jù)是交易記錄,區(qū)塊會(huì)按照時(shí)間順序從第一筆交易開(kāi)始記錄,直到數(shù)據(jù)量達(dá)到1 MB為止,之后的交易會(huì)記錄下一個(gè)區(qū)塊中,直到數(shù)據(jù)量達(dá)到1 MB為止,以此類(lèi)推。這些區(qū)塊一個(gè)接著一個(gè)鏈接在一起,如圖1所示。
圖1 區(qū)塊鏈結(jié)構(gòu)
比特幣系統(tǒng)中所有節(jié)點(diǎn)都保存著同樣的區(qū)塊鏈數(shù)據(jù),每個(gè)節(jié)點(diǎn)都是平等的,沒(méi)有類(lèi)似銀行的中心服務(wù)器,即去中心化。區(qū)塊中的數(shù)據(jù)除了交易記錄,還有區(qū)塊頭信息,用于維護(hù)整個(gè)區(qū)塊鏈,關(guān)鍵字段說(shuō)明如表1所示。
表1 區(qū)塊頭字段說(shuō)明
區(qū)塊鏈體系中所有節(jié)點(diǎn)都保存著完整的區(qū)塊鏈數(shù)據(jù),區(qū)塊鏈中的區(qū)塊一旦形成則不可被篡改,比特幣系統(tǒng)使用SHA-256哈希簽名技術(shù)實(shí)現(xiàn)不可篡改性。
每個(gè)區(qū)塊根據(jù)內(nèi)部交易數(shù)據(jù)串生成一個(gè)簽名以保證區(qū)塊數(shù)據(jù)不可篡改,同時(shí)上一個(gè)區(qū)塊的簽名也包含在當(dāng)前區(qū)塊的數(shù)據(jù)串內(nèi),當(dāng)前區(qū)塊的簽名也包含在下一個(gè)區(qū)塊的數(shù)據(jù)串中,如圖2所示。
圖2 區(qū)塊鏈數(shù)據(jù)串簽名
通過(guò)這種鏈?zhǔn)降暮灻绞?,?dāng)某個(gè)區(qū)塊數(shù)據(jù)的任何改動(dòng)都會(huì)導(dǎo)致后面所有區(qū)塊的簽名發(fā)生變化,為了維護(hù)比特幣區(qū)塊鏈的不可篡改性,其他用戶(hù)會(huì)拒絕同步更改后的交易信息,依舊維持原有的交易記錄。
一旦某交易已經(jīng)被足夠多的區(qū)塊覆蓋,這之前的支付交易就可以被丟棄以節(jié)省磁盤(pán)空間。為便于此而又不破壞區(qū)塊的哈希值,交易將被哈希進(jìn)默克爾樹(shù)[9-11],只有默克爾根被納入到區(qū)塊的哈希值中。
默克爾樹(shù),就是對(duì)區(qū)塊內(nèi)的每筆交易進(jìn)行多次雙重哈希算法及兩兩一組拼接,形成默克爾根以保證區(qū)塊鏈每筆交易的不可篡改性。例如某區(qū)塊內(nèi)有N筆交易,則默克爾根形成過(guò)程如下:
(1)對(duì)所有N筆交易分別進(jìn)行哈希運(yùn)算得到N個(gè)哈希值。
(2)對(duì)N個(gè)哈希值兩兩拼接組成N/2個(gè)結(jié)果。
(3)對(duì)N/2個(gè)結(jié)果分別進(jìn)行哈希運(yùn)算,并對(duì)運(yùn)算結(jié)果再兩兩拼接組成N/4個(gè)結(jié)果。
(4)重復(fù)該過(guò)程直到剩下一個(gè)哈希值,這就是默克爾根。
圖3 merkle根形成過(guò)程
通過(guò)這種方式,把區(qū)塊內(nèi)的交易信息都?jí)嚎s成一個(gè)默克爾根,區(qū)塊只需要保存區(qū)塊頭信息,區(qū)塊頭大小只有80 bytes,按照每10分鐘產(chǎn)生一個(gè)區(qū)塊,一年產(chǎn)生的數(shù)據(jù)量是:365×24×6×80 bytes=4.2 MB,極大地節(jié)省了節(jié)點(diǎn)的磁盤(pán)空間。
區(qū)塊鏈中的區(qū)塊一旦形成,區(qū)塊中的數(shù)據(jù)是不能被更改或增加的,新的交易數(shù)據(jù)只能打包存放在新增的區(qū)塊中。為了鼓勵(lì)人們打包新的區(qū)塊,比特幣系統(tǒng)會(huì)給打包者一定數(shù)量的比特幣作為獎(jiǎng)勵(lì),這個(gè)競(jìng)爭(zhēng)記賬的過(guò)程就是所謂的“挖礦”,競(jìng)爭(zhēng)者即所謂的“礦工”。
比特幣系統(tǒng)用工作量證明(Proof of Work,簡(jiǎn)稱(chēng)POW)機(jī)制來(lái)實(shí)現(xiàn)競(jìng)爭(zhēng)結(jié)果的判定。工作量證明的思想是:根據(jù)哈希算法的不可逆性,從特定哈希值推算出輸入值是不可能的,唯一的辦法就是窮舉,通過(guò)不斷嘗試去尋找輸入值。
比特幣系統(tǒng)要求區(qū)塊的哈希值開(kāi)頭必須由若干個(gè)0組成,比如第663721區(qū)塊的哈希值要求以19個(gè)0開(kāi)頭,輸入數(shù)據(jù)則由交易數(shù)據(jù)、父區(qū)塊哈希值以及一個(gè)隨機(jī)數(shù)組成,交易數(shù)據(jù)和父區(qū)塊哈希值是固定的,只能通過(guò)不斷嘗試以尋找滿(mǎn)足要求的隨機(jī)數(shù)。
比特幣區(qū)塊中用Nonce字段保存找到的隨機(jī)數(shù)。競(jìng)爭(zhēng)者找到滿(mǎn)足要求隨機(jī)數(shù)后即可打包新區(qū)塊,并廣播到所有比特幣節(jié)點(diǎn),其它節(jié)點(diǎn)驗(yàn)證通過(guò)后將該區(qū)塊接入原來(lái)的區(qū)塊鏈,并繼續(xù)新一輪的競(jìng)爭(zhēng)。
圖4 工作量證明
在極少數(shù)情況出會(huì)出現(xiàn)兩個(gè)或以上的競(jìng)爭(zhēng)者同時(shí)找到滿(mǎn)足要求的隨機(jī)數(shù),例如A、B兩位競(jìng)爭(zhēng)者同時(shí)找到滿(mǎn)足要求的隨機(jī)數(shù),他們都會(huì)把自己打包的新區(qū)塊廣播到其他節(jié)點(diǎn)中,比特幣網(wǎng)絡(luò)節(jié)點(diǎn)中有部分人先收到A的區(qū)塊,另一部分人先收到B的區(qū)塊,于是這些節(jié)點(diǎn)會(huì)分別維護(hù)著不同的鏈,根據(jù)中本聰共識(shí)機(jī)制(最長(zhǎng)鏈為合法鏈),這兩條鏈都是最長(zhǎng)鏈,所以都是合法鏈,這時(shí)區(qū)塊鏈就出現(xiàn)了分叉。礦工們分別在自己維護(hù)的鏈條上繼續(xù)挖礦,如果新的一輪競(jìng)爭(zhēng)中兩個(gè)鏈條上的新區(qū)塊又同時(shí)產(chǎn)生(基本不可能發(fā)生),則分叉繼續(xù)合法存在,否則某一分叉先產(chǎn)生新區(qū)塊,由于這時(shí)該鏈?zhǔn)俏ㄒ蛔铋L(zhǎng)鏈條成為合法鏈,于是所有節(jié)點(diǎn)又聚集過(guò)來(lái)共同維護(hù)該鏈條,另外一條鏈因無(wú)人維護(hù)則形成孤塊。
圖5 區(qū)塊鏈分叉
比特幣系統(tǒng)為使平均出塊時(shí)間基本維持在10分鐘,會(huì)定期根據(jù)過(guò)往的出塊時(shí)間調(diào)整挖礦難度,即調(diào)整區(qū)塊哈希值開(kāi)頭0的個(gè)數(shù)。
比特幣系統(tǒng)中如果出現(xiàn)惡意節(jié)點(diǎn)試圖修改某區(qū)塊的交易記錄,對(duì)于該區(qū)塊,惡意節(jié)點(diǎn)需要做的事情是:修改交易記錄,并重新找到工作量證明隨機(jī)數(shù)以生成該區(qū)塊哈希值。這意味著在原來(lái)鏈條中出現(xiàn)了分叉,根據(jù)中本聰共識(shí)機(jī)制(最長(zhǎng)鏈為合法鏈),所有其他節(jié)點(diǎn)都會(huì)維護(hù)原來(lái)最長(zhǎng)的鏈條,該分叉只有惡意節(jié)點(diǎn)維護(hù)。于是惡意節(jié)點(diǎn)必須繼續(xù)修改后面的區(qū)塊直到它鏈條比原來(lái)的鏈條更長(zhǎng),這些修改才能得到認(rèn)可。也就是說(shuō)惡意節(jié)點(diǎn)的算力必須大于全網(wǎng)其它節(jié)點(diǎn)CPU算力的總和,它的修改才有可能成功,這在當(dāng)前龐大的比特幣網(wǎng)絡(luò)是不可能實(shí)現(xiàn)的,并且隨著比特網(wǎng)絡(luò)的越來(lái)越壯大變得更不可能。
圖6 惡意攻擊
另外“挖礦”激勵(lì)機(jī)制有助于鼓勵(lì)節(jié)點(diǎn)保持誠(chéng)實(shí),當(dāng)一個(gè)惡意節(jié)點(diǎn)有能力聚集巨大CPU算力時(shí),他可能會(huì)發(fā)現(xiàn)遵守規(guī)則參與“挖礦”比破壞規(guī)則篡改區(qū)塊帶來(lái)更大的效益。
比特幣系統(tǒng)中沒(méi)有余額的的概念,它使用的是UTXO模型(Unspent Transaction Outputs,未使用過(guò)的交易輸出),比特幣錢(qián)包軟件遍歷與當(dāng)前錢(qián)包地址相關(guān)的交易記錄,用輸入該地址的金額減去從該地址輸出的金額得到的結(jié)果即UTXO,這就是錢(qián)包余額。
一筆交易若要生效必須滿(mǎn)足兩個(gè)條件:①這筆交易必須包含一個(gè)有效簽名,來(lái)自它所花費(fèi)的UTXO的擁有者。②被花費(fèi)的UTXO的總金額必須大于等于該交易產(chǎn)生的UTXO總金額。
圖7展示了與Roger相關(guān)的交易,在這過(guò)程中Roger從Jack賬戶(hù)獲得6枚比特幣,而Roger在一筆交易中要轉(zhuǎn)賬5枚給Tim,然后自己剩下1枚比特幣。具體過(guò)程如下:
圖7 比特幣交易記錄
(1)在交易001中,Roger從Jack賬戶(hù)中獲得6枚比特幣,這個(gè)交易中包含一個(gè)輸入和一個(gè)輸出,輸出包含當(dāng)前輸出的索引、金額、鎖定腳本和接受者的公鑰。鎖定腳本的作用是,鎖定只有Roger才能使用這筆輸出。要使用這個(gè)UTXO,就必須要證明自己是Roger。
(2)Roger要發(fā)送5枚比特幣給Tim。提交這筆交易之前Roger首先要確認(rèn)兩件事:①自己有足夠的“余額”去支付這筆交易。②證明自己是這些余額的擁有者。要計(jì)算用戶(hù)的余額,就要遍歷Roger的所有交易記錄,這里,我們Roger就只有001一筆交易,即Roger當(dāng)前的余額是6枚比特幣,大于所要支出的5個(gè)比特幣,所以交易可以進(jìn)行。要證明自己是這6枚比特幣的擁有者,需要解鎖腳本(包含了Roger用私鑰對(duì)上一筆交易輸出的簽名),使用Roger的公鑰對(duì)Roger的私鑰簽名進(jìn)行驗(yàn)證即可證明Roger為擁有者。
(3)創(chuàng)建交易002,該交易的輸入引用了交易001中索引0的輸出,同時(shí)創(chuàng)建2個(gè)輸出,一個(gè)是給Tim的5個(gè)比特幣,包含一個(gè)鎖定腳本,該鎖定腳本限定只有Tim才能使用;另一個(gè)是找零產(chǎn)生的輸出,發(fā)送給Roger的1個(gè)比特幣,包含一個(gè)鎖定腳本,限定只有Roger本人才能使用。
(4)交易創(chuàng)建完成后,向比特幣網(wǎng)絡(luò)廣播出去,比特幣網(wǎng)絡(luò)中的其他節(jié)點(diǎn)會(huì)驗(yàn)證該交易的有效性,當(dāng)比特幣網(wǎng)絡(luò)確認(rèn)這筆交易,且在下一次挖礦競(jìng)賽中將該交易打包進(jìn)區(qū)塊中并得到全網(wǎng)共識(shí)確認(rèn)后,這筆交易就確認(rèn)有效了。
通過(guò)這種設(shè)計(jì),比特幣系統(tǒng)中每一筆交易的來(lái)源都可以驗(yàn)證真實(shí)性和合法性,攻擊者無(wú)法偽造交易,也不能冒用其他人的賬號(hào)進(jìn)行交易。同時(shí),由于每一枚比特幣都可被追溯,所以避免了雙重支付的發(fā)生。此外,交易中的賬戶(hù)地址是由用戶(hù)公鑰變換而來(lái),與身份信息無(wú)關(guān),因此不能直接根據(jù)交易記錄推測(cè)交易者的身份信息,從而實(shí)現(xiàn)匿名性。
比特幣誕生短短12年,價(jià)格屢創(chuàng)新高令世人矚目,其背后的區(qū)塊鏈技術(shù)受到廣泛關(guān)注。拋開(kāi)市場(chǎng)價(jià)值,區(qū)塊鏈技術(shù)去中心化、不可篡改性及匿名性的特點(diǎn)為現(xiàn)代互連網(wǎng)技術(shù)提供了重要的參考意義。本文介紹了比特幣,并從區(qū)塊鏈結(jié)構(gòu)、不可篡改性、工作量證明、防止攻擊及比特幣交易5個(gè)內(nèi)容分析比特幣區(qū)塊鏈工作原理及相關(guān)核心技術(shù),讓大家對(duì)比特幣及區(qū)塊鏈有更直觀(guān)的了解及認(rèn)識(shí)。