(點選上方公眾號,可快速關註)
來源: 來自 ChenJunXuan 的投稿
mp.weixin.qq.com/s/JEkjYdvRw2x3PzxKDR7FQQ
區塊鏈就是比特幣世界這個村子的賬本,誰挖到礦,誰就有權在這個賬本翻開新的一頁,併在新的一頁記下“X年X日,本村某某挖礦得到比特幣一枚,並得到獎勵的手續費若干”。
比特幣又火了。為什麼要說又呢?因為比特幣在 2013 年已經火過一次了。這次與 2013 年相同的是,比特幣的價格一路飆升,讓人咂舌。與 2013 年不同的是,這次人們不僅僅關註比特幣的價格,也開始關註比特幣背後的技術——區塊鏈。
一夜之間,區塊鏈從舞臺背後站到了聚光燈下,成為了人們追捧的熱點。物流、醫葯、版權…好像哪都可以憑藉區塊鏈脫胎換骨。那麼,這麼神奇的技術,到底是怎麼回事?
本文就以最通俗的語言,不涉及任何高等數學和計算機知識,來介紹一下比特幣和區塊鏈系統。
說到區塊鏈就不得不說比特幣,比特幣是區塊鏈技術最好的載體,所以本文就以比特幣為例來介紹區塊鏈。
比特幣很牛,牛在兩個特點:去中心化、電子貨幣。
別小瞧這兩點,這兩點同時存在可不是一件容易事兒。
首先來說說去中心化,通常去中心化的貨幣一般都要追溯到很久以前了,遠古時代人們自發地使用貝殼、石子做為雛形貨幣進行交易,這時候的貨幣可以看作是去中心化的貨幣——無需中央銀行來組織發行、確認交易合法性。
但是使用這類貨幣的弊端也不必我多說,貨幣供給不穩定,取決於每年的貝類產量;貨幣質量不一,有的大有的小,有的是花蛤有的是文蛤;交易很繁瑣,大宗交易動不動就要好幾車的貝殼,這麼多貨幣運來運去還容易被搶劫。
於是貨幣進化,信用貨幣時代到來,貨幣成了銀行賬戶裡的數字,上面的問題都解決了,但是我們必須需要銀行來控制貨幣的發行、防偽,來進行交易結算,我們的財產權全掌握在了銀行的手中。銀行喜歡動不動搞點QE放點水,我們銀行卡裡的錢越來越貶值。
這時候,我們就希望能有一種貨幣,既能像使用貝殼一樣無需銀行插手,又能符合當前資訊時代對貨幣功能的需求。於是,集這兩種特點於一身的比特幣誕生了。
比特幣的基本原理
做為一種貨幣,通常就要滿足幾個特點:得有人發行它,得能持有它,人與人之間可以互相交換它。
持有
持有比特幣非常簡單,只要有一個收款地址,就可以持有比特幣並接受比特幣。所持有的比特幣數量只是這個地址下的一個數字。
有人會問,這不跟銀行賬戶一樣麼,確實很像,但實質又很不一樣。銀行系統是一個中心化的系統,賬戶的餘額是由銀行說了算的,哪天銀行系統出錯餘額變成0,那你就真的從ATM機裡取不出錢。
比特幣不使用這種權威的中心機構,又需要一個穩定的記賬系統,所以解決辦法是每一個“礦工”都把比特幣世界發生過的所有交易記錄存在自己的硬碟上。有了全部的交易記錄,推算每個人有多少餘額也就很容易了。這個被儲存在所有人電腦裡的交易記錄,學名就是區塊鏈。駭客可以黑掉一些人儲存的區塊鏈,但是他做不到黑掉全世界大部分人,只要有大部分仍儲存著正確的區塊鏈,那麼整個系統就可以透過糾錯重新恢復正常。
就像打麻將時,我們有時候用記賬方式來記錄每回合的應收應付,比特幣世界也透過記賬來交易,每發生一筆交易都會公之於眾,然後大家把這筆交易記錄在自己的小賬本上,這樣每家有多少錢,大家在自己的小賬本上都能查清楚。只不過當記賬由4個人變成全比特幣世界的村民時,這就需要一個稍微複雜點的系統了。
發行
再來看看發行。我們先看紙幣是怎麼發行的,很簡單,央行開動印刷機,一瞬間出現大把“毛爺爺”。而做為一種去中心化的電子貨幣,比特幣是沒有央行的,那怎麼發行呢?
比特幣規定,人們可以去解答一個困難的問題,誰最先答出來,誰就可以發行一塊比特幣,也就是我們所謂的“挖礦”。
這個困難的問題是什麼呢?是雜湊(hashing)的問題。雜湊是一個函式F,對輸入X進行一些運算來得到雜湊值Y。就是咱們高中學過的Y = F(X)。比特幣讓你解答的問題就是,告訴你雜湊值Y和F,求X。
這時候你會說了,這不就是個反函式的事麼。抱歉,雜湊函式這個函式比較特殊,找不到合適的反函式,要想求出X,唯一的方法就是一個一個數來試,把每一個數都代入到F裡,看看結果是不是Y,如果恰好蒙對了,那也就把這個問題解答出來了。
所以說所謂的貨幣發行、挖礦,實際上就是一幫人在用最好的計算機來撞大運蒙這個數。當一名礦工蒙對X後,也就是挖到礦後,他就獲得了在原有的區塊鏈末端創造一個新的交易區塊的權利,在這個新建立的交易區塊上,這位礦工可以附帶一個由比特幣世界作為付款人,收款人是任何人交易,這樣,他就透過這個交易,創造併發行了一枚比特幣。
區塊鏈就是由一串交易區塊組成的。我們來看看交易區塊上包含什麼。
一個交易區塊會顯示誰是它的父區塊,包含本區塊上的交易記錄,以及本區塊的雜湊值。
這樣,隨著礦工們不斷挖礦建立新的交易區塊,一個接一個的區塊就串成了一串,成為了名副其實的區塊鏈!在比特幣世界中,由於某些原因,區塊鏈會發生分叉(為什麼會分叉下文會提到),因而比特幣世界規定:唯一合法的區塊鏈是當前最長的區塊鏈。
區塊鏈就是比特幣世界這個村子的賬本,誰挖到礦,誰就有權在這個賬本翻開新的一頁,併在新的一頁記下“X年X日,本村某某挖礦得到比特幣一枚,並得到獎勵的手續費若干”。這個賬本很特殊,並不是由村支書管理,而是所有的村民人手一本,誰挖到礦以後,都可以自己翻頁記賬,並讓全村人按照同樣的方式做,以保證全村所有人的賬本一致。當全村人的賬本出現不一致時,規定誰家的賬本最長就聽誰的。
發行
比特幣的關鍵點在於交易。對於一個去中心化的電子貨幣系統,交易是很有風險的。想象一下,你和另一個人的電子貨幣交易就類似於打欠條,而且這個欠條沒有第三方公證人。如果其中一方突然翻臉,欠條的有效性是很難保障的。
由於不能使用類似銀行結算中心的第三方公證人(使用了就是中心化系統了),所以比特幣乾脆就讓全世界人做為公證人。
所有比特幣的交易都不能偷偷摸摸進行,都需要將這筆交易透過網際網路廣播到全世界。如果C想給B 0.5個比特幣,會向全世界廣播“C給了B 0.5個比特幣!”,這時所有挖礦的礦工們,會把這條交易記錄加到他們正在挖的這個交易區塊中。
他們為什麼要加呢?因為當礦工挖出礦時,除了規定獎勵的一枚比特幣外,每加多一條交易記錄,還會額外再多給一點點手續費。蚊子肉也是肉,辛勤的礦工們沒有不喜歡的。
在把交易記錄加到區塊的過程中,礦工們首先會驗證一下這筆交易合不合法,也就是查查村裡的賬本,當C名下貨幣不足0.5個時,這條交易記錄就會被拒絕加入到區塊中。
加入到區塊中並不代表交易已經成功,只有當包含這個交易記錄的區塊的隨機數X被某位礦工發現,並創造了新的交易區塊連結在當前區塊後,才能被認為是合法交易,這條交易記錄也就成為被驗證的交易。
B可能會問了,那也就是說C發了給我錢的廣播後,我還不能馬上確定我是不是收到錢了啊?
沒錯,C發廣播,只相當於C站在村口朝全村人喊了一句 “我給B 五毛錢!”,只有當全村的人都聽見,把這件事都記在了個自賬本上,並且記下這件事的那頁被礦工翻過去以後,B的戶頭上多了五毛錢這件事才真正得到了全村村民的認可。由於參與比特幣挖礦的礦工眾多,通常每筆交易所需的驗證時間是非常短的,不會給交易帶來延遲感。
由此比特幣的發行和交易首尾相連扣在了一起。交易透過釋出廣播的形式進行,礦工們聽到廣播後把交易寫在交易區塊中;礦工們透過挖礦來確認歷史交易的完成,並由此建立新的區塊,延長區塊鏈,發行新的比特幣。
區塊鏈的分叉
之前提到了區塊鏈的分叉。為什麼區塊鏈會發生分叉呢?原因就在於去中心化。
沒有中心,大家都各自維護賬本,因此受困於網路的延時、交流的不充分,難免有出現分歧的時候。
舉兩個例子,一個是在挖礦時容易出現的問題:礦工B蒙對了隨機數,挖礦成功,延長了區塊鏈,註意,此時礦工B延長的區塊鏈僅僅是自己的,其他人還都不知道這件事。當然,礦工B馬上向全世界釋出挖礦成功的訊息,讓大家按照他的方式延長區塊鏈。
但是這時,另一位礦工C也蒙對了隨機數,他或者因為網速延遲還沒聽到B的廣播,或者聽到廣播但不甘心,存心想破壞規則,於是他也把自己的區塊鏈延長了,並開始向全世界發廣播。
因為網速的延遲,並不是所有人都先聽到B的廣播,此時就會出現一部分人按照B的指示更新區塊鏈,一部分人按照C的指示更新區塊鏈,而且因為網速的延遲,大家沒辦法確定到底是B還是C先釋出的廣播,從而引起區塊鏈分叉。
就好比村裡兩位礦工B和C分別住在村東和村西,B和C差不多在同一時間挖礦成功,把自家賬本翻頁,在新的一頁寫下屬於自己的宣言“X年X月,本村B(C)挖礦得到比特幣一枚”,並開始向全村大喊讓全村人翻頁並寫下這句話。由於他們分別住在村子的兩頭,結果村東頭的人先聽到B大喊於是按找B的話記賬,村西頭的人先聽到C大喊於是按照C的話記賬,導致全村的賬本此時出現了兩個版本。
第二種情況是雙重交易,B與C進行交易,釋出廣播宣佈付給C一枚比特幣,但是B同時還跟D勾搭,幾乎同時又釋出廣播宣佈付給D一枚比特幣,更糟糕的是,B宣佈付出的是同一枚。
跟第一種情況一樣,由於網速問題,一部分礦工先聽到B與C交易的廣播,並將這條交易記錄計入到當前交易區塊中,後聽到B與D的交易,並判定不合法,拒不新增到交易區塊。而另一部分礦工正相反,只把B與D的交易新增到交易區塊中。
這兩種情況並不是罕見的,由於比特幣世界由全世界各地的人參與,有的地區用的是100M光寬頻,有的地方用的是56K撥號上網,網速千差萬別,而且又有很多人心懷不軌,存心作惡,因此區塊鏈分叉幾乎時時刻刻都在發生。此時,比特幣世界的最高原則就起作用了:唯一合法的區塊鏈是當前最長的區塊鏈。
可是就上面兩種分叉的情況來看,此時分叉的兩個區塊鏈一樣長啊?沒關係,這兩條都合法,也都不合法,咱們擱置爭議,繼續開挖,看誰挖得快,誰先再蒙對新的X,讓自己的區塊鏈再進一步,誰的區塊鏈就變成最長,也就成了唯一合法的了。這麼一聽,怎麼感覺這個區塊鏈系統這麼隨意,有些不靠譜的樣子啊,如果大家都不守規則,隨意分叉,世界豈不亂套。
別急,接下來咱們透過分析會發現,最終區塊鏈肯定會恢覆成穩定的一條。
讓我們回到第一個情況礦工B和礦工C分歧問題中,假設B的鏈條再進一步,成為了最長鏈條,這條鏈條也就成為比特幣世界認定的合法鏈條。此時C有兩個選擇,一是放棄努力,乖乖的扔掉自己的區塊鏈,使用B的。另一種選擇是不甘心失敗,扔堅持自己的區塊鏈,希望自己能很快繼續追平B並反超。
選擇前者是大家都開心的,比特幣世界的區塊鏈從此統一,選擇後者實際上繼續讓區塊鏈保持分叉狀態。那麼從理性角度,C應該如何做呢?實際上C此時應該果斷放棄自己的鏈條。
我們可以分析一下,當B和C的鏈條分叉時,此時比特幣世界存在4種礦工、兩種勢力,B和擁護B的吃瓜礦工,C和擁護C的吃瓜礦工。此時B勢力與C勢力大體相當,所以大家各挖各的。
當B勢力先一步延長了B的鏈條後,此時C勢力就會發生分化,絕大部分擁護C的吃瓜群眾只要聽到B鏈條延長的訊息,馬上會轉投到B鏈條上,因為此時B鏈條更長,在更長的鏈條上繼續挖礦顯然更有前途。勢力馬上發生逆轉,C會尷尬地發現,全世界都在與他為敵(哭)。所以C不得不放棄。
當然,假設是C的勢力先延長了區塊鏈,那麼情形正好相反,全世界的礦工都會馬上投入C的懷抱。儘管可能確實是B先挖到的礦,但此時B也不得不選擇放棄自己的那條已經無人問津的區塊鏈。按照這種理性的假設,全世界大部分礦工都會安分守己的選擇在最長的鏈條上工作,所以偶爾的分叉也不是什麼大不了的事。
當然仍存在一種極端情況,即B或C一個人的算力超過全世界算力的50%,這時候他們憑藉一己之力就有可能反超。但是事實上,由於全世界都在參與,很難有人或組織有這麼強的算力,其次即使C有這麼強的算力,他老老實實地在最長鏈條上挖礦就好了,也沒必要硬剛全世界,非要顯示霸權只會讓全世界都不陪他玩了,最後比特幣失去價值,C損失更大。
上面所說的第二種分叉情況的解決辦法與第一種情況同理,堅持“唯一合法的區塊鏈是當前最長的區塊鏈”原則不動搖,最終合法的一條區塊鏈只會記錄B與C交易或B與D交易的其中一個,具體原因讀者可以自己想一想。
講了這麼多,大家可以發現,比特幣憑藉區塊鏈的巧妙設計,使得交易與發行以一種非常穩定的狀態進行,而保持穩定的核心力量是什麼呢?就是無數礦工提供的算力。
只要礦工夠多,算力夠大,驗證速度夠快,比特幣的交易就可以快速地被驗證,不小心出現的區塊鏈分叉狀態可以很快結束,保證整個系統穩定執行。所以挖礦可不光只是費電,這些電能實際上轉化成為維持整個系統穩定的能量!
這也告訴我們為什麼比特幣可以一個幣價值數萬,而有些新發行的各種幣一文不值,因為比特幣做為歷史最長、受眾最廣的電子貨幣,也擁有數量最多、分佈最廣泛的礦工和算力,是最穩定的電子貨幣。
而新發行的貨幣礦工數量很少,參與的算力低,根本起不到穩定整個系統的作用,算力低也意味著每筆交易的驗證時間會變長,從而降低貨幣的可用性,所以這樣的新興貨幣一文不值。
好了,關於比特幣以及比特幣系統所用到的區塊鏈技術就介紹到這裡,如有大牛對文中內容有異議,歡迎拍磚探討!
參考文獻:
Satoshi《Bitcoin: A Peer-to-Peer Electronic Cash System》
關於作者:
ChenJunXuan / CC,17 年碩士畢業於上海交大,目前在阿裡達摩院做計算機視覺方向/智慧醫學影像相關的演演算法開發,喜歡 Python。
覺得本文有幫助?請分享給更多人
關註「演演算法愛好者」,修煉程式設計內功