提起貨幣,你可能覺(jué)得再熟悉不過(guò)了。你的錢包里放著現(xiàn)金,銀行里有儲(chǔ)蓄,還有各種理財(cái)、投資。生活中的方方面面,似乎都離不開貨幣。
從人類發(fā)明貨幣那天至今,它的樣子發(fā)生過(guò)許多重大的變化,從原始粗糙的貝殼、金屬塊,到工藝精美的銅板、金幣,再到印刷考究、凝結(jié)著無(wú)數(shù)現(xiàn)代科技的防偽紙幣,這些都是看得見(jiàn)摸得著的實(shí)體貨幣。
而到了科技日新月異的今天,貨幣早已擺脫了實(shí)體形態(tài),成為了一串虛擬的數(shù)字,也就是數(shù)字化的貨幣。比如早晨買早點(diǎn),你用微信掃碼,付給賣早點(diǎn)的大媽 12 塊 8;再比如上個(gè)月你借給小張兩萬(wàn)二買數(shù)碼產(chǎn)品,中午支付寶提示你收到了小張的還款,還附言說(shuō)周末要請(qǐng)你吃飯;下午銀行發(fā)來(lái)短信,說(shuō)你本月的房貸已經(jīng)扣除,這個(gè)月又要吃土了呢。
數(shù)字化的貨幣凝結(jié)了現(xiàn)代科技的諸多成果,然而它仍然只是傳統(tǒng)貨幣的一個(gè)替代品。自從人類政府取得了貨幣的鑄造權(quán),大部分貨幣本身的價(jià)值和它代表的價(jià)值就不再是一個(gè)概念了。例如,一張100美元紙幣的生產(chǎn)成本大約是7.8美分,而數(shù)字化貨幣的成本則可能更低。
在傳統(tǒng)的貨幣體系里,實(shí)體貨幣的價(jià)值由中央銀行的信譽(yù)來(lái)保證。例如在金本位貨幣體系里,你相信政府的承諾,用你的紙幣可以兌換等值的黃金。而數(shù)字化貨幣的價(jià)值則和實(shí)體法定貨幣掛鉤,你相信你在銀行、支付寶、微信里的賬戶余額,可以在相應(yīng)的服務(wù)機(jī)構(gòu)里兌換成實(shí)體的法定貨幣。也就是說(shuō),傳統(tǒng)貨幣,包括數(shù)字化的傳統(tǒng)貨幣,其價(jià)值基于人們對(duì)于中央銀行這種權(quán)威中心機(jī)構(gòu)的信任。
然而信任,并不是一件很容易達(dá)成的事情呢。如果沒(méi)有一個(gè)可信的中心機(jī)構(gòu),除了靠人品,還有什么辦法來(lái)達(dá)成信任呢?
答案就是:多年以來(lái),一直沒(méi)有太好的答案……
直到 2008 年,一位化名中本聰?shù)纳衩厝耸堪l(fā)表了一篇論文:《比特幣:一種點(diǎn)對(duì)點(diǎn)式的電子現(xiàn)金系統(tǒng)》,提出了一個(gè)基于區(qū)塊鏈技術(shù)的“去中心化”數(shù)字貨幣系統(tǒng),它就是今天大名鼎鼎、人氣爆棚的比特幣。
比特幣不是世界上第一個(gè)不依賴權(quán)威中心機(jī)構(gòu)的“去中心化”的貨幣系統(tǒng),但它絕對(duì)是迄今為止世界上最成功的一個(gè)。
講到這里,可能很多朋友腦子里已經(jīng)冒出了一大堆關(guān)于比特幣的問(wèn)題。比如:
沒(méi)有一個(gè)權(quán)威中心機(jī)構(gòu),你擁有的比特幣保存在哪里?
如何確保你的錢不會(huì)被別人拿去花?
如何保證你的賬戶余額不會(huì)被黑客篡改呢?
比特幣怎么發(fā)行,如何避免比特幣數(shù)量暴增帶來(lái)的通貨膨脹呢?
帶著這些問(wèn)題,可樂(lè)帶你來(lái)探索比特幣系統(tǒng)巧妙的設(shè)計(jì)和背后的技術(shù)。
事實(shí)上,在比特幣系統(tǒng)中,并不直接記錄每個(gè)賬戶的余額,而只是記錄交易流水。
例如,你的賬戶流水顯示,從古至今,你收到過(guò)一筆來(lái)自小A的10比特幣,以及一筆來(lái)自小C的20比特幣,并且這兩筆交易的收入都沒(méi)有被你花掉。那么你就擁有來(lái)自小 A 的 10 比特幣和來(lái)自小C的20比特幣這兩條記錄。只有把這兩筆交易收入加起來(lái),你才能知道自己總共擁有 30 個(gè)比特幣。
而假如你打算使用25個(gè)比特幣買套房,并且付出 0.001 比特幣的手續(xù)費(fèi),那么你需要?jiǎng)?chuàng)建這樣一筆交易:它的輸入為來(lái)自小A的 10比特幣和來(lái)自小C的20比特幣,輸出為付給房主小D的25比特幣,以及付給你自己的 4.999 比特幣找零。
現(xiàn)在你已經(jīng)在自己的賬本上記錄下“支付25比特幣給小D”,那小D認(rèn)不認(rèn)可這筆交易呢?當(dāng)然不認(rèn)可。要知道,所有比特幣的參與者都可以保存一份賬本副本,如果你無(wú)法說(shuō)服所有的人都幫你記這筆帳,那么這筆賬不會(huì)受到大家的認(rèn)可。
在比特幣系統(tǒng)中,所有參與系統(tǒng)的人通過(guò)網(wǎng)絡(luò)互相連接,以平等的身份組成了一個(gè)錯(cuò)綜復(fù)雜的網(wǎng)絡(luò),稱作“點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)”。你要做的,就是把你的交易進(jìn)行簽名,并且廣播到這個(gè)網(wǎng)絡(luò)里去。
那么,問(wèn)題來(lái)了:該如何給交易數(shù)據(jù)簽名,來(lái)證明這筆交易是你本人發(fā)出的呢?
在日常生活中,一個(gè)獨(dú)一無(wú)二的簽名可以證明你對(duì)一筆交易做了授權(quán),除了少數(shù)天才,很少有人能夠精確仿制出一個(gè)簽名;而在數(shù)字的世界,復(fù)制是一件極其容易的事情,如何保證你的簽名不被別人復(fù)制,從而被用于偽造你的授權(quán)呢?
這里給大家介紹一下,計(jì)算機(jī)世界里的數(shù)字簽名是如何進(jìn)行的。首先,數(shù)字簽名技術(shù)基于一種被稱為“非對(duì)稱加密”的技術(shù)。在使用這種技術(shù)時(shí),你擁有兩個(gè)鑰匙,一個(gè)稱作公鑰,一個(gè)稱作私鑰。在計(jì)算機(jī)的世界里,公鑰和私鑰其實(shí)是兩個(gè)數(shù)字,這兩個(gè)數(shù)字是配對(duì)使用的。公鑰,顧名思義,是可以公開給別人的,而私鑰則是需要使用方嚴(yán)格保密的。
使用私鑰,可以對(duì)一塊特定的數(shù)據(jù)進(jìn)行一個(gè)計(jì)算,得出一個(gè)獨(dú)一無(wú)二的數(shù)字簽名。數(shù)據(jù)不同,輸出的數(shù)字簽名也不同。使用公鑰,可以對(duì)消息進(jìn)行驗(yàn)證。如果公鑰和私鑰是配對(duì)的,那么驗(yàn)證通過(guò),否則驗(yàn)證不會(huì)通過(guò);通過(guò)私鑰可以很容易計(jì)算出配對(duì)的公鑰,而只知道公鑰卻極難推導(dǎo)出私鑰。正是由于公鑰私鑰這樣的性質(zhì),才使得我們可以用這種機(jī)制來(lái)進(jìn)行數(shù)字簽名。
私鑰是你務(wù)必要妥善保存的,因?yàn)槿魏稳苏莆樟四愕乃借€,就意味著掌握了你的錢包,以及里面的資產(chǎn)。而你的公鑰,事實(shí)上就是你的比特幣收款地址,其他人需要知道你的地址,才能轉(zhuǎn)賬給你。由于公鑰是一個(gè)又長(zhǎng)又難記的數(shù)字,因此比特幣系統(tǒng)使用了一系列的編碼轉(zhuǎn)換,將公鑰表示成類似這樣(1NE5ZK9H4TBopmbq3jwin8uCjo1ZKZQNGx)的錢包地址。盡管仍然很難記,但是比原始的數(shù)字短了很多呢。
在真實(shí)的比特幣系統(tǒng)中,使用私鑰為一筆交易的輸入進(jìn)行簽名,并且交易的輸出要綁定收款人的公鑰。例如,你之前收到來(lái)自小A 的10比特幣收入,小A使用了你的錢包地址,也就是公鑰來(lái)綁定這10比特幣,要求必須用這個(gè)公鑰對(duì)應(yīng)的私鑰進(jìn)行簽名,才可以花這筆錢。
當(dāng)你打算花掉這10比特幣時(shí),必須使用你的私鑰為它簽名。這樣,當(dāng)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)收到你的交易信息,就可以用這10比特幣上綁定的公鑰,來(lái)檢驗(yàn)?zāi)愫灻暮戏ㄐ浴6阒付愕慕灰纵敵鰹榉恐餍,也就意味著你使用小D的公鑰綁定了付給他的25比特幣。另外還有一筆找零,當(dāng)然是綁定上你自己的公鑰了。
制作出一筆合法的交易記錄,然后簽名之后,需要廣播到比特幣網(wǎng)絡(luò)中。那什么又叫廣播到網(wǎng)絡(luò)里去呢?簡(jiǎn)單地說(shuō),就是把你的交易發(fā)送給網(wǎng)絡(luò)中和你相鄰的計(jì)算機(jī)節(jié)點(diǎn),然后這些節(jié)點(diǎn)驗(yàn)證了你的交易簽名,又把它發(fā)送給他們相鄰的其他節(jié)點(diǎn),一傳十,十傳百,最終你的交易就會(huì)被傳遍全網(wǎng)。
如果全世界都知道了這筆交易,那你就無(wú)法賴賬了。
這時(shí),如果你再試圖創(chuàng)建一筆交易,把已經(jīng)花掉的10比特幣和20比特幣當(dāng)作輸入付給別人,網(wǎng)絡(luò)中的所有人都會(huì)拒絕接受。不過(guò),聰明的你可能會(huì)想,如果把買房的交易發(fā)給網(wǎng)絡(luò)中一部分節(jié)點(diǎn),而又用同一筆錢創(chuàng)建另一筆交易買豪車,發(fā)給網(wǎng)絡(luò)中另一部分節(jié)點(diǎn),那會(huì)產(chǎn)生什么樣的結(jié)果呢?
首先,有一部分節(jié)點(diǎn)先收到了你的第一筆交易,他們會(huì)記錄下來(lái),傳播出去;另一部分節(jié)點(diǎn)收到了你的第二筆交易,他們也會(huì)記錄下來(lái),傳播出去。隨著時(shí)間的推移,有一些節(jié)點(diǎn)先后收到了你的兩筆交易。怎么辦呢?很簡(jiǎn)單,他們把先收到的交易記錄下來(lái),然后認(rèn)為后一筆收到的交易是不合法的,直接丟掉。
這時(shí),網(wǎng)絡(luò)中的節(jié)點(diǎn)出現(xiàn)了不一致:一部分節(jié)點(diǎn)認(rèn)可你的第一筆交易,另一部分節(jié)點(diǎn)認(rèn)可你的第二筆交易。作為一個(gè)貨幣系統(tǒng),比特幣當(dāng)然只會(huì)承認(rèn)其中一筆。具體怎么做呢?比特幣系統(tǒng)引入了一個(gè)競(jìng)賽,讓節(jié)點(diǎn)們互相競(jìng)爭(zhēng),最終達(dá)成一致。
說(shuō)到這里,有必要為大家介紹一下比特幣的底層技術(shù)——區(qū)塊鏈,是如何工作的。
在比特幣系統(tǒng)中,節(jié)點(diǎn)是這么組織交易的:發(fā)生時(shí)間相近的交易會(huì)被放在一起,形成一個(gè)“區(qū)塊”,然后每個(gè)區(qū)塊按照時(shí)間順序首尾相接,后一個(gè)區(qū)塊里會(huì)寫著前一個(gè)區(qū)塊的編號(hào),所有區(qū)塊組成一個(gè)鏈條的形狀。這個(gè)鏈條從第一個(gè)區(qū)塊(也就是創(chuàng)始?jí)K)開始,到最新的一個(gè)區(qū)塊為止,記錄了比特幣歷史上所有已經(jīng)確認(rèn)的交易記錄。
回到剛才的問(wèn)題。網(wǎng)絡(luò)中一部分節(jié)點(diǎn)認(rèn)可了你的第一筆交易,把它放在了新生成的區(qū)塊里;另一部分節(jié)點(diǎn)認(rèn)可了你的第二筆交易,也把它放在了他們新生成的區(qū)塊里。那么,誰(shuí)說(shuō)了算呢?
畫外音:人多的說(shuō)了算唄?
嗯,一定程度上是對(duì)的,不過(guò)比特幣系統(tǒng)還要更復(fù)雜一點(diǎn)。實(shí)際上,把一個(gè)區(qū)塊打包加入到區(qū)塊鏈里,也被設(shè)計(jì)成了一件非常困難的事情。
當(dāng)一個(gè)節(jié)點(diǎn)收集到一批交易信息,制作出來(lái)一個(gè)區(qū)塊,它還需要先把這個(gè)區(qū)塊合法化,才能把它加入到區(qū)塊鏈里,被整個(gè)網(wǎng)絡(luò)認(rèn)可。中本聰在設(shè)計(jì)比特幣系統(tǒng)時(shí),要求一個(gè)區(qū)塊必須滿足一個(gè)非??量痰臈l件,才能被認(rèn)為是區(qū)塊鏈里的一個(gè)合法區(qū)塊。
簡(jiǎn)單地說(shuō),所有新產(chǎn)生的區(qū)塊,除了交易記錄、上一個(gè)區(qū)塊的地址等數(shù)據(jù)之外,還必須添加一個(gè)(稱作 nonce 的)小塊數(shù)據(jù),使得整個(gè)區(qū)塊經(jīng)過(guò)一個(gè)(稱作哈希計(jì)算的)數(shù)學(xué)運(yùn)算之后,得到的結(jié)果滿足指定的條件。而找到滿足這樣條件的小塊數(shù)字(nonce),至少對(duì)于現(xiàn)在計(jì)算機(jī)的計(jì)算能力來(lái)說(shuō),是一件非常困難的事情。
這里,比特幣對(duì)區(qū)塊做的數(shù)學(xué)運(yùn)算稱作哈希計(jì)算。在計(jì)算機(jī)科學(xué)里,哈希計(jì)算是一系列計(jì)算的統(tǒng)稱,這類計(jì)算能夠?qū)⒁粔K數(shù)據(jù),映射成一小串固定長(zhǎng)度的數(shù)字,我們稱作哈希值。
哈希計(jì)算有幾個(gè)特點(diǎn):
一是,給定輸入數(shù)據(jù),可以很快計(jì)算出來(lái)它的哈希值;反之只給出哈希值,則幾乎不可能算出原始數(shù)據(jù)。
二是,輸入的數(shù)據(jù)哪怕只是改變一點(diǎn)點(diǎn),算出來(lái)的哈希值也會(huì)發(fā)生翻天覆地的變化。
也就是說(shuō),通過(guò)哈希計(jì)算,我們的區(qū)塊(包含交易記錄、上一個(gè)區(qū)塊的地址以及額外的一小塊數(shù)據(jù)),會(huì)算出一個(gè)固定長(zhǎng)度的哈希值來(lái)。比特幣系統(tǒng)要求合法的區(qū)塊計(jì)算出來(lái)的哈希值小于某一個(gè)閾值,因此,比特幣中的計(jì)算節(jié)點(diǎn)們就需要不停嘗試不同的數(shù)字,使得整個(gè)區(qū)塊的哈希值滿足條件。
由于計(jì)算產(chǎn)生新區(qū)塊是一件非常困難的事情,為了鼓勵(lì)網(wǎng)絡(luò)中參與區(qū)塊鏈建設(shè)的節(jié)點(diǎn),比特幣系統(tǒng)協(xié)議允許生成合法新區(qū)塊的節(jié)點(diǎn)得到兩種收益。
一種收益是交易手續(xù)費(fèi),還記得你的買房交易里有一筆 0.001 比特幣的手續(xù)費(fèi)嗎?這個(gè)手續(xù)費(fèi)就是獎(jiǎng)勵(lì)給把你的交易打包進(jìn)區(qū)塊鏈的節(jié)點(diǎn)的。這個(gè)手續(xù)費(fèi)是可選的,不過(guò)包含適量的手續(xù)費(fèi)可以使得你的交易更快地被打包進(jìn)區(qū)塊鏈。
另一種收益來(lái)自一種稱作 coinbase 的交易,這是比特幣系統(tǒng)中一個(gè)特殊的交易,也是唯一一種無(wú)需包含輸入,而只有輸出的交易。比特幣系統(tǒng)中的所有節(jié)點(diǎn)都認(rèn)可這個(gè)規(guī)則,計(jì)算出合法區(qū)塊的節(jié)點(diǎn),可以在區(qū)塊中包含一筆這樣的交易,寫上自己的錢包地址,獎(jiǎng)勵(lì)給自己一些比特幣。最初這個(gè)獎(jiǎng)勵(lì)的金額是 50 比特幣,大約每四年這個(gè)獎(jiǎng)勵(lì)金額就會(huì)減半,按照系統(tǒng)設(shè)計(jì),2140年這個(gè)獎(jiǎng)勵(lì)就消失了,目前這個(gè)獎(jiǎng)勵(lì)大約是 12.5 比特幣。
由于 coinbase 交易“憑空”創(chuàng)造出了比特幣,它也是比特幣發(fā)行的唯一方式。
參與比特幣記賬的節(jié)點(diǎn)要通過(guò)復(fù)雜而費(fèi)力的計(jì)算工作來(lái)添加新區(qū)塊,從而得到交易手續(xù)費(fèi)和系統(tǒng)獎(jiǎng)勵(lì),因此這種工作也被人們形象地稱為“挖礦”,參與挖礦的計(jì)算機(jī)節(jié)點(diǎn)被稱作“礦機(jī)”,控制礦機(jī)的人們則自稱“礦工”。
在比特幣系統(tǒng)中,并非所有參與者都會(huì)選擇成為礦工。事實(shí)上,大多數(shù)參與比特幣交易的普通人,只需要讀取數(shù)據(jù)或者發(fā)起交易。
有了經(jīng)濟(jì)上的利益誘惑,所有參與記賬的礦工節(jié)點(diǎn),在組成一個(gè)新區(qū)塊之后,就開始不停地計(jì)算,尋找這個(gè)能使整個(gè)區(qū)塊合法的數(shù)字。所有的節(jié)點(diǎn)都參與競(jìng)爭(zhēng),每當(dāng)有一個(gè)節(jié)點(diǎn)率先算出來(lái)了合法的區(qū)塊,它就會(huì)興奮地通知周圍的節(jié)點(diǎn),把這個(gè)新的區(qū)塊廣播給大家。
而當(dāng)一個(gè)節(jié)點(diǎn)收到了別人傳來(lái)的合法區(qū)塊,它就會(huì)先去校驗(yàn)這個(gè)區(qū)塊是否滿足合法條件。如果校驗(yàn)通過(guò),也就意味著自己在剛才這場(chǎng)競(jìng)爭(zhēng)中失敗了,于是它就放棄自己正在進(jìn)行的計(jì)算,把別人傳來(lái)的區(qū)塊加入到自己的區(qū)塊鏈中 ,然后重整旗鼓,參與下一個(gè)區(qū)塊的計(jì)算。
再回到前面的情況,當(dāng)你把用同一筆錢買房的交易和買車的交易都發(fā)送到網(wǎng)絡(luò)上之后,一部分節(jié)點(diǎn)可能先收到了買房這筆交易,于是嘗試把這筆交易加入到它們的下一個(gè)區(qū)塊里,而這些節(jié)點(diǎn)稍后再收到買車這筆交易時(shí),就簡(jiǎn)單地忽略掉它;而另一部分節(jié)點(diǎn)則可能剛好相反,它們嘗試把買車這筆交易加入到它們下一個(gè)區(qū)塊里。在絕大多數(shù)情況下,只有一方能夠先勝出。假設(shè)買房的交易先勝出,那么當(dāng)包含這筆交易的區(qū)塊迅速被網(wǎng)絡(luò)上所有節(jié)點(diǎn)都認(rèn)可之后,買車這筆交易就再也沒(méi)有機(jī)會(huì)被人接受了。
此外,由于產(chǎn)生新區(qū)塊非常困難,想篡改區(qū)塊鏈中的交易記錄(造分叉)也成了一件很困難的事情。假設(shè)你付給房主小 D 房款之后,你的交易被打包到了一個(gè)最新的區(qū)塊 X 里,而 X 的上一個(gè)區(qū)塊是 W。如果你想賴賬,抹掉這筆交易,那么你需要把區(qū)塊 X 里的交易拿出來(lái),去掉你的交易,重新計(jì)算一個(gè)新的區(qū)塊 X-1。如果你成功了,那就意味著你在W之后制造了一個(gè)區(qū)塊鏈的分叉。
這時(shí)比特幣系統(tǒng)有一個(gè)簡(jiǎn)單的策略來(lái)彌合分叉這種不一致的情況,那就是:所有比特幣網(wǎng)絡(luò)中的節(jié)點(diǎn),都只在當(dāng)前最長(zhǎng)的區(qū)塊鏈分叉上計(jì)算新塊,而忽略較短的分叉。
此時(shí)網(wǎng)絡(luò)中所有其他的節(jié)點(diǎn)都在嘗試往 X 之后構(gòu)建新的區(qū)塊 Y,你必須趕在他們之前構(gòu)造出區(qū)塊X-1,然后在其他人算出 Y 之前,計(jì)算出X-1 后的新區(qū)塊 Y-1,這樣才能說(shuō)服所有人放棄 X,切換到 X-1 和 Y-1 這個(gè)分支上來(lái)。除非你的計(jì)算能力爆棚,超過(guò)了全網(wǎng)計(jì)算能力的 50%,否則這已經(jīng)是一件幾乎不可能完成的任務(wù)了。
那如果你想篡改的交易X已經(jīng)被計(jì)算出來(lái)若干個(gè)新區(qū)塊了呢?你必須從X開始逐一重新計(jì)算,試圖制作出一條更長(zhǎng)的區(qū)塊鏈分支來(lái)說(shuō)服大家。這不僅是幾乎不可能的事情,而且會(huì)讓嘗試做這樣事情的人損失巨大的能源、計(jì)算機(jī)節(jié)點(diǎn)資源。有這個(gè)能力,你完全可以做個(gè)正常的礦工,賺取每個(gè)區(qū)塊產(chǎn)生的收益。因此,你的交易在區(qū)塊鏈里時(shí)間越久,前面產(chǎn)生的新區(qū)塊越多,你的交易也就越安全。
雖然由偽造導(dǎo)致的分叉在實(shí)際情況中不常發(fā)生,但因?yàn)椴煌?jié)點(diǎn)收到交易的先后順序不同、選擇策略不同,而網(wǎng)絡(luò)則又不總是可靠,比特幣偶爾也會(huì)出現(xiàn)分叉。
產(chǎn)生區(qū)塊的過(guò)程稱為工作量證明方法,這種方法使得篡改、偽造區(qū)塊鏈變得代價(jià)高昂,從而確保了在沒(méi)有中心權(quán)威的情況下,參與系統(tǒng)的各方出于保障自己的經(jīng)濟(jì)利益的目的,去遵守和維護(hù)系統(tǒng)規(guī)則。這樣就使得人們對(duì)系統(tǒng)產(chǎn)生了信任,從而賦予了比特幣價(jià)值。
怎么樣,是不是非常精巧和神奇呢?
(摘自微信公眾號(hào)“中科物理所”)