不裝逼的比特幣,區(qū)塊鏈入門

幾個月前,一個教分布式系統(tǒng)的教授開玩笑地跟我說,現(xiàn)在風口都是AI了,啥時候輪得上計算機系統(tǒng)?現(xiàn)在看來,這個風口真的來了, 還來得很猛烈,可惜的是大家關(guān)注的并不是分布式系統(tǒng)。比特幣瘋漲,區(qū)塊鏈大熱,各種加密貨幣ICO(Initial Coin Offering)層出不窮,新聞媒體爭相報道,各界人士跳出來說區(qū)塊鏈將塑造未來,潛力無限。事實上不少人都在霧里看花,所以我想嘗試一下用簡單易懂的方法幫大家扒開這一層霧。我并不是專家,如有出錯和不準確的地方,歡迎指出和討論。

Let’s make bitcoins and blockchain uncool again!

比特幣,區(qū)塊鏈概論


簡單來說,比特幣是一種去中心化(decentralized)的加密貨幣(cryptocurrency),區(qū)塊鏈是一個分布式(理論上完全的P2P)數(shù)據(jù)庫。?比特幣通過區(qū)塊鏈這一技術(shù)來實現(xiàn)“去中心化”和解決“雙重支付問題 (double-spending problem)”。比特幣是2008年由一個署名為中本聰(Satoshi Nakamoto)的人提出(Bitcoin: A Peer-to-Peer Electronic Cash System),其構(gòu)想是一個完全去中心化,不需要權(quán)威/第三方參與,用戶對用戶的電子貨幣。

比特幣的實現(xiàn)主要由兩個部分組成:

數(shù)字簽名(Digital Signature): 加密支付

區(qū)塊鏈(Blockchain): 記載交易順序,建立整個P2P網(wǎng)絡(luò)的連貫性(consistency)和一致性(consensus)

數(shù)字簽名,加密支付


想象一下,如果小明現(xiàn)在想支付小芳2個幣,于是他寫了“小明 支付 小芳 2幣”,同理, 如果A想向B支付N個幣,A可以寫“A 支付 B N幣”。那問題就來了,如果小明非常不老實,他可以隨意冒名寫“小芳 支付 小明 20幣”。如何來保證支付的可靠性呢?

比特幣或者其他加密貨幣通過數(shù)字簽名來加密支付。?當用戶加入比特幣生態(tài)系統(tǒng)的時候,每個用戶會得到一個比特幣地址(Bitcoin Address)和比特幣錢包(Bitcoin Wallet),錢包里其實是一對密鑰(a pair of keys), 包括公鑰和私鑰(public & private key),私鑰用來生成數(shù)字簽名,和公鑰一起使用進行不對稱加密。?簡單來說, 不對稱加密能夠保證小明的比特幣只有小明本人(本質(zhì)上是擁有小明私鑰的人)能拿來進行支付。所以,與其說小明的比特幣,不如說小明私鑰的比特幣,這也是為什么比特幣是匿名的原因之一。

另外一個原因是比特幣網(wǎng)絡(luò)的用戶是由比特幣地址組成的,也就是說當你要支付的時候,比特幣網(wǎng)絡(luò)記錄的是“[某個比特幣地址] 支付 [某個比特幣地址]”,而不是直接記錄“某某 支付 某某”。地址的擁有者是由其私鑰證明的。

所以,保護好自己的私鑰非常重要。事實上,私鑰是可能因為各種原因(電腦廢了,內(nèi)存丟了等等)而消失的,當私鑰消失的時候,所對應(yīng)的比特幣再也不可能被找到了。

區(qū)塊鏈,記載交易順序


好了,現(xiàn)在我們通過不對稱加密保證了支付的可靠性,也就是說現(xiàn)在不論小明有多少壞水,他都不能冒名小芳寫“小芳 支付 小明 20幣”。小明轉(zhuǎn)念一想,雖然他不能偽造支付,但他可以雙重支付他所擁有的幣。比如,小明寫了“小明 支付 小芳 1幣”, 小明又寫了“小明 支付 小李 1幣”,但事實上小明身上總共也就只有1個幣。如何防止像這樣的“雙重支付問題”的發(fā)生?

在中心化貨幣(比如實體貨幣,又或者是Q幣)的世界里,權(quán)威第三方(比如銀行,騰訊的數(shù)據(jù)庫)能夠確認支付者有足夠的支付數(shù)量,因為第三方記錄了整個交易系統(tǒng)的交易,也包括了交易順序。

難道我們也要引入權(quán)威第三方嗎?那“去中心化”的構(gòu)想就毫無意義了。我們需要一個系統(tǒng),這個系統(tǒng)里的每一個參與者要同意一個唯一正確的交易歷史,包括交易順序。?簡單來說,每個參與者(其實不是每個節(jié)點,而是網(wǎng)絡(luò)里的礦工,下文會解釋)都會記錄整個網(wǎng)絡(luò)的交易歷史,交易順序,而這個交易記錄是一致唯一的(consistency & consensus)。

這個系統(tǒng)/網(wǎng)絡(luò)是什么呢?它就是現(xiàn)在被吹得神乎其神,“將要改變每個行業(yè)”的區(qū)塊鏈(block chains)。

從技術(shù)上講,其實區(qū)塊鏈就是一個“高容忍拜占庭失敗”(high tolerance of Byzantine failures)的P2P網(wǎng)絡(luò)(Peer-to-Peer network),這個網(wǎng)絡(luò)里的Peer(其實就是礦工,下文會詳細解釋挖礦和礦工)儲存著整個網(wǎng)絡(luò)唯一的交易歷史。

P2P網(wǎng)絡(luò)是分布式系統(tǒng)的一種。分布式系統(tǒng)又是啥?舉個例子,Snapchat的用戶那么多,一個電腦/服務(wù)器能儲存的數(shù)據(jù)是有限的,而且肯定不夠啊,那咋辦呢?一個電腦不夠,千千萬萬個電腦總夠了吧(其實可能也不夠,這里只是舉個例子)?這千千萬萬個電腦,通過網(wǎng)絡(luò)交流彼此的數(shù)據(jù),就形成了分布式系統(tǒng)(distributed system)。P2P網(wǎng)絡(luò),通俗一點來說就是網(wǎng)絡(luò)里的每一個用戶是對等的,享有同樣的權(quán)利和義務(wù)(現(xiàn)實中完全的去中心化的P2P網(wǎng)絡(luò)幾乎不可能存在)?!鞍菡纪ナ 保唵蝸碚f就是網(wǎng)絡(luò)里的用戶偏離了自己規(guī)定的表現(xiàn),比如宕機,叛變,不誠實?!案呷萑贪菡纪ナ 睂Ρ忍貛藕苤匾驗槿萑绦灾苯記Q定了整個區(qū)塊鏈網(wǎng)絡(luò)的穩(wěn)定和可靠性。

像這樣的P2P網(wǎng)絡(luò)并不是什么新科技,高容忍的P2P網(wǎng)絡(luò)不少(比如像Raft),?比特幣最大的發(fā)明在于新的確定的比特幣交易是由挖礦(bitcoin mining)記錄的。

如果你已經(jīng)被上面大堆的術(shù)語繞暈了,沒關(guān)系,不影響理解。下面讓我們來詳細看一下區(qū)塊鏈,看完之后你就會發(fā)現(xiàn)這玩意兒理解起來并不復(fù)雜:

Hash

要理解區(qū)塊鏈,首先要弄懂一個概念叫Hash。Hash這里指的是Cryptographic Hash。簡單來說,Hash將輸入變成長度定量的二進制數(shù)字。?比如,輸入“小明 支付 小芳 2幣”,輸出hash是“01000010….00”。只要兩個輸入不一樣,輸出Hash就不會一樣。?Hash還有一個特性是計算輸出Hash容易,由輸出Hash反推輸入字符串幾乎不可能。?挖礦也和Cryptographic Hash息息相關(guān),下文會解釋。比特幣挖礦使用的是double SHA-256。

區(qū)塊

區(qū)塊鏈(block chains)的最基本單元是區(qū)塊(block)。?每一個區(qū)塊由區(qū)塊頭(block header)和區(qū)塊體(block body)組成。

(實際上在中本聰?shù)恼撐闹?,下圖左,并沒有提到區(qū)塊體,這里加以區(qū)分只是為了便于理解。)


區(qū)塊體記錄交易(transactions),區(qū)塊頭記錄了關(guān)于這個區(qū)塊的一些信息,比如區(qū)塊的Hash,上一個區(qū)塊的Hash,Nonce和Root Hash(又叫 Merkle Root)。每個區(qū)塊Hash是不同的,相當于區(qū)塊的身份證號碼。通過保存上一個區(qū)塊的Hash,這個區(qū)塊就可以跟上個區(qū)塊連起來,網(wǎng)絡(luò)里的區(qū)塊連在一起就形成了區(qū)塊鏈。?所以一個樸素不浮夸不裝逼的區(qū)塊鏈示意圖如下:


區(qū)塊Hash是如何計算的呢?請看下面的擬代碼:

RootHash=CryptographicHash(區(qū)塊交易數(shù)據(jù))區(qū)塊Hash=CryptographicHash(區(qū)塊高度,生成時間,上個區(qū)塊Hash,RootHash,Nonce)

嚴格意義上講,root hash的計算不像上面代碼那樣寫得那么簡單,但這樣寫是為了證明Root Hash是依賴于區(qū)塊的交易數(shù)據(jù)的,而區(qū)塊Hash又是依靠于Root Hash的,所以結(jié)論就是區(qū)塊Hash取決于其記錄的交易數(shù)據(jù)。交易數(shù)據(jù)一旦被寫入?yún)^(qū)塊,就不能被更。?因為一旦被更改,區(qū)塊Hash就會隨之改變,為了保持這個被更改的區(qū)塊在整個區(qū)塊鏈中,就要改變這個區(qū)塊之后的所有區(qū)塊。?這就是“牽一發(fā)而動全身”。

看到這里,我們來總結(jié)一下:

1.區(qū)塊鏈的基本單元是區(qū)塊

2.每個區(qū)塊有自己的區(qū)塊頭和區(qū)塊體,區(qū)塊體記錄交易數(shù)據(jù),區(qū)塊頭記錄自己的區(qū)塊Hash和上一個區(qū)塊的Hash

3.區(qū)塊連著區(qū)塊形成了區(qū)塊鏈

4.區(qū)塊鏈中的區(qū)塊不可更改

挖礦:新區(qū)塊的誕生

上面說到用數(shù)字簽名可以保證交易的真實性,但在比特幣網(wǎng)絡(luò)里,確定交易真實性還不夠。一筆交易要成功,這筆交易必須是要被記錄在區(qū)塊里才算確認。?新區(qū)塊的誕生就叫做挖礦(bitcoin mining)。

挖礦的過程是這樣的。礦工們記錄網(wǎng)絡(luò)里的交易,同時也在計算下一個區(qū)塊Hash,下一個區(qū)塊Hash是怎么計算的呢?就是上文提到的擬代碼里那兩個公式。在同一時間,有可能有很多個礦工都在挖礦, 如何決定哪個礦工挖到下一個區(qū)塊呢?比特幣的開發(fā)者決定,當?shù)V工計算的區(qū)塊Hash恰巧達到某個正確數(shù)值的時候,這個區(qū)塊就被成功挖到了,這個區(qū)塊所記錄的交易也就正式被確認。

挖礦的難點: 工作量證明

正確的區(qū)塊Hash需要以“足夠的零”開頭。?比如,下一塊Hash需要3個零開頭,那么礦工計算的區(qū)塊Hash就必須像“000….”這樣的形式。需要開頭的零越多,計算困難就越大,計算量就越大。上面提到的Nonce記錄了這個區(qū)塊嘗試了計算Hash多少次才成功。比如現(xiàn)在的區(qū)塊一般要9億次計算才能有可能挖到礦,當然,嘗試幾萬次也是有可能成功的。挖礦需要很大的計算量,也相當耗時,耗電。計算這個正確的Hash的過程叫“工作量證明 (proof-of-work)”。?因為Hash的特性,“工作量證明”的特點是很難計算出正確結(jié)果,但很容易驗證正確結(jié)果。很多人將這一過程稱為“解難題”,但計算正確的Hash并不需要腦力投入,只是需要電腦不停地計算新的Hash直到猜中。

一旦有礦工挖到了下一個區(qū)塊,這個礦工會告知整個網(wǎng)絡(luò)(broadcast), 整個網(wǎng)絡(luò)都會承認和同步這個新生成的區(qū)塊,?正在計算這個區(qū)塊的其他礦工也不得不放棄進行到一半的計算,投身到計算下一區(qū)塊中。

如果恰巧幾個礦工同時挖到了下一個區(qū)塊,其他礦工會把新的區(qū)塊都保存下來,直到某一個區(qū)塊分支比其他區(qū)塊分支都長,這個時候就承認最長的分支為正式的區(qū)塊鏈。

新區(qū)塊生成時間。?如果網(wǎng)絡(luò)中有越來越多的礦工,或者新區(qū)塊生成速度變快,那么計算到正確Hash的難度就會自動上升。比特幣的開發(fā)者規(guī)定,新的區(qū)塊生成平均需要10分鐘。這個10分鐘規(guī)定有兩個目的:

1.確保網(wǎng)絡(luò)中的其他礦工有足夠時間同步交易記錄,也就是同步區(qū)塊鏈。更新速度太快的話,可能會導致礦工之間的區(qū)塊鏈不同步。

2.確保惡意礦工不能偽造區(qū)塊/區(qū)塊鏈。如果區(qū)塊生成時間太快,惡意礦工可以快速地生成假的區(qū)塊鏈,比其他誠實礦工生成的真實區(qū)塊鏈都長。

防止惡意攻擊。?如何防止惡意攻擊區(qū)塊鏈?舉個例子,現(xiàn)在區(qū)塊鏈網(wǎng)絡(luò)里有4個礦工(小明,小芳,小李,小張),小明正好挖到下一個區(qū)塊,這個區(qū)塊里記錄著一條交易“小明 支付 小芳 20幣”,然后他并沒有告知全網(wǎng)絡(luò),而是只告訴了小芳,這時小芳就會立刻更新自己的區(qū)塊鏈,并接著挖下一個區(qū)塊。所以這個時候,小芳會誤以為“小明 支付 小芳 20幣“這個交易已經(jīng)確認,但其他礦工并不會這么認為。但由于小芳還是會聽到其他礦工的新區(qū)塊通知,小明為了讓小芳繼續(xù)相信自己的假區(qū)塊,就必須比其他礦工更快地挖掘出新的區(qū)塊來維持自己的假區(qū)塊鏈,而這基本不可能,除非小明掌控了整個網(wǎng)絡(luò)中51%以上的計算能力。(這樣的造假實際上是有可能的,請看下文)

潛在的惡意攻擊。?上面提到,除非惡意的礦工掌控了區(qū)塊鏈網(wǎng)絡(luò)中51%以上的計算能力,否則就不可能攻擊整個網(wǎng)絡(luò)。實際操作上,一般來說,只要攻擊者的區(qū)塊分支長度達到6,也就是說惡意攻擊者能趕在其他礦工之前搶先連續(xù)生產(chǎn)6個區(qū)塊,那么他假造的區(qū)塊就成功了。連續(xù)搶先生產(chǎn)6個區(qū)塊是非常非常困難的,但一個叫“BTC Guid”的采礦池(mining pool)就曾成功搶在他人之前連續(xù)生產(chǎn)6個區(qū)塊。?采礦池(mining pool)顧名思義,就是把一堆礦工集合在一起采礦,因為礦工自己一個采礦的計算能力有限。試想一下,如果礦池的計算能力集中了整個網(wǎng)絡(luò)的51%,那這個礦池就完全掌握了比特幣網(wǎng)絡(luò)。

除了上面提到的潛在攻擊,區(qū)塊鏈潛在的安全漏洞,發(fā)現(xiàn)的,沒發(fā)現(xiàn)的,肯定都是存在的。比特幣惡意攻擊事件也是存在的,比如2017年12月7日衛(wèi)報報道的4700多比特幣被盜。

比特幣交易速度。?上面提到,只有被正式寫入?yún)^(qū)塊的交易才能被確認成功。一個區(qū)塊的大小為1M,也就是說最多也只能記載2000多筆交易。每10分鐘才記載2000多筆交易,也就是說比特幣的交易處理速度是3~7筆每秒,跟VISA每秒2萬4千筆交易速度比起來,簡直是弱爆。?不少炒作加密電子貨幣的人說,要是貨幣真的開始跌了,就趕緊拋啊。但買賣電子貨幣的延時可能還挺長的。等你的交易真的被區(qū)塊確認的時候,比特幣的價格可能也不是你當初點擊拋售的那個價格了。

挖礦的獎勵。?為了鼓勵礦工(如果沒有礦工,交易就無法被確認),比特幣的開發(fā)者規(guī)定,新區(qū)塊的生成會獎勵挖礦者一定量的比特幣。2008年開始的時候是50個比特幣,每四年減半,到現(xiàn)在2018年是12.5個比特幣。這樣推算下來,到2140年的時候,全球的比特幣就會停止增長。全球最多會有兩百多萬比特幣。目前20%的比特幣都已經(jīng)被挖出來了。到2140年,新的區(qū)塊還是會生成,但新生成的區(qū)塊不會獎勵礦工新的比特幣了。那礦工還有什么方式可以進行收益嗎?有!礦工可以收取手續(xù)費。因為每一筆交易不會被正式確認直到礦工把這筆交易寫進自己的區(qū)塊里,如果你給礦工的手續(xù)費給少了,那有可能礦工就不會把你的交易寫進去,這樣你的交易被確認就要等很久,直到有礦工把你的交易寫進去。

礦挖的瘋狂。?挖礦的收益算起來還是很可觀的,也正是因為這樣,吸引了非常多的人變身礦工。挖礦其實很簡單,買相應(yīng)的硬件,和下載現(xiàn)成的挖礦軟件就可以進行挖礦。挖礦最大的支出是電費,所以很多礦工甚至跑到了加拿大,瑞士挖礦,因為他們電便宜。偷電(比如特斯拉充電站,建筑工地電源)也屢見不鮮。根據(jù)摩根士丹利預(yù)測,2018年挖礦的用電量將等于2025年全球電動車的總耗電量。有人不禁問,消耗這么多人類資源就是為了拿到電子貨幣,有意思嗎?(作者抱怨一下:挖礦使得GPU價格瘋漲,正兒八經(jīng)玩游戲的人都要買不起GPU了)

對于比特幣/加密貨幣的思考

作者的主觀思考,僅供參考

比特幣和其他加密貨幣到底有沒有可能成為未來的一種世界貨幣??我們可以說一句永遠正確的廢話:萬事皆有可能。如果不說廢話,首先我們得討論是什么令美元成為了世界貨幣?簡單來說,美元能成為世界貨幣是因為美元的背后有美國在撐腰,大家相信美國,美元自然有可信度,有流通性。我們可以拿美元去其他國家直接消費,但如果我們拿柬埔寨的貨幣去其他國家消費呢?所以,成為世界貨幣的條件是可信度,大家信任這個貨幣。那比特幣和其他加密貨幣的可信度怎么樣?從其構(gòu)想來說,比特幣是一個完全去中心化,不需要權(quán)威/第三方參與,用戶對用戶的電子加密貨幣。我們可以從技術(shù)層面的加密和可靠性考慮比特幣和其他加密貨幣的可信度。

貨幣的”去中心化“,”匿名性“就一定是一種優(yōu)勢嗎??我個人認為,比起去中心化的加密匿名貨幣,我更相信有第三方權(quán)威擔保的中心化貨幣。加密貨幣的去心中化和匿名性,從另一方面也意味著,如果貨幣被偷盜,無法負責。舉個例子,如果你的信用卡被盜刷了,你可以向銀行申請refund,但如果加密貨幣被盜刷了,那你就只能認栽了。(或許買個加密貨幣保險?新行業(yè)?) 有人會說,相信國家發(fā)行的貨幣,要是國家倒了怎么辦?比特幣和加密貨幣可以作為一種規(guī)避這種風險的手段。但我個人認為,除非是戰(zhàn)亂時期,這種風險發(fā)生的幾率還是比較小。要真是在戰(zhàn)亂,比特幣的中心服務(wù)器可能早被炸了。簡單來說,比起本來就脆弱的網(wǎng)絡(luò),我還是更相信權(quán)威第三方。

技術(shù)上的“去中心化”并不等同于現(xiàn)實中的“去中心化”。?全球的大量比特幣可能被控制在非常少的幾百個人手里,這幾百個人可以聯(lián)合起來控制市場走勢,而因為比特幣的匿名性,他們可能不會收受到任何懲罰。技術(shù)上的“去中心化”,可能反而保證了現(xiàn)實中的絕對“中心化”。

區(qū)塊鏈本質(zhì)是P2P的分布式網(wǎng)絡(luò),而分布式網(wǎng)絡(luò)做到完全地去中心化是幾乎不可能的。也要考慮到區(qū)塊鏈的潛在安全風險。

投機炒作多。?把比特幣和其他加密貨幣推到風口的不是參與者對其成為未來貨幣的期望,而是跟風把其當成一種純粹的投機,炒作手段。從這一點來看,加密貨幣現(xiàn)在的可信度就得打個問號。

區(qū)塊鏈有沒有其他應(yīng)用場景??除了加密貨幣系統(tǒng),區(qū)塊鏈還有沒有其他應(yīng)用場景?你們說呢?

無論比特幣,ICO和區(qū)塊鏈是未來的塑造者,還是曇花一現(xiàn)的騙局,唯一可以肯定的一點是,有人會在這波風口里賺得盆滿缽滿,有人也會在這波風口里虧得血本無歸。

參考資料:

Bitcoin mining the hard way: the algorithms, protocols, and bytes

Bitcoins the hard way: Using the raw Bitcoin protocol

Bitcoin: A Peer-to-Peer Electronic Cash System

Transactions Speeds: How Do Cryptocurrencies Stack Up To Visa or PayPal?

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

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

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