長文解惑:區塊鏈與比特幣

在這裏插入圖片描述

轉載自 微信公衆號:“數據倉庫與Python大數據”

區塊鏈,成爲這兩年最火的互聯網字眼,但估計大多數人都只是聽着耳熟,並不真正瞭解。
與區塊鏈一起出現最多的詞是比特幣,顯然,它們之間肯定存在某種緊密的關係。

本文是一篇深度介紹比特幣和區塊鏈知識的文章,我努力按照“自頂向下、逐次求精”的原則,將比特幣和區塊鏈知識像剝洋蔥一樣,一層一層地深入下去,讓讀者每剝下一層都有完整的知識收穫。

一、去中心化

在這裏插入圖片描述
區塊鏈原本是一種基於互聯網的信息編碼、傳輸、加密、解密、驗證技術,但在我看來,現在已經上升到了一種“去中心化”的理念,本質上是一種理念上的革新。而比特幣就是這種理念的一個具體應用。

打個比方來說,區塊鏈就相當於電子商務,你想想二十年前有幾個人搞得懂什麼是電子商務,它本質上也是一種理念,只不過這種理念必須要藉助一定的技術手段來實現。而比特幣就相當於淘寶網,是電子商務的一個具體應用。

所以,我們要理解什麼是區塊鏈,必須先理解什麼是去中心化。我舉兩個例子來幫助你理解:

第一個例子是從網上下載電影。最早的時候,我們下載電影都是到一些知名的電影下載網站,這些網站會把電影文件存放在一臺或者一組服務器上,大家都訪問這臺(組)服務器下載影片。這叫中心化。
在這個遊戲規則中,電影網站的服務器就是中心,每一個下載電影的人只不過是這個中心拉出來的線而已。中心化的遊戲中,玩家的地位是不平等的,網站主佔據絕對強勢地位,他想讓你下載就下載,想給你限速就限速。
後來,一種去中心化的下載模式出現了,這就是BT下載,也叫P2P(peer to peer)下載。現在我們講到P2P,一般是指那種個人借貸的網站,但最初的概念是從BT下載來的,P2P就是個人到個人,點到點。BT下載的原理與電影網站完全不同,影片並不是存在某個服務器上,而是大家互相從網絡上的每一個人那裏去下載這個影片的一小部分,最後拼成一個完整的文件。
在這個遊戲中,所有玩家的地位是完全平等的,任何一個玩家都可以隨時離場、隨時加入,只要還有人在玩,整個遊戲就能正常運行,沒有人擁有特別的權力。這就叫去中心化。

第二個例子,就是我們每天都在使用的銀行卡或者支付寶、微信這些人民幣支付手段,現金我們先拋開不談。我們用無現金的方式支付人民幣買東西,就是一箇中心化的遊戲,它的中心有好多級,比如說,支付寶的服務器是第一級中心,支付寶資金的託管銀行如工商銀行、中信銀行的服務器就是第二級中心,這些銀行的再上一級中心就是央行——中國人民銀行的服務器。
在這個遊戲中,不同級別玩家的權力、地位是不平等的,最大的Boss當然是央行,它甚至能發行貨幣,它的權力可以大到分分鐘就把我們的錢全部搶光,很簡單,它只需要突然增發貨幣就可以了,物價突然上漲一百倍,我們的錢就等於被搶光了。那貨幣遊戲能不能像下載電影一樣去中心化呢?也是可以的,比特幣系統就是這樣一個去中心化的貨幣遊戲系統,你可以把它看成是一個大型的貨幣實驗。

比特幣的遊戲是這麼玩的,就兩條核心規則:
第一,它的貨幣發行不是由某個機構說了算,而是公開一套算法; 每算出一個符合要求的數字,就相當於挖到了若干個比特幣。誰都可以去算,絕對公平,誰也作不了弊,因爲算法本質上就是一個個數字去湊,湊出一個算一個。
第二,比特幣的交易信息不是記在某一臺服務器上的,而是所有參與這個遊戲的玩家電腦中一人一份,同步記錄,這種交易記錄在理論上幾乎是無法篡改的。

這就是“去中心化賬本”。

這樣一來,所有遊戲玩家的地位和權力就完全平等了,幾乎沒有任何一個玩家是特殊的。爲什麼要加上“幾乎”兩個字呢?因爲,畢竟能夠有能力挖比特幣的那些礦主還是有點特殊的,但這種特殊性並不是太大,而且礦主也沒有任何壁壘,只要你買得起好電腦,誰都可以當礦主。

不得不說,比特幣的這個“去中心化”設計非常之妙。它的發明人,神祕的中本聰(Satoshi Nakamoto)確實是棵“大蔥”。

理解了去中心化,就等於理解了區塊鏈。一個真正的區塊鏈項目,就是通過合理的遊戲規則設計,輔以信息技術,來踐行去中心化理念的項目。比特幣系統就是去中心化理念和區塊鏈技術的一個優秀示範項目。

不誇張地說,我覺得這是一場互聯網的理念革命,是人類的又一次平等化革命。上一次革命是打破了人與人之間在身份地位上的不平等,這一次則是打破了遊戲規則本身的不平等。正因爲這樣,區塊鏈才能激發人們如此大的熱情,這是一個聽上去可以顛覆一切舊規則的新生事物。

然而,在我看來,比特幣系統並不是一個成功的區塊鏈應用,甚至先天不足。爲什麼這麼說呢?因爲,看前面介紹的兩條比特幣核心遊戲規則就知道,它有以下這些天生的缺陷:

第一,比特幣客戶端軟件需要巨大無比的存儲空間, 因爲每一個節點都必須記錄下從比特幣系統誕生的第一天起所有的交易記錄,截止到本文寫作時(2018年2月13日),這個交易記錄文件已經有147GB那麼大了,而且只會增加不會減少。

第二,爲防止有人作弊,比特幣系統有一套很複雜的遊戲規則來確保交易記錄是真實的,這樣就導致每一筆交易的確認時間一般需要一個小時甚至幾天。 想想吧,如果用比特幣去街邊買杯奶茶,會是什麼情況。

第三,最多隻有2100萬枚比特幣,而且,無論有多少人在挖礦,系統規則決定了平均每十分鐘才能產出若干枚比特幣(2018年是每十分鐘12.5枚)。 矛盾正如那句話:人民羣衆日益增長的比特幣需求與比特幣總量不足之間的矛盾。

比特幣不能代表區塊鏈,區塊鏈也不是比特幣。區塊鏈在未來可以有哪些應用呢?

實際上,區塊鏈解決的核心問題是信任問題。 所有的金融機構,銀行、保險、券商等等,讓它們賴以生存的根本是信用,我們之所以會放心地買股票、買期貨、買紙黃金,都是因爲我們信任充當交易中介的機構,而這些交易中介,就是金融活動的中心,我們寧願爲此付出一定的手續費、交易費,金融機構也因此掙得盆滿鉢滿。

但是,當區塊鏈在人們的觀念上和技術上都成熟後,這種中心化的金融機構是有可能被顛覆掉的,因爲我們可以利用區塊鏈的理念和技術來改寫遊戲規則,讓所有的金融產品交易都不再需要一箇中心,而全部以點對點的方式完成,並且從理論上能夠保證信用問題。

到了那時,銀行還需不需要我不知道,因爲銀行還涉及更復雜的國家利益問題,但是,一定會有很多商業金融機構受到區塊鏈的衝擊。

再比如,公證也是一個典型的中心化的販賣信用的機構,區塊鏈完全可以改寫公證行業。關於區塊鏈的應用,後文還會有詳細闡述。
到此,我們對比特幣和區塊鏈建立起了總體概念,接下來,我要幫你剝掉下一層洋蔥皮,瞭解一下比特幣系統的基本原理。

二、比特幣基本原理

數字指紋和非對稱加密
在這裏插入圖片描述
去中心化的賬本還是很容易理解的,只要把所有的交易記錄都記在每一臺電腦的賬本上,然後就可以用計算機的強大計算能力,隨時隨地查出每個人的餘額是多少。

但是大家不要忘了,在網絡上記賬與線下記賬不同。網絡上都是消息來消息去的,大家根本不見面。如果你收到一條信息,上面寫着“A支付5元錢給B”。這時,你不禁要問:

第一,如何確保這條信息內容的完整性?
第二,如何確保信息的真實性?
這兩個問題不解決,去中心化賬本的理想就無法實現。解決辦法是有的。

我們先來看怎麼解決第一個問題:確保記賬信息的完整性。

這裏要引入一個概念,就是數字指紋(很多文章中也叫數字簽名、哈希值)。電腦上的任何信息,按照國際統一的編碼標準,最終都是以0和1來存儲,這就是大名鼎鼎的二進制。例如“錢”這個字用二進制表示就是“1001010010110001”,再比如“A支付5元錢給B”這句話,用二進制表示就是:

0100000111001010010111110011101101100000110101101000101000011100101001011000111111101101100101000010

普通人看到二進制往往無法和數字建立聯繫,實際上,這串二進制數字也可以用一組十進制的數字來表示,它們完全相等:

100000111001010080606408664086260086008422488464406842602666664446622202242228042826680682422068400

看到了十進制的數,很多人才會認爲這確實是一個“數字”。這就是數字指紋了嗎?還不是。

二進制和原始信息只是一一對應的編碼關係,一個英文字母或者數字對應8個比特,一箇中文字符對應16比特,原始信息越長,二進制編碼也越長。任何原始信息都可以轉換成一串數字,有了數字就可以做數學運算,玩出各種花樣了。

現在,我們給數學家提出一個要求:請設計一個算法,將任何一條信息,不論長短,都計算出一個唯一的“數字指紋”與它對應。但有兩個附加條件:一、指紋的長度必須固定;二、只能從“原始信息”計算出“指紋”,誰也無法從“指紋”反向計算出“原始信息”。

這個要求,看似很過分,但是難不倒數學家。1993年,美國國家安全局發佈了SHA算法 ,全稱是Secure Hash Algorithm,中文一般翻譯爲“安全散列算法”或者“安全哈希算法”,這個名稱估計把你嚇到了,聽着特學術(我有時候會聽人說“嘻哈算法”,忍不住偷笑一下,各位千萬別讀錯)。

Hash這個詞沒有對應的中文意譯詞,如果讓我來意譯的話,我會翻譯爲“數字摘要算法”,基本上能表達該算法的含義,就是從目標對象中提取出一個特徵摘要,好像人的指紋一樣。

SHA算法從1993年發佈它的第零代,一直到2015年發佈第三代,二十二年間已經升級了四次。比特幣用到的是第二代算法,簡稱爲SHA-256算法,這裏的“256”表示,由這個算法生成的指紋長度固定爲256比特。大家可以很容易在網上找到在線生成SHA-256指紋的網頁,這個算法是公開的,誰都能用,例如,“錢”字的SHA-256指紋是:

0000111010111000011000111100011110001101101000111110001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

“A支付5元錢給B”的SHA-256指紋是:

1111011110111011001010011011101011011111000001011101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

大家看到,不論原始信息有多長,生成的指紋都是一樣長的。而且這個指紋還有兩個顯著特點:

  • 原始信息只要改變一點點,哪怕只改動一個數字,整個指紋就會發生巨大的變化,毫無規律可循;
  • 截至本文寫作時,世界上還沒有任何公開的方法可以從指紋反向計算出原始信息,普遍認爲理論上無法破解。

不過,在實際的使用中,256位的二進制數據太長了,使用起來極不方便,還很容易看花眼。於是,指紋通常用十六進制來顯示,反正二進制到十六進制是一一對應的。
“錢”的十六進制指紋是:

0eb863c78da3e38b6b92d1f3999566e5d8e17a6f700a112c8993cf6bfc48f70b

“A支付5元錢給B”的十六進制指紋是:

f7bb29badf05d41e60b1036d749f134a901c7a97daef7a1fe4e1e14471bd4833

這樣看起來就簡潔多了,我們可以試一下把“5元錢”改爲“6元錢”,看看指紋的變化有多大,下面是改後的指紋:

1d48da12b0fb29efe6f690185922f96d259bd887343735898bfc3901a83b58c3

看到了吧,僅僅改動了一個數字,但指紋幾乎沒有一位是相同的。這就是SHA算法的神奇之處,也確保了指紋沒有規律可循,無法被反向破譯。

有了數字指紋,就可以解決第一個問題:確保記賬信息的完整性。怎麼做?
很簡單,我們只要做出一個規定,任何發出信息的一方,必須同時發出原始信息的指紋。那麼收到信息的一方只需要用公開的SHA-256算法把原始信息也生成一個指紋,和收到的指紋比對一下,如果一致,就說明收到的信息是完整的;如果不一致,說明收到的原始信息由於某種原因被修改過了,這個原因可能是數據傳輸過程中的錯誤,也可能是被人篡改了等等。

那會不會有一種巧合,原始信息和指紋都因爲某些傳輸錯誤發生了改變,恰好錯誤的指紋數據就是出錯後的原始信息指紋,也就是負負得正了?這事當然不是絕對的不可能,但是從概率上來說,想要自然發生,大概等到宇宙滅亡了也不會發生一次,概率已經低到可以徹底忽略。

不過,你可能也想到了,還有一種可能性,就是黑客惡意篡改。因爲SHA算法是公開的,如果有一個黑客攔截了原始信息和指紋,他把原始信息修改掉,比如把“A支付5元錢給B”改爲“A支付5元錢給C”,同時生成新的指紋發送給你。這該怎麼辦呢?這就是我們要解決的第二個問題:如何確保信息的真實性?解決這個問題,等於也解決了信息發送方想抵賴的問題。

解決第二個問題的關鍵就是給指紋加密

但是,這種加密還不能是我們在諜戰劇裏看到的那種電報加密的方式。大家不妨回憶一下看過的諜戰劇,我地下工作者收到一封電報,上面寫着2352,於是他從書架上拿出一本書,翻到第23頁,再數到第52個字,寫着一個“撤”字。這就是組織上通知這位同志馬上撤退,有人叛變了。這種加密方式的壞處在於,只要敵人也掌握了密碼本,不但可以破譯電報,還能發送假電報釣魚,原因就在於加密和解密的方法是完全一樣的,能解密就能加密,所以,這種加密方法被叫作“對稱加密”,解密的過程只不過是加密的逆過程而已。

“對稱加密”用在我們想要的去中心化賬本系統中就不好使了,因爲我們既要讓網絡上的每一個信息接收者能夠解開密文知道原始信息,又要讓黑客即使拿到密文也只能乾瞪眼,無法篡改密文。

關鍵,在於加密和解密的方法必須不一樣。所以,就要求數學家搞出一種全新的加密算法,這種算法是非對稱的,加密、解密不是互逆的過程。

能不能搞出這樣一個巧妙的加密算法呢?當然是能的,否則就不會有比特幣了嘛。下面我用一個簡化版的非對稱加密算法模擬一下我們想實現的效果。

原始信息是一組數字:269。

現在,我用一種只有我自己才知道的加密算法得到一個密文:24479。

然後,我把24479告訴所有人的同時,還宣佈:解開我這條密文的鑰匙就是數字11(後面我們就把這個公開的鑰匙稱爲公鑰),任何人只要用24479乘以11,取結果的後三位,就能得到我想要告訴大家的原始信息。不信嗎?我們試試看:
24479×11=269269

哇,好有意思,不單後三位,連前三位都是原始信息。我是怎麼加密的呢?很簡單,我把原始信息乘以91就是密文,而這個91就可以叫“私鑰”,我私人的加密鑰匙。這樣就實現了加密和解密是完全不一樣的兩種算法。

你可以試試看,用任意一個三位數字乘以91,得到的結果再乘以11,最終得到的結果一定是原始三位數寫兩遍。例如:218×91×11=218218。

如果用任意一個二位數字乘以91,得到的結果再乘以11,最終得到的結果後二位數字也一定與原始數字相同。例如:18×91×11=18018,至於它背後的數學原理,稍微琢磨一下就能想明白了。

但是請記住,我舉的這個例子只是讓你體會一下什麼叫非對稱加密,因爲這個例子的算法太過簡單,所以知道了公鑰是11的人,很容易猜出私鑰是91。但是比特幣系統採用的算法比這個複雜多了,那個算法確保了任何人即使知道原文、密文、公鑰,也無法猜到私鑰。也就是說,黑客只能解密,但不會加密,無法修改密文。

這麼牛的算法,就是聲名遠播的“橢圓曲線算法”,簡稱爲ECC算法。

它是在1985年由兩位美國人尼爾·庫伯利茲(Neal Koblitz)和維克托·米勒(Victor Miller)分別獨立提出的。在密碼學中的廣泛使用,也就是最近十多年的時間,數學家真的很厲害。

有了這個算法,就能確保去中心化的記賬系統中,每條交易記錄的真實性。我們來演示一下比特幣的去中心化記賬系統如何利用SHA和ECC算法確保賬本的完整性和真實性(以下是簡化後的原理說明,真實過程還要複雜很多,但原理不變)。

需要記賬的原始交易信息:A支付5元錢給B(以下簡稱“原文”)。

  • 第一步:利用SHA將原文生成數字指紋:
f7bb29badf05d41e60b1036d749f134a901c7a97daef7a1fe4e1e14471bd4833
  • 第二步:隨機生成一個私鑰,它的格式與指紋是完全一樣的,例如:
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
  • 第三步:利用ECC將第一步得到的數字指紋通過私鑰加密,得到密文:
869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078
  • 第四步:根據私鑰生成一個公鑰:
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
  • 第五步:將原文、密文和公鑰廣播到整個比特幣網絡中。信息發送步驟到此結束,以下是信息接收步驟。

  • 第六步:接收方利用ECC將密文通過公鑰解密,得到指紋1。

  • 第七步:利用SHA將原文生成數字指紋,得到指紋2。

  • 第八步:比對指紋1是否等於指紋2。

  • 第九步:如果相等,則確認該條信息是合法交易信息,添加到自己的賬本中。如果不相等,則拋棄該信息。至此全部結束。在真實的比特幣網絡中,交易雙方都是完全匿名的,交易者A或者B都是賬號(有些文章中稱“地址”,含義一樣),賬號背後的主人信息是沒有任何記錄的,可以是一條狗,也可以是一個人工智能,而賬號則是根據公鑰,通過一定的算法生成的。

一個私鑰幾乎可以生成無數個不同的對應公鑰,也就意味着可以生成幾乎無數個不同的對應賬號。誰掌握了私鑰,誰就是賬號的主人。

在比特幣網絡中,私鑰是動用賬號中比特幣的唯一憑證,如果你的私鑰被盜,你就永遠失去了它,打官司也要不回來,因爲沒有任何方式可以證明他的私鑰是從你這裏偷走的。

三、比特幣原理深入

區塊鏈技術
在這裏插入圖片描述

到此爲止,我們去中心化賬本的理想只實現了一半,並沒完全實現,爲什麼呢?因爲還有兩個重大的問題沒有解決。

第一個問題:賬本同步問題。

比特幣網絡中有那麼多臺電腦,一條交易信息發送出來的時候,當然不可能所有的電腦都開機,必然有一些處於離線狀態,開了電腦也未必開着比特幣客戶端,所以總有一些電腦無法立刻收到這條信息。這樣就會導致不同電腦上的記錄不同步,到底以誰的電腦記錄爲準呢?

第二個問題:如何防止同一個比特幣被重複使用?

假如有一個黑客,他只有一個比特幣,但是他卻同時把這個比特幣付給A和B(雖然理論上無法真正同時,但可以做到間隔時間極短),於是就會在網絡上廣播兩條信息,一條是支付給A的信息,一條是支付給B的信息,因爲網速的關係,必然有的電腦先收到信息1,有的電腦先收到信息2,這就產生了矛盾,如何確定哪一條信息是有效的呢?

爲解決上面這兩個難題,區塊鏈技術橫空出世。

中本聰的論文真正在全世界掀起大風大浪,不是因爲上一節介紹的比特幣基本工作原理——數字指紋和非對稱加密都是成熟的技術,真正讓他一戰成名的是區塊鏈技術。但請記住:比特幣不是區塊鏈,它只是區塊鏈技術的一個具體應用。

到底什麼是區塊鏈?它怎樣巧妙地解決了賬本同步和信息不重複的問題呢?

中本聰的總體思路是這樣的:比特幣網絡中的所有電腦都只認可唯一的一個賬本,任何一臺電腦在接入比特幣網絡時,首先要同步這個唯一的賬本,任何一臺電腦想要往這個賬本上寫入新的信息,必須完成一套繁瑣的“手續”,這套手續複雜到幾乎不太可能被同時完成兩次,即便真的發生了巧合,被同時完成了兩次甚至多次,也有一個規則可以判定哪條信息是合法的,哪條信息該被拋棄。

讓我一步步爲你揭開區塊鏈技術的面紗。

爲什麼要叫“區塊鏈”?

因爲中本聰把這個賬本設計成了由一個個“信息包”首尾相連而成的長鏈,每一個信息包被稱爲一個“區塊”,這些區塊每一個都有唯一的編號——在比特幣系統中,編號被稱爲高度(height),這些編號就是自然數1、2、3、4……一直往下排,不允許跳躍,也不允許中斷和重複。
在這裏插入圖片描述
下面講解區塊的具體規則:
第一個區塊當然是由區塊鏈的發明人中本聰親自創建的,那是北京時間2009年1月4日,在芬蘭赫爾辛基的一臺小型服務器上,第一個區塊誕生了,這也被稱作“創世區塊”(genesis block)。在這個區塊上,包含的主要信息是:

區塊高度:0

The Times 03/Jan/2009 Chancellor on brinkof second bailout for banks

(譯文:《泰晤士報》2009年1月3日頭版文章標題:財政大臣面臨第二次爲銀行提供緊急救助的窘境)

“某賬號”獲得50比特幣獎勵

中間那段話是中本聰刻在第一個區塊上的紀念,從第二個區塊開始,以後每個區塊就必須嚴格按照比特幣系統的規則來創建了。區塊的規則有(至少包含以下信息):

前一個區塊的數字指紋
+
固定信息
+
收到的交易記錄
+
一個隨機數

區塊鏈的一個奧妙之處在於尾巴上加的這個隨機數(nonce),因爲它實在太奧妙,讓我等凡夫俗子只能大呼過癮,所以後面我就把它稱爲“奧數”,以方便講解。

中本聰規定:這個新區塊的數字指紋(一個256位的二進制數)的前72位必須全部爲0。

回憶一下我們前面介紹過的數字指紋的知識。因爲SHA算出來的指紋是毫無規律可循的一組數字,所以,想要滿足中本聰的這個變態規定,唯一的辦法就只能憑運氣湊奧數,從0開始不斷地去嘗試,直到滿足要求爲止。這是一個純粹的概率問題。我們來算一下要滿足這個要求的概率是多大。

因爲二進制數,每一位只有兩種可能性,0或者1,所以,湊出一個奧數的可能性是2的72次方分之一,也就是:

1/4722366482869645213696

這個數字已經長到看花眼了吧,它大約就是4.7萬億億分之一。換句話說,就是平均要進行4.7萬億億次SHA計算,纔可能得到一個奧數,可見每一個奧數的金貴。

最巧妙的是,奧數並不是某一個方程的解,解出一個少一個,因爲每一個區塊的字符串都不同,所以,每一次尋找奧數都需要從0開始,任何一個數字都有可能成爲新的奧數,完全沒有規律可循。

一旦成功找到一個奧數,就獲得了一次記賬權力,可以給賬本上新增加一個區塊。那麼,爲什麼要花時間找奧數,去給賬本記賬呢?因爲好處實在太大了。

比特幣系統規定,每成功增加一個區塊,這臺記賬的電腦(實際上是某個賬號)就能獲得12.5個比特幣的獎勵(截止到本文寫作時的獎金額),以及這個區塊中所有交易的手續費,總額取決於交易頻繁程度(平均約2比特幣)。這樣一來,相當於每找到一個奧數,可以獲得14.5比特幣獎勵,按照本文寫作時的比特幣市場價,相當於12萬美元。這麼豐厚的獎勵,自然就會吸引大量的電腦去搶奪記賬權。

尋找奧數就是搶記賬權,搶記賬權也就是挖比特幣。

因此,尋找奧數也被形象地稱爲“挖礦”。挖礦的電腦就叫“礦機”,一個裝滿礦機的房間當然就可以叫“礦場”了,礦場的主人就是“礦主”,他們是比特幣江湖中的弄潮兒。

但是,我需要給你解釋一下挖礦的難度,讓你打消去挖礦的衝動。個人電腦的運算速度大約是每秒可以進行60萬次SHA計算,也就意味着,一臺個人電腦平均需要花一千萬年纔有可能湊出一個奧數。當然,這是一種概率計算,我不能從理論上排除某人的人品超新星爆發,只算一次奧數就中了4.7萬億億分之一概率的獎。但我還是想勸你不要相信自己有那個命。

給你看看人家專業的礦場是怎樣的:
在這裏插入圖片描述
一個大型比特幣礦場。圖片來源:谷歌圖片搜索

大規模的礦場據說有幾萬甚至幾十萬臺礦機同時運行。我在《看看新聞》2017年6月17日的一則新聞中看到,記者採訪了一個位於中國四川的礦場,根據報道,這個礦場有5000多臺礦機,屬於小規模,平均每天耗電超過20萬度,當地的電價是每度3毛,一天光是電費就6萬多元,平均每天可以挖出大約50個比特幣,一年左右回本,之後能做到20%左右的利潤。

不過我覺得這個報道中的數據前後矛盾,便查了一下,當時比特幣的市場價是大約每個2500美元,美元兌人民幣的匯率大約是6.8,所以,每天的收入大約是85萬人民幣,一年的收入大約3.1億元,一臺礦機的成本均價在一到兩萬元,礦場的礦機總成本是5000萬到1億元,即使算上電費等,一年起碼有兩億的利潤。

在充分的市場競爭下,出現這種暴利的可能性很低。所以,不是記者搞錯了,就是被採訪對象吹牛不打草稿。由於比特幣的價格和全網算力的波動很大,所以投資比特幣礦場很難做長期預測,不確定因素太多。

根據我們前面掌握的比特幣知識,50個比特幣,相當於找到了4個奧數,搶到了4次記賬權。目前,整個比特幣網絡的所有礦機,加起來的總算力能達到的水平,大約平均每10分鐘可以找到一個奧數,也就意味着平均每10分鐘生成一個新的區塊。當然,這個10分鐘是平均數,快一點的話三四分鐘生成一個區塊,慢一點的話15分鐘左右。

正因爲奧數太難找,每個區塊平均要10分鐘才能生成一個,所以就能基本解決本節開頭提出的第一個問題“如何同步賬本”,只要有個三四分鐘的時間,足以讓所有在線的電腦同步到這個區塊了,那些不在線的電腦或者第一次運行客戶端的電腦,上線以後必須先做一件事情,就是從相鄰的節點上獲取最新的賬本。

請注意,我用了“基本解決”這個詞,也就意味着,並沒有完全解決“賬本同步”的問題。這是因爲總會有極小的概率兩臺礦機恰好同時(只要在網絡上所有在線的節點沒有完成區塊鏈同步之前都可以算同時)找到奧數,也就意味着同時搶到了記賬權。因爲礦機實在太多了,這樣的小概率事件時不時也會發生一次,同時搶到記賬權的礦機都能將自己生成的新區塊廣播到比特幣網絡中。

遇到這種情況,比特幣系統怎麼處理呢?

在這種情況下,相當於網絡上的其他節點收到了兩個合法的新區塊,因爲網絡節點的地域分佈不同,所以,不同的節點收到這兩個新區塊的先後次序就會不同。此時,所有的節點會暫時保留兩個新區塊,並且把區塊鏈做一個臨時的分叉,如下圖所示:
在這裏插入圖片描述
接下來,比特幣網絡中必然又會有其中一個節點(礦機)搶到了記賬權,這時該節點就會將生成的最新區塊接到其中的一個分支上,那到底是接到新區塊1,還是新區塊2上呢?系統規則是:這個節點先收到哪個區塊,就接到哪個區塊上,同時放棄另一個區塊,然後全網廣播 ,如下圖所示:
在這裏插入圖片描述
比特幣網絡上的所有節點在收到最新的區塊鏈後,只要發現其中一個分支比另外一個分支多兩個區塊了,就立即也放棄那個短的分支。總之,比特幣網絡永遠只承認更長的那條分支。

你可能會想,那如果小概率事件再次發生,在區塊鏈第一次分叉後,又是同時產生了兩個新區塊,而恰好兩個新區塊產生在兩個不同的分支上,這時候,其他節點收到的區塊鏈還是兩個一樣長的分支,那怎麼辦?很好辦,還是同樣的規則,只要分支一樣長就暫時保留,直到出現兩個分支不一樣長時,就放棄短於兩個區塊的,保留長的。那個被放棄的分支中所有交易和比特幣獎勵都會被判定爲無效。

因爲有了這個臨時分叉的規則,所以,比特幣玩家在完成一筆交易後,不能立即認爲這筆交易是成功的,有可能會被取消,必須等到一定數量的新區塊生成後,如果交易依然沒有被取消,這才能放心地認爲交易成功了。那到底要等到多少個新區塊產生才能放心呢?

按照概率來說的話,小額交易有三個新區塊產生就夠了,但是大額交易的話,爲了更保險,一般認爲等到六個新區塊產生,就足以放心了。前面說過,每個區塊產生的平均時間是10分鐘,也就意味着,一筆大額交易需要一個小時左右才能確認交易成功。

但是小額交易確認的時間往往會更長,甚至長達好幾天。聽到這個你可能會有點兒糊塗,剛纔不是還說小額交易一般只要三個新區塊產生就夠了嗎?怎麼確認時間反而會更長呢?比特幣網絡剛剛誕生的頭幾年,確實不會出現這樣的怪事,但是這幾年隨着交易量的猛增,就會出現這種怪事了。爲什麼?先回憶一下每個區塊的規則:

前一個區塊的數字指紋
+
固定信息
+
收到的交易記錄
+
奧數

你的交易記錄要被寫到區塊鏈上,有一個前提:礦工將你的這筆交易記錄打包到這個區塊上。你可能想問:爲什麼會不打包?難道系統規則還允許不打包嗎?打包成功了不是還要給礦工交稅嗎?礦工好不容易搶到一次記賬權,怎麼會有錢不賺呢?

是的,允許不打包。原因不是礦工不想賺錢,而是“不可抗力”,關鍵問題是每一個區塊允許存儲的數據量有限。中本聰當初設計比特幣系統時,規定了每一個區塊最大隻能是1MB,一條交易記錄大概是0.25KB,那麼一個區塊最多可以儲存4000多條交易記錄,如果在一個新區塊產生的時段中,發生的交易請求超過4000條,那就肯定存不下了。

我們可以算算,這個量大概是一個怎樣的交易頻率,每個區塊的平均產生時間是10分鐘,也就意味着,平均每秒鐘的交易量如果超過7條,那麼就一定會出現排隊等待打包的交易記錄了。這個交易頻率實在很低,要知道支付寶一秒鐘大約要處理上萬筆交易。這一秒鐘七筆交易對於全球來說,實在是太不夠用了。

一般來說,大額交易優先打包,小額交易中手續費越高的交易越優先打包,打包規則礦工有一定的自主權。比特幣交易手續費的規則比較複雜,不同的礦工收的還不一樣,不是三言兩語能說清,但有一點可能會讓你感到詫異,越是大額的交易反而收費越低,甚至免費。交易額越小反而費率越高。這是因爲,交易手續費除了鼓勵礦工挖礦,還有一個非常重要的功能,就是防止有人惡意發佈大量的小額交易造成信息擁堵。

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

到這裏,有關區塊鏈的核心原理就講完了,關鍵要記住,中本聰利用區塊鏈技術,巧妙地解決了賬本同步和信息不重複的問題,這就使得去中心化賬本的理想最終得以實現。

學習知識,我認爲最佳的方式就是帶着問題學習,在學習過程中,先掌握知識的主幹,如果還有興趣,再去了解那些枝枝杈杈。以上三節,第一節是讓你帶上問題,第二、三節就是比特幣和區塊鏈知識的主幹,如果你消化完畢,可以繼續閱讀下一節,瞭解一些枝杈。

四、關於比特幣的知識點

如何保證比特幣的產出速度大致恆定?

比特幣的產出速度本質上就是尋找奧數的速度,現在的奧數是要求前72位全部爲零,如果把72改爲73,那麼尋找奧數的難度就立即翻一倍,同理,如果從72減爲71,則難度減半。因此,系統只需要根據全網的平均算力來調節奧數的規則就可以很簡單地做到。現在的規則是平均每產生2016個新區塊後,根據產生這些新區塊的平均算力調節一次難度。我們也注意到,這種調節較爲粗糙,只能翻倍或者減半。

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

這個總量上限是人爲規定的。中本聰設計的規則是這樣:每增加21萬個區塊後,幣獎勵就減半,獎勵的初始值是50比特幣,所以北京時間2009年1月4日中本聰自己創建的第一個創世區塊,就獎勵給了自己50比特幣。按照平均10分鐘一個區塊的產出速度,大約是每隔四年會減半一次。

第一次減半發生在北京時間2012年11月29日7點24分,第21萬個區塊誕生,比特幣獎勵減少爲25個。北京時間2016年7月10日凌晨0點46分,第42萬個區塊誕生,這次相隔時間大約是三年零七個月,比特幣獎勵再次減半,成爲現在的12.5個。

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

中本聰爲什麼要人爲規定一個總量上限呢?因爲他的理想是創造一種不能濫發的貨幣,從而在理論上徹底阻斷通貨惡性膨脹。至於這種理想能不能因爲規定了上限而實現,是一個經濟學問題,我沒有能力多談,只知道在經濟學中,通貨膨脹和通貨緊縮同樣都是可怕的。

你可能馬上又想到一個問題:如果不再獎勵比特幣了,誰還去挖礦呢?別忘了,還有交易手續費的獎勵,比特幣獎勵雖然在不斷減少,但是交易手續費的獎勵是在不斷增加的,還是會有人願意挖礦。並且,挖礦的難度也是可以動態調整的,總是能調整到一個相對平衡的狀態。

五、區塊鏈技術的未來前景

在這裏插入圖片描述

比特幣的未來前景不是筆者想要討論的。我在前文中一再強調,比特幣只不過是區塊鏈“去中心化理念”的一個具體應用,有些先天不足,只能說是一個優秀的應用,還談不上是成功的應用。最終能否成功,實在不好說。
在這裏插入圖片描述
截至2018年2月27日,全球接受比特幣結賬的商家分佈圖。一共是11888家,主要分佈在北美和歐洲。數據來源:

https://coinmap.org/#/world/16.46769475/14.06250000/3/

從宏觀上來看,目前主要還是投資品屬性,承認貨幣屬性的國家僅有澳大利亞和瑞典。

但區塊鏈的未來無疑是光明的,這是下一場互聯網理念的革新。區塊鏈技術還可以應用到日常生活的哪些場景呢?我們不妨暢想一下,例如:

  • 自動駕駛+區塊鏈,可以成爲滴滴公司的夢魘。

  • 基於區塊鏈技術,開發出一種“智能合約”,這也是區塊鏈技術未來最大的應用前景之一。所謂智能合約就是不需要中間商,就能保證合約可以被自動完成,不怕違約。合約的支付方式是數字貨幣,合約生效的條件和執行全部智能化。

比如我買一輛車,這輛車從工廠自動開到我家,我用指紋或者刷臉開車,合約自動執行,數字貨幣支付給汽車廠,這纔是真正的“沒有中間商掙差價”。有了自動駕駛和智能合約,還需要滴滴打車嗎?不需要了,汽車和客戶完全可以通過基於區塊鏈技術的軟件自動匹配。

未來,區塊鏈技術很可能在人類社會的各個領域扮演舉足輕重的角色,以下是《環球科學》2018年2月號提到的應用場景:

  • 金融機構:全球銀行和投資機構正在研究、推動區塊鏈項目。自從2012年成立以來,處理銀行間國際交易的區塊鏈系統瑞波(Ripple)一直髮展良好。像Bloom這樣的初創公司打算將區塊鏈用於信用報告,希望杜絕類似艾可飛(Equifax,美國徵信機構)那樣因遭遇黑客入侵而導致數據泄露的事件。

  • 政府:美國特拉華州和伊利諾斯州用分佈式賬本發放出生證明,而佛蒙特州的一項法律允許使用區塊鏈技術驗證法律文件的真實性。迪拜將區塊鏈整合到多項行政服務中,如發放許可證。2016年,突尼斯開始通過區塊鏈發行一種叫作eDinar的電子法定貨幣。

  • 科技創業者:以太坊網絡就像是一個爲區塊鏈初創公司設立的應用商店,它的目的是支持新的應用程序,不像比特幣僅僅是一種電子現金生態系統。現在,有數百個項目和企業在這個網絡上運行。其中有個著名的項目叫作 WePower,它致力於讓住戶能夠直接互相買賣可再生能源(比如屋頂式太陽能電池板產生的電能)。

  • 版權所有者與知識產權所有者:英國音樂人伊莫珍·希普(Imogen Heap)創立了Mycelia科技孵化器,追蹤與創意作品有關的元數據,省去了iTunes這樣的中間商。

  • 非營利組織和援助組織:點滴捐贈基金會(BitGive Foundation)正在用區塊鏈技術加強慈善捐贈問責。聯合國世界糧食計劃署正在用區塊鏈技術精簡對約旦、敘利亞難民提供援助的追蹤和交付過程。

  • 學術機構:別想着紙質文憑了,區塊證書(blockcert)項目希望提高各種學位證書和職業認證的可信度和共享性。

  • 資產管理公司:總部位於倫敦的區塊鏈公司常青賬本(Everledger)瞄準鑽石行業,用區塊鏈記錄每顆鑽石的屬性和出處。名酒和藝術品也可以被追蹤。

  • 新聞工作者:爲打擊假新聞,Civil(去中心化新聞市場)爲新聞工作者提供了一個創造不含廣告、不可更改的新聞平臺,這些新聞不受外部利益(如俄羅斯、臉書)的影響,並且受到讀者的支持。

  • 普通人羣:對於向家裏寄錢的移民打工者,使用比特幣匯款的費用比使用西聯匯款要低。正是由於這個原因,現在韓國和菲律賓之間的國際匯款粗略估計有20%依賴於比特幣。

根據普華永道預測,到2020年,77%的全球金融服務業將採用區塊鏈作爲生產系統或流程的一部分。

根據世界經濟論壇2015年的一項調查報告,預計到2025年,世界GDP的10%將會以基於區塊鏈的技術存儲。

六、結語

1973年,原本隸屬於美國軍方的計算機網絡阿帕網向世界開放,從此,國際互聯網誕生,今天,它是人類社會的血管。

1991年,第一個網頁在歐洲核子研究中心誕生,這是互聯網生活的創世時刻,今天,已經很難找到不受它影響的人和單位。

2008年11月1日,中本聰發表論文《比特幣:一種點對點的電子現金系統》(Bitcoin: A Peer-to-Peer Electronic Cash System),區塊鏈技術(理念)宣告誕生。2008年會不會成爲人類歷史上與1973年和1991年同樣重要的年份,現在還無法下定論,但可能性非常大。

沒有人可以準確地預測未來,謹希望本文能爲今天的戰略家、企業家、學子們提供一點小小的參考和啓發。

(本文特別感謝馮大輝先生的審校。)

本文原刊《讀庫1802》,此處限於篇幅有所刪節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章