區(qū)塊鏈與比特幣

區(qū)塊鏈原本是一種基于互聯(lián)網(wǎng)的傳輸,信息編碼,加解密,驗(yàn)證技術(shù)。比特幣則是區(qū)塊鏈理論的一個(gè)具體應(yīng)用。

理解去中心化

去中心化顧名思義,是中心化的一個(gè)對(duì)立面。一個(gè)很常見的例子是,早期我們下載電影,是在一些知名的電影下載網(wǎng)站下載,電影下載網(wǎng)站有一些服務(wù)器用于存儲(chǔ)電影文件,提供給用戶進(jìn)行下載,電影文件集中存儲(chǔ)中固定的服務(wù)器上,這就是典型的中心化。

后來,一種去中心化的模式出現(xiàn)了,這就是BT下載,也被稱之為P2P(peer to peer)點(diǎn)對(duì)點(diǎn)下載。P2P下載的原理和電影網(wǎng)站完全不同,簡(jiǎn)單來說,電影并不是完整的存儲(chǔ)在一個(gè)網(wǎng)站服務(wù)器上,而是以一個(gè)一個(gè)小片段的方式存儲(chǔ)在各個(gè)不同用戶的電腦中,下載時(shí)你的電腦P2P客戶端會(huì)從不同其他用戶的電腦中下載片段,再拼接成一部完整的電影。電影以片段的方式存儲(chǔ)在眾多用戶的電腦端,沒有一個(gè)獨(dú)家的中心節(jié)點(diǎn)存儲(chǔ),這就是去中心化。

理解比特幣

比特幣是去中心化理念的一種實(shí)現(xiàn)方式。它的核心規(guī)則有兩條:

  1. 比特幣的發(fā)行不是由某個(gè)固定機(jī)構(gòu)說了算(與之相對(duì)的概念就是現(xiàn)在的銀行),而是只要安裝了BTC客戶端的軟件都可以生產(chǎn)出BTC。簡(jiǎn)單來說,BTC公開了一套算法,只要算出符合其算法條件的數(shù)字,就可以獲得BTC的獎(jiǎng)勵(lì)。這樣的根據(jù)算法計(jì)算結(jié)果的過程,就是我們常說的“挖礦”。

  2. BTC的交易記錄不是像銀行那樣記錄在單一的固定服務(wù)器上,而是所有參與BTC“挖礦”的節(jié)點(diǎn),都會(huì)記錄,可以理解成每臺(tái)計(jì)算機(jī)都記錄著從BTC誕生開始到現(xiàn)在完整的全部交易記錄,因此不存在篡改的可能性。

從以上的規(guī)則中可以看出,BTC是完全去中心化理念的一種實(shí)現(xiàn)。但這種技術(shù)實(shí)現(xiàn)也暴露出兩個(gè)明顯的問題:

  1. BTC的客戶端軟件由于需要記錄全部的歷史交易記錄,因此需要巨大的存儲(chǔ)空間。
  2. 為了防止有人惡意生成虛假的轉(zhuǎn)賬記錄,BTC有一套很復(fù)雜的流程來確保交易記錄是真實(shí)的。這個(gè)確認(rèn)過程可能長(zhǎng)達(dá)數(shù)個(gè)小時(shí)甚至幾天。

實(shí)際上,區(qū)塊鏈解決的核心問題是信任問題。所有的金融機(jī)構(gòu),銀行、保險(xiǎn)、券商等等,讓它們賴以生存的根本是信用,我們之所以會(huì)放心地買股票、買期貨、買紙黃金,都是因?yàn)槲覀冃湃纬洚?dāng)交易中介的機(jī)構(gòu),而這些交易中介,就是金融活動(dòng)的中心,我們寧愿為此付出一定的手續(xù)費(fèi)、交易費(fèi),金融機(jī)構(gòu)也因此掙得盆滿缽滿。

比特幣的基本原理

當(dāng)我們收到一條交易記錄時(shí),例如“A給B轉(zhuǎn)了5元錢”,我們需要解決兩個(gè)問題:

  1. 如何確保這條消息的完整性
  2. 如何確保這條消息的真實(shí)性

對(duì)于第一個(gè)問題,BTC采用數(shù)字指紋的方式解決。BTC規(guī)定,任何發(fā)出信息的一方,必須同時(shí)發(fā)出原始信息的指紋(SHA-256計(jì)算得出)。那么收到信息的一方只需要用公開的SHA-256算法把原始信息也生成一個(gè)指紋,和收到的指紋比對(duì)一下,如果一致,就說明收到的信息是完整的;如果不一致,說明收到的原始信息由于某種原因被修改過了,這個(gè)原因可能是數(shù)據(jù)傳輸過程中的錯(cuò)誤,也可能是被人篡改了等等。

但因?yàn)镾HA算法是公開的,如果有一個(gè)黑客攔截了原始信息和指紋,他把原始信息修改掉,比如把“A支付5元錢給B”改為“A支付5元錢給C”,同時(shí)生成新的指紋發(fā)送給你。這該怎么辦呢?這就是我們要解決的第二個(gè)問題:如何確保信息的真實(shí)性?解決這個(gè)問題,等于也解決了信息發(fā)送方想抵賴的問題。

解決第二個(gè)問題的關(guān)鍵就是給指紋加密。BTC采用非對(duì)稱加密的方式解決這個(gè)問題。它的流程如下:

  • 假設(shè)需要記賬的原始交易信息:A支付5元錢給B(以下簡(jiǎn)稱“原文”)。
  • 發(fā)送方首先計(jì)算出原文的數(shù)字指紋,然后使用自己的私鑰對(duì)數(shù)字指紋進(jìn)行加密,得到一個(gè)密文。
  • 發(fā)送者將原文,密文和公鑰傳播到比特幣網(wǎng)絡(luò)中,至此,信息發(fā)送步驟結(jié)束。
  • BTC其他節(jié)點(diǎn)接收到此信息后,使用公鑰將密文解密,再將解密后的信息和原文的SHA256指紋進(jìn)行比對(duì),如果相同,則認(rèn)為信息真實(shí),添加到自己的賬本中。

一個(gè)BTC錢包本質(zhì)上就是一個(gè)公私鑰對(duì),首先生成一個(gè)私鑰(類似于銀行卡密碼),然后由私鑰生成一個(gè)公鑰,再根據(jù)公鑰壓縮生成一個(gè)錢包地址(類似于銀行卡號(hào))。轉(zhuǎn)賬時(shí),通過私鑰進(jìn)行簽名,然后在賬單附上公鑰,記賬節(jié)點(diǎn)通過公鑰核對(duì)簽名和指紋,確保信息的正確性。

在比特幣網(wǎng)絡(luò)中,私鑰是動(dòng)用賬號(hào)中比特幣的唯一憑證,如果你的私鑰被盜,你就永遠(yuǎn)失去了它,打官司也要不回來,因?yàn)闆]有任何方式可以證明他的私鑰是從你這里偷走的。

比特幣的深入理解

至此,我們?nèi)ブ行幕~本的理想已經(jīng)實(shí)現(xiàn)了一半,還需要解決兩個(gè)問題:

  1. 賬本同步問題。不同電腦上的記錄不同步,到底以誰的電腦記錄為準(zhǔn)呢?
  2. 如何防止同一個(gè)比特幣被重復(fù)使用?如果一個(gè)黑客,只有一枚BTC,但在極短的時(shí)間內(nèi),散播兩條信息,一條是支付給A,另一條是支付給B。此時(shí)如果有的節(jié)點(diǎn)先收到信息A,有的節(jié)點(diǎn)先收到信息B,以哪一條為準(zhǔn)呢?

中本聰?shù)目傮w思路是這樣的:比特幣網(wǎng)絡(luò)中的所有電腦都只認(rèn)可唯一的一個(gè)賬本,任何一臺(tái)電腦在接入比特幣網(wǎng)絡(luò)時(shí),首先要同步這個(gè)唯一的賬本,任何一臺(tái)電腦想要往這個(gè)賬本上寫入新的信息,必須完成一套繁瑣的“手續(xù)”,這套手續(xù)復(fù)雜到幾乎不太可能被同時(shí)完成兩次,即便真的發(fā)生了巧合,被同時(shí)完成了兩次甚至多次,也有一個(gè)規(guī)則可以判定哪條信息是合法的,哪條信息該被拋棄。

為什么要交區(qū)塊鏈呢,這是因?yàn)橘~本被設(shè)計(jì)成一個(gè)由“信息包”組成的長(zhǎng)鏈,而這樣的的一個(gè)信息包,就被稱為一個(gè)區(qū)塊。每個(gè)區(qū)塊都有一個(gè)唯一的自然數(shù)編號(hào),1,2,3,4......遞增下去。編號(hào)被稱為height,不允許跳躍,也不允許中斷和重復(fù)。

第一個(gè)區(qū)塊是由中本聰創(chuàng)建的,之后開始,每一個(gè)區(qū)塊都必須嚴(yán)格遵守比特幣系統(tǒng)的規(guī)則來創(chuàng)建,一個(gè)區(qū)塊至少包含以下信息:

  • 前一個(gè)區(qū)塊的數(shù)字指紋 + 固定信息 + 收到的交易記錄 + 一個(gè)隨機(jī)數(shù)

區(qū)塊鏈的奧妙之處就在于這個(gè)隨機(jī)數(shù)。中本聰規(guī)定:這個(gè)新區(qū)塊的數(shù)字指紋(一個(gè)256位的二進(jìn)制數(shù))的前72位必須全部為0。因此,挖礦的本質(zhì)就是在獲得新區(qū)塊的記賬權(quán),即這個(gè)隨機(jī)數(shù)的計(jì)算。

回憶一下我們前面介紹過的數(shù)字指紋的知識(shí)。因?yàn)镾HA算出來的指紋是毫無規(guī)律可循的一組數(shù)字,所以,想要滿足中本聰?shù)倪@個(gè)變態(tài)規(guī)定,唯一的辦法就只能憑運(yùn)氣湊奧數(shù),從0開始不斷地去嘗試,直到滿足要求為止。

一旦成功的計(jì)算出這么一個(gè)隨機(jī)數(shù),就獲得了一次記賬權(quán)力,可以給賬本上新增加一個(gè)區(qū)塊。那么,為什么要花時(shí)間找奧數(shù),去給賬本記賬呢?因?yàn)楹锰帉?shí)在太大了。

比特幣系統(tǒng)規(guī)定,每成功增加一個(gè)區(qū)塊,這臺(tái)記賬的電腦(實(shí)際上是某個(gè)賬號(hào))就能獲得12.5個(gè)比特幣的獎(jiǎng)勵(lì)(截止到本文寫作時(shí)的獎(jiǎng)金額),以及這個(gè)區(qū)塊中所有交易的手續(xù)費(fèi),總額取決于交易頻繁程度(平均約2比特幣)。

正因?yàn)閵W數(shù)太難找,每個(gè)區(qū)塊平均要10分鐘才能生成一個(gè),所以就能基本解決本節(jié)開頭提出的第一個(gè)問題“如何同步賬本”,只要有個(gè)三四分鐘的時(shí)間,足以讓所有在線的電腦同步到這個(gè)區(qū)塊了,那些不在線的電腦或者第一次運(yùn)行客戶端的電腦,上線以后必須先做一件事情,就是從相鄰的節(jié)點(diǎn)上獲取最新的賬本。

請(qǐng)注意,我用了“基本解決”這個(gè)詞,也就意味著,并沒有完全解決“賬本同步”的問題。這是因?yàn)榭倳?huì)有極小的概率兩臺(tái)礦機(jī)恰好同時(shí)找到奧數(shù),也就意味著同時(shí)搶到了記賬權(quán)。因?yàn)榈V機(jī)實(shí)在太多了,這樣的小概率事件時(shí)不時(shí)也會(huì)發(fā)生一次,同時(shí)搶到記賬權(quán)的礦機(jī)都能將自己生成的新區(qū)塊廣播到比特幣網(wǎng)絡(luò)中。

在這種情況下,相當(dāng)于網(wǎng)絡(luò)上的其他節(jié)點(diǎn)收到了兩個(gè)合法的新區(qū)塊,因?yàn)榫W(wǎng)絡(luò)節(jié)點(diǎn)的地域分布不同,所以,不同的節(jié)點(diǎn)收到這兩個(gè)新區(qū)塊的先后次序就會(huì)不同。此時(shí),所有的節(jié)點(diǎn)會(huì)暫時(shí)保留兩個(gè)新區(qū)塊,并且把區(qū)塊鏈做一個(gè)臨時(shí)的分叉。

接下來,比特幣網(wǎng)絡(luò)中必然又會(huì)有其中一個(gè)節(jié)點(diǎn)(礦機(jī))搶到了記賬權(quán),這時(shí)該節(jié)點(diǎn)就會(huì)將生成的最新區(qū)塊接到其中的一個(gè)分支上,那到底是接到新區(qū)塊1,還是新區(qū)塊2上呢?系統(tǒng)規(guī)則是:這個(gè)節(jié)點(diǎn)先收到哪個(gè)區(qū)塊,就接到哪個(gè)區(qū)塊上,同時(shí)放棄另一個(gè)區(qū)塊,然后全網(wǎng)廣播。

比特幣網(wǎng)絡(luò)上的所有節(jié)點(diǎn)在收到最新的區(qū)塊鏈后,只要發(fā)現(xiàn)其中一個(gè)分支比另外一個(gè)分支多兩個(gè)區(qū)塊了,就立即也放棄那個(gè)短的分支??傊?,比特幣網(wǎng)絡(luò)永遠(yuǎn)只承認(rèn)更長(zhǎng)的那條分支。

因?yàn)橛辛诉@個(gè)臨時(shí)分叉的規(guī)則,所以,比特幣玩家在完成一筆交易后,不能立即認(rèn)為這筆交易是成功的,有可能會(huì)被取消,必須等到一定數(shù)量的新區(qū)塊生成后,如果交易依然沒有被取消,這才能放心地認(rèn)為交易成功了。那到底要等到多少個(gè)新區(qū)塊產(chǎn)生才能放心呢?

按照概率來說的話,小額交易有三個(gè)新區(qū)塊產(chǎn)生就夠了,但是大額交易的話,為了更保險(xiǎn),一般認(rèn)為等到六個(gè)新區(qū)塊產(chǎn)生,就足以放心了。前面說過,每個(gè)區(qū)塊產(chǎn)生的平均時(shí)間是10分鐘,也就意味著,一筆大額交易需要一個(gè)小時(shí)左右才能確認(rèn)交易成功。

中本聰當(dāng)初設(shè)計(jì)比特幣系統(tǒng)時(shí),規(guī)定了每一個(gè)區(qū)塊最大只能是1MB,一條交易記錄大概是0.25KB,那么一個(gè)區(qū)塊最多可以儲(chǔ)存4000多條交易記錄,如果在一個(gè)新區(qū)塊產(chǎn)生的時(shí)段中,發(fā)生的交易請(qǐng)求超過4000條,那就肯定存不下了。

我們可以算算,這個(gè)量大概是一個(gè)怎樣的交易頻率,每個(gè)區(qū)塊的平均產(chǎn)生時(shí)間是10分鐘,也就意味著,平均每秒鐘的交易量如果超過7條,那么就一定會(huì)出現(xiàn)排隊(duì)等待打包的交易記錄了。這個(gè)交易頻率實(shí)在很低,要知道支付寶一秒鐘大約要處理上萬筆交易。這一秒鐘七筆交易對(duì)于全球來說,實(shí)在是太不夠用了。

一般來說,大額交易優(yōu)先打包,小額交易中手續(xù)費(fèi)越高的交易越優(yōu)先打包,打包規(guī)則礦工有一定的自主權(quán)。比特幣交易手續(xù)費(fèi)的規(guī)則比較復(fù)雜,不同的礦工收的還不一樣,不是三言兩語能說清,但有一點(diǎn)可能會(huì)讓你感到詫異,越是大額的交易反而收費(fèi)越低,甚至免費(fèi)。交易額越小反而費(fèi)率越高。這是因?yàn)椋灰资掷m(xù)費(fèi)除了鼓勵(lì)礦工挖礦,還有一個(gè)非常重要的功能,就是防止有人惡意發(fā)布大量的小額交易造成信息擁堵。

現(xiàn)在,比特幣交易滯留是非常普遍的現(xiàn)象,很多小額交易甚至等上好幾天都確認(rèn)不了,因此,很多人不惜附加很高的交易手續(xù)費(fèi)來讓礦工提前替他們打包。

其他問題

比特幣的產(chǎn)出速度本質(zhì)上就是尋找奧數(shù)的速度,現(xiàn)在的奧數(shù)是要求前72位全部為零,如果把72改為73,那么尋找奧數(shù)的難度就立即翻一倍,同理,如果從72減為71,則難度減半。因此,系統(tǒng)只需要根據(jù)全網(wǎng)的平均算力來調(diào)節(jié)奧數(shù)的規(guī)則就可以很簡(jiǎn)單地做到?,F(xiàn)在的規(guī)則是平均每產(chǎn)生2016個(gè)新區(qū)塊后,根據(jù)產(chǎn)生這些新區(qū)塊的平均算力調(diào)節(jié)一次難度。我們也注意到,這種調(diào)節(jié)較為粗糙,只能翻倍或者減半。

為何比特幣總量上限是2100萬枚?

這個(gè)總量上限是人為規(guī)定的。中本聰設(shè)計(jì)的規(guī)則是這樣:每增加21萬個(gè)區(qū)塊后,幣獎(jiǎng)勵(lì)就減半,獎(jiǎng)勵(lì)的初始值是50比特幣,所以北京時(shí)間2009年1月4日中本聰自己創(chuàng)建的第一個(gè)創(chuàng)世區(qū)塊,就獎(jiǎng)勵(lì)給了自己50比特幣。按照平均10分鐘一個(gè)區(qū)塊的產(chǎn)出速度,大約是每隔四年會(huì)減半一次。

第一次減半發(fā)生在北京時(shí)間2012年11月29日7點(diǎn)24分,第21萬個(gè)區(qū)塊誕生,比特幣獎(jiǎng)勵(lì)減少為25個(gè)。北京時(shí)間2016年7月10日凌晨0點(diǎn)46分,第42萬個(gè)區(qū)塊誕生,這次相隔時(shí)間大約是三年零七個(gè)月,比特幣獎(jiǎng)勵(lì)再次減半,成為現(xiàn)在的12.5個(gè)。

知道了這個(gè)規(guī)則,我們就很容易根據(jù)當(dāng)前的區(qū)塊高度計(jì)算出已經(jīng)挖出的比特幣總量,截止到本文寫作時(shí),比特幣的總量約1687萬枚。按照這樣的半衰期,大約到2140年,比特幣的產(chǎn)量就趨于零,上限是2100萬個(gè),實(shí)際上不可能達(dá)到2100萬。比特幣允許交易的最小單位是0.00000001(10^(-8))比特幣,這個(gè)最小值也被稱為“一聰”,這是由腳本語言支持的最小數(shù)字精度決定的,因此,比特幣的總量上限就是2100萬億聰。

中本聰為什么要人為規(guī)定一個(gè)總量上限呢?因?yàn)樗睦硐胧莿?chuàng)造一種不能濫發(fā)的貨幣,從而在理論上徹底阻斷通貨惡性膨脹。至于這種理想能不能因?yàn)橐?guī)定了上限而實(shí)現(xiàn),是一個(gè)經(jīng)濟(jì)學(xué)問題,我沒有能力多談,只知道在經(jīng)濟(jì)學(xué)中,通貨膨脹和通貨緊縮同樣都是可怕的。

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容