- 區塊鏈技術及應用
- 華為區塊鏈技術開發團隊
- 14670字
- 2020-03-13 19:30:57
第1章 瘋狂的比特幣及其原理機制
1.1 比特幣的誕生
2008年11月,一位化名為中本聰(Satoshi Nakamoto)的人,在密碼學論壇metzdowd.com發表的一篇名為Bitcoin:A Peer-to-Peer Electronic Cash System(《比特幣:一種點對點的電子現金系統》)的論文中首先提出了比特幣。2009年1月3日,中本聰發布了比特幣系統并挖掘出第一個區塊,被稱為“創世區塊”,最初的50個比特幣宣告問世。同時有趣的是,中本聰在創世區塊中帶上了一句話以證明這個區塊挖出于2009年1月3日,這句話就是圖1.1中的《泰晤士報》2009年1月3日的頭版新聞標題——Chancellor on brink of second bailout for banks(《財政大臣正處于第二次救助銀行之際》)。圖1.2是創世區塊的原始二進制數據及其ASCII碼文本表示,可以看到其中所攜帶的標題信息,在圖中已用方框圈出。
截至2018年,比特幣系統已經運行了整整十年。比特幣系統軟件全部開源,系統本身分布在全球各地,無中央管理服務器,無任何負責的主體,無外部信用背書。在比特幣運行期間,有大量黑客無數次嘗試攻克比特幣系統,然而神奇的是,這樣一個“三無”系統,近十年來一直都在穩定運行,沒有發生過重大事故。這一點無疑展示了比特幣系統背后技術的完備性和可靠性。近年來,隨著比特幣的風靡全球,越來越多的人對其背后的區塊鏈技術進行探索和發展,希望將這樣一個去中心化的穩定系統應用到各類企業應用之中。在本書第二部分,我們將選取代表性行業為例,講述比特幣背后區塊鏈技術的各類相關應用。
除了其背后的技術所具有的價值,比特幣作為一種虛擬貨幣,也逐漸與現實世界的法幣建立起了“兌換”關系,其本身有了狹義的“價格”?,F實世界中第一筆比特幣交易發生在2010年5月22日,美國佛羅里達州程序設計員拉斯洛·豪涅茨(Laszlo Hanyecz)用1萬個比特幣,換回了比薩零售店棒約翰(Papa Johns)的一個價值25美元的比薩。這是比特幣作為加密數字貨幣首次在現實世界的應用。按照這筆交易,一個比特幣在當時的價值為0.25美分。然而在今天來看,1萬個比特幣可以說是一筆巨款(注:按照2018年9月的價格計算,1萬個比特幣大約值6000多萬美元),但在比特幣剛出現時,人們并沒有意識到這種新生事物在未來將會引起的瘋狂及宏大的技術變革。
1.2 瘋狂的比特幣
1.2.1 瘋狂的比特幣價格
比特幣自誕生之日起,經歷了多次的暴漲暴跌,其價格的變動猶如過山車一般。
在2011年1月,1個比特幣還不值30美分,但在隨后的幾個月里,它的價格一路走高,突破了1美元,很快上升到8美元,然后是20美元。到2011年6月9日,1個比特幣的價格已經漲到了29.55美元,半年時間漲幅約為100倍。但是隨后不久,比特幣交易平臺Mt. Gox由于其交易平臺本身的漏洞被黑客攻擊,使平臺本身和其用戶蒙受了較大的損失,比特幣的安全性受到了投資者們的質疑。因為該事件,比特幣價格持續走低,急劇回落,在僅僅半年時間后的2011年11月,比特幣的價格已經低至2美元,相比6月份的最高價跌去了90%以上。
2012年12月6日,世界首家比特幣交易所在法國誕生,比特幣單價重回巔峰期,單枚漲至13.69美元。2013年3月,按照當時的兌換匯率,全球發行比特幣總值超過10億美元,這也是比特幣價格飛漲的一年。在同年12月,單枚比特幣的價格突破1147美元,超越了當時的國際黃金價格。
2014年到2016年,比特幣市場持續低迷。2015年8月,比特幣單枚價格跌至200美元;隨后的2016年,比特幣市場迎來內外環境的巨大變化和影響:內部變化是根據比特幣的既定規則,其年產量開始收縮,意味著比特幣收獲難度增高;外部影響則源自英國脫歐、美國大選、亞洲投資者激增等事件。在內外因素的共同作用下,比特幣的價格持續上漲,截至2016年12月,單枚價格又一次突破了1000美元。
2017年是比特幣發展史上十分重要的一年,全年整體漲幅高達1700%。2017年一整年,比特幣價格走勢圖猶如一輪過山車,暴增暴跌讓投資者為之瘋狂。在2017年全年,比特幣最低價格是789美元,對應日期為1月11日;最高價位為19142美元,對應日期是12月18日。其中,1月到5月比特幣價格緩慢增長,到5月中旬達到2000多美元/枚,但進入六、七月后又開始極速下跌,跌幅達到45%。比特幣價格的劇烈變動引起了各國政府的密切關注,同年9月,我國發布《關于防范代幣發行融資風險的公告》,國內市場熱度漸漸消退,但在全球市場上,日本和韓國比特幣投資者持續涌入,比特幣價格一路高漲,12月18日觸及歷史峰值。然而隨后迅速開始暴跌,12月31日封盤價跌破11000美元。
比特幣貨幣市場在2017年輝煌一時,但2018年市場表現并不理想。受多方政策影響,比特幣價格開始大幅度下跌。2018年1月的第一個星期,比特幣有過短暫的升值期,1月7日達到峰值16448美元,但從1月8日開始暴跌,僅1月8日一天就跌了2219美元,跌幅達15.6%,后續幾天有漲有跌,但總體趨勢仍是持續走低。截至筆者發稿前(2018年11月8日數據),比特幣單枚價格為6520美元左右,相比2017年12月峰值19142美元確實有了較大幅度的下跌,未來,數字加密貨幣市場的大起大落還將繼續上演。2013年4月以來比特幣價格走勢如圖1.3所示,從中可以對比特幣價格的瘋狂變動略窺一斑。
1.2.2 瘋狂的礦機和芯片
在比特幣瘋狂的價格和猶如過山車般的價格波動吸引了越來越多投機者的同時,比特幣礦機及芯片技術也取得了長足進展。所謂比特幣“礦機”,就是用于賺取比特幣的計算機。用戶下載專用的比特幣運算軟件,在礦機上運行相應的軟件,參與記賬并獲取對應的記賬獎勵。
比特幣礦機的發展經歷了三個階段。第一階段,即挖礦初期,挖礦的參與成本較低,只需要任意一臺普通的計算機即可進行挖礦,同時,由于參與挖礦競爭的節點數目較少,挖礦算法的難度極低,用普通的CPU處理器就能達到不錯的產出率,從而較容易獲得比特幣激勵。第二階段,挖礦中期,此階段參與挖礦節點數目越來越多,普通CPU挖礦節點很難再獲取較為可觀的產出率。由于CPU的設計邏輯偏重浮點計算等通用計算需求,而比特幣挖礦算法所涉及的僅為簡單的哈希計算,不能夠充分利用CPU的能力,一些礦工開始使用具有多處理器、能夠進行快速的簡單計算特性的顯卡(即GPU)進行挖礦,相比于CPU挖礦,其運算效率和對應的產出率都得到了大幅提升,此階段即為礦機處理器由CPU向GPU的轉變。第三階段,參與挖礦的節點及其對應的算力進一步上升,進入了專業礦機的階段。前兩個階段的通用計算機已不能滿足礦工們的需求,因此出現了專門為比特幣挖礦而設計的定制化機器,這類機器專門為哈希運算設計,能夠更快地進行比特幣挖礦過程所需的哈希運算。圖1.4是一個市場上較為主流的礦機,該礦機的額定算力已經達到了27TH/s,也就是每秒能夠進行2.7×1010次哈希運算。
相應地,挖礦芯片的發展經歷了從CPU、GPU、FPGA到ASIC的四個階段,從通用型逐漸轉向了挖礦專用型。其中,專用集成電路(Application Specific Integrated Circuits, ASIC)是指應特定用戶要求或特定電子系統的需要而設計、制造的集成電路,本書是指為比特幣挖礦專門設計的專用集成電路。ASIC礦機芯片的制造流程先進、產品更迭速度極快。目前市場上主流的ASIC礦機芯片制造工藝從110nm、55nm、28nm,一直升級到16nm。2018年,礦機廠商宣布推出7nm礦機,意味著礦機進入7nm時代。
在比特幣礦機算力不斷提升的同時,其進行挖礦消耗的總電量也是驚人的。英國《衛報》2017年的一篇研究表示,比特幣挖礦一年消耗的電力已經超過了19個歐洲國家一年所消耗的電力總和,包括克羅地亞、愛爾蘭、冰島、斯洛文尼亞以及拉脫維亞等。從全球范圍來看,比特幣一年的耗電量是全球耗電量的0.13%。
需要說明的是,比特幣巨大的耗電量主要源于其計算密集型的挖礦算法以及其所采用的工作量證明形式的共識協議。實際上,目前的眾多面向企業級應用的區塊鏈平臺及應用通過根據其應用場景及環境采用不同的共識協議及相關算法,避免了不必要的能源消耗,使能源消耗與普通信息系統相當。
1.2.3 瘋狂的礦場與礦池
隨著比特幣價格的震蕩式飆升,人們仿佛像美國西部剛剛發現金礦一樣,紛紛投入“挖礦”的事業之中。由于比特幣的產生速率基本保持穩定,但對于單個節點來說,其挖到某個比特幣的概率與其算力占所有參與挖礦競爭節點總算力的比例成正比,因此,隨著參與到比特幣挖礦競爭中的機器及算力大幅上升,單個節點或少量的算力能夠成功挖到比特幣的概率急劇下降,小規模挖礦參與者的收益難以得到保障,因此兩種不同的組織相繼登場,分別是礦場和礦池,它們的目的都是集中算力,提升挖礦概率,從而提升收益。
礦場是將挖礦產業化的產物。簡單來說,礦場即為挖礦設備管理場所。早期的礦場非常簡單,只有一些簡單的機架供礦機的安置,同時僅提供簡單的網絡、電力等資源。隨著專業挖礦設備的不斷增多,人們發現這種粗獷的管理方式下,設備太容易損壞,同時設備維修更新成本也很高。因此,通風防塵、溫度濕度控制等數據中心管理常見的規范管理措施逐漸被運用到礦場中。由于礦場的電力消耗非常驚人,且噪音巨大,當前礦場一般選擇建在人煙稀少且電力便宜的地區。當前礦場的管理模式完全向大型數據中心的管理靠齊,甚至很多大型礦場的規模已經不輸很多大型數據中心。圖1.5和1.6分別對某大型礦場外觀和內部進行了展示。
除了礦場這種產業化的挖礦方式,還有一種將大量算力較低設備進行聯合、共同運作挖礦的平臺,即“礦池(Mining Pool)”,加入“礦池”的設備即被稱作“礦工”。在“礦池”中,不論“礦工”所能提供的運算力的多寡,只要是通過加入礦池來參與挖礦活動,無論是否成功挖掘出有效區塊,在該礦池挖礦成功后皆可經由對礦池的貢獻(即投入的算力)來獲得比特幣獎勵。亦即多人合作挖礦,獲得的比特幣獎勵也由多人依照貢獻度分享。這種組織方式實際上并沒有提高單個礦工挖礦收益的期望值,但提升了單個礦工收益的穩定性。
截至2018年10月,根據BTC. com的分析,如圖1.7所示,排名前六的比特幣礦池占據整體比特幣挖礦算力61.4%的份額,分別是BTC.com(占比17.4%)、螞蟻礦池(antpool, 15.3%)、ViaBTC(12.6%)、SlushPool(11.9%)、BTC.TOP(10.6%)、F2Pool(9.6%)。世界上最大的比特幣礦池是螞蟻礦池,算力達到驚人的2500PH/s,如果將超級計算機“天河二號”每秒33P FLOPS(Peta FLOPS)的計算能力換算成哈希計算的話,大約是螞蟻礦池的千分之一,單純從哈希運算的角度來看,比特幣礦池有超強的運算能力(注:比特幣挖礦中需要做大量的哈希運算,因此礦機/礦池的算力就以每秒能執行的哈希運算次數來衡量。1kH/s是每秒1000次哈希;1MH/s是每秒1000000次哈希;1GH/s是每秒10億次哈希;1TH/s是每秒1000000000000次哈希;1PH/s是每秒1000000000000000次哈希)。

圖1.7 截至2018年10月的礦池分布餅狀圖
資料來源:BTC. com
在2012年,礦池總算力之和已經接近比特幣總算力的一半。近幾年,礦池更是逐漸成為算力的主力,算力呈現集中化趨勢。然而,這種集中化的趨勢會帶來一些弊端。由于在比特幣世界中,算力高即代表著產生記賬區塊的概率高,即代表著“記賬權”更強。如果礦池算力不斷提升,單家礦池算力達到50%以上,即可以對比特幣進行51%攻擊,對比特幣系統的開采權和記賬權進行壟斷。
1.3 比特幣的通俗故事
那么什么是比特幣呢?它背后到底有著什么神奇的地方,讓如此多的人追捧,甚至是不惜消耗巨大的資源來獲取它呢?讓我們從一個通俗的故事開始,如圖1.8所示。
從前,有個古老的村落,里面住著一群古老的村民,這個村莊沒有銀行為大家存錢、記賬。沒有一個讓所有村民都信賴的村長來維護和記錄村民之間的賬務往來,也就是沒有任何中間機構或個人來記賬。于是,村民想出一個不需要中間機構或個人,而是大家一起記賬的方法。
比如,張三要給李四1000塊錢。張三在村里大吼一聲:“大家注意了,我張三給李四轉了1000塊錢。”附近的村民聽到了之后做兩件事:(1)通過聲音判斷這是張三喊的,而不是別人冒名張三喊的,從而防止別人去花張三的錢;(2)檢查張三是否有足夠的錢,每個村民都有個小賬本記錄了各個村民有多少錢,當確認張三真的有1000塊錢后,每個村民都會在自己的小賬本記錄:“××××年×月×日,張三轉給李四1000塊錢?!背酥猓@些村民口口相傳,把張三轉賬的事情告訴了十里八村,當所有人都知道轉賬的事情后,大家就能夠共同證明“張三轉給李四1000塊錢”。這樣,一個不需要村長(中心節點)卻能讓所有村民都能達成一致的記賬系統誕生了。這個記賬系統就可以類比為我們今天常說的比特幣系統。
故事到此并未結束,由此引出了三個值得思考的問題。
(1)記的賬在后面會不會被篡改?
(2)村民有什么動力幫別人記賬?
(3)這么多人記賬,萬一記的不一致豈不是壞了,以誰記的為準?
比特幣系統巧妙地解決了這三個問題。
第一,比特幣采用兩種策略保證賬本不可篡改:①人人記賬。人人手上都維護一本賬本,這樣即使某個人改了自己的賬本,他也無權修改其他村民手上的賬本,修改自己的賬本相當于“掩耳盜鈴”,別人是不會認可的。②采用“區塊+鏈”的特殊賬本結構。在這種賬本結構中,每一個區塊保存著某段時間內所發生的交易,這些區塊通過鏈式結構連接在一起,形成了一個記錄全部交易的完整賬本。如果對區塊內容進行了修改就會破壞整個區塊鏈的鏈式結構,導致鏈條斷了,從而很容易被檢測到,這兩個策略保證了從全局來看整個賬本是不可篡改的。
第二,前面一條中提到了人人參與記賬,大家肯定會問“憑啥要我幫別人記賬呢”。這就涉及比特幣系統中的激勵機制。參與記賬的村民,被稱為“礦工”。這些礦工中,首個記賬被認可的人:①將獲得一筆獎勵,這筆獎勵就是若干個比特幣,這也是比特幣發行的唯一來源,這種獎勵措施使眾多礦工積極參加記賬;②誰在某一塊賬本被認可,其他人都會分別拷貝這一塊賬本,從而保證所有人維護的賬本是完全一致的。這兩點保證了區塊鏈的自動安全運行。
第三,既然有了激勵,大家就會爭搶著記賬并努力讓自己的記賬被認可,怎么確定以誰記的為準呢?為了能夠確定以誰記的賬為準,村民們想到了一個公平的辦法:對每一塊賬本(類比為我們現實賬本上的一頁),他們從題庫中找了一道難題,讓所有參與記賬的“礦工”都去破解這道難題,誰若最先破解了,該頁/塊就以他記的賬為準。這個破解難題的過程,就被稱為“挖礦”,也即工作量證明的過程。這里需要說明的是,這個難題的解題過程需要不斷地嘗試,較為困難,但是找到答案發給別人后,別人是很容易驗證的。
因此,比特幣通過“區塊+鏈”的分布式賬本保障了交易的不可篡改,通過發放比特幣的激勵措施激勵了“礦工”的參與,通過計算難題(礦工挖礦)解決了記賬一致性的問題。這樣,完美地形成了一個不依賴任何中間人即可完成記賬的自動運行系統。如圖1.9所示,這其中具有“區塊+鏈”不可篡改賬本、多方參與、結果共識的技術,就是比特幣背后的區塊鏈技術。

圖1.9 “區塊+鏈”的賬本結構
1.4 比特幣交易
要對比特幣交易進行介紹,我們首先要了解比特幣地址的概念。要參與比特幣系統中的交易過程,需要一個類似于現實世界中銀行“賬戶”的實體。實際上,比特幣的交易參與方實體為一組公私鑰的組合,其中,私鑰是由程序生成的一串隨機數,而其公鑰則是根據私鑰經過一系列的計算生成的,公私鑰之間存在一一對應的關系。其中,公鑰作為參與交易的“賬戶名”,在交易中被引用,用于指明一筆交易中資金的來源及去向,而私鑰則作為交易過程中的“驗證密碼”,用于確認某一交易的合法性。
如果以銀行賬戶做個類比的話,一對比特幣公私鑰即相當于一個銀行賬戶。其中公鑰是公開的信息,它可以作為一個比特幣賬戶對外的“賬戶名”,用于外界對該賬戶的引用,類似于銀行賬戶的賬號;相應地,比特幣地址對應的私鑰就相當于銀行賬戶的密碼,用于在轉賬時進行身份驗證,從而保證用戶的資金安全。
由于公私鑰對為一個交易實體的唯一標記,所以需要保證各個用戶所持有的比特幣地址之間互不沖突,否則就可能出現安全問題。由于私鑰本質上是隨機生成的比特串,若有兩個用戶的私鑰不巧是相同的,則一個用戶完全可以用自己的私鑰去替代另一個用戶的私鑰,從而使用另一個用戶的資金。然而,在比特幣的設計中,私鑰的長度被設定為256比特,其可能的取值范圍為[0,2256-1],這是一個巨大的范圍,可以認為與世界上沙子的數量相當,能夠保證在隨機算法實現正確的情況下,基本不可能發生碰撞(生成兩個完全相同的私鑰)。這也是比特幣乃至整個密碼學的基礎。
簡單來說,比特幣的一對公私鑰以及其對應的錢包地址是按照如下的流程產生的:首先,通過某種隨機數生成算法產生出一個256比特的比特串作為私鑰,然后再使用橢圓曲線加密算法(Elliptic Curves Cryptography, ECC)對這個私鑰計算生成公鑰。此后,公鑰再通過一系列的哈希計算和Base58編碼得到錢包地址。
比特幣交易即為從一個比特幣地址向另一個比特幣地址進行轉賬的過程,每個交易可能會包含多筆轉賬。
如圖1.10所示,交易包含從比特幣地址1FzPNJ52ieWzvrcsSLUSgbEc2oBwczm4Ei向比特幣地址19qM3R2YyhVf2HwcF2HocJsFXH6YZZDcSr轉0.0005個比特幣和向地址19aEqa9UHVKqRLwsJ5Krq9VP4QV1AhBWVg轉0.01052289個比特幣這兩筆轉賬。交易輸入的比特幣中未被使用(轉賬給其他人)的剩余0.003136個比特幣則作為手續費,會被發送給挖出包含這個交易的區塊的礦工,作為挖礦獎勵的一部分。

圖1.10 比特幣普通交易
值得一提的是,上述我們提到的由32個字符組成的看似亂碼的比特幣地址,實際上是將其本身的256比特的比特串進行了編碼,形成(相對于比特串)更為易讀、易用的地址。
感興趣的讀者可以通過https://www.blockchain.com/explorer查看所有的比特幣交易。
比特幣交易有兩種類型,一種是Coinbase交易,也就是挖礦獎勵的比特幣,這種交易沒有發送人,例如圖1.11所示的交易。另一種就是我們常見的普通交易了,即普通地址之間的轉賬交易,如圖1.10中的交易。

圖1.11 比特幣Coinbase交易
比特幣錢包是一個形象的概念,就是保存和管理比特幣地址以及對應公私鑰對的軟件。根據終端類型的不同,比特幣錢包可以分為桌面錢包、手機錢包、網頁錢包和硬件錢包。不同錢包的安全程度不同,對于少量比特幣來說,選用網頁錢包這種輕量級的錢包存儲;而對于較大額度的比特幣,建議使用更高級的錢包存儲方式,比如硬件錢包,硬件錢包的成本最高,安全性也相對較高。
比特幣官方提供錢包Bitcoin Core,如圖1.12所示,錢包中展示了可用的余額,可以給其他比特幣地址轉賬、接收比特幣并查看交易記錄。

圖1.12 Bitcoin Core界面
Bitcoin Core是一個實現了全節點的比特幣客戶端,它的賬本保存了2009年比特幣面世以來所有的交易記錄,這就意味著數據量大,全賬本大小超過185GB(截止到2018年9月底),全部同步要花幾天時間(具體視電腦配置和網絡環境而定)。當然通常我們沒有必要下載整個賬本,可以下載一個輕量版的錢包,比如Electrum。完成安裝及基礎的網絡、證書等配置工作后,即可使用,圖1.13所示為其基本界面。

圖1.13 Electrum操作界面
默認為歷史界面(History),即與該錢包配置地址相關的轉賬記錄。發送界面(Send)即轉賬給其他地址,填寫目的地址、金額、說明、手續費等信息即可進行轉賬操作。接收界面(Receive)即為該錢包的收款地址,提供給他人后,對方即可轉賬至該地址。
除了上面的電腦版錢包外,還有網頁版的錢包,以https://blockchain.info為代表,還有虛擬幣交易網站的錢包也屬于此類,這類錢包對幣的控制權通過登錄網站的用戶名和密碼保證。這種類型錢包使用最簡便,當然安全性也是最低的。因為賬戶的私鑰都是由網站保管的,這樣理論上網站可以對用戶的賬戶做任何操作。
如何獲得比特幣?獲得比特幣有3種途徑。
(1)“礦工”挖礦所得;
(2)線下通過中間人購買,線下支付法幣或者任何等價物之后,轉出方將比特幣從他的地址轉到購買者的地址,也可以通過線上“交易所”購買;
(3)商家收取比特幣,比如在本章開始提到佛羅里達程序員花1萬個比特幣購買比薩的店主就收到了比特幣。
1.5 比特幣挖礦
很長一段歷史里作為基本貨幣的黃金,需要人工進行采礦獲取,因此將比特幣記賬者們之間爭搶激勵的方式比作“挖礦”工作。當然比特幣系統中挖礦只是一個形象的概念。比特幣系統是一個參與節點互相驗證的公開記賬系統,而比特幣挖礦的本質則是爭奪某一個區塊的記賬權。
“挖礦”成功即是該節點成功獲得當前區塊記賬權,也就是說其他節點就“照抄”該挖礦成功的節點的當前區塊。獲得記賬權的節點會獲取一定數量的比特幣獎勵,以此激勵比特幣網絡中的所有節點積極參與記賬工作。該獎勵包含系統獎勵和交易手續費兩部分,系統獎勵則作為比特幣發行的手段。最初每生產一個“交易記錄區塊”可以獲得50比特幣的系統獎勵,為控制比特幣發行數量,該獎勵每4年就會減半,到2140年即會基本發放完畢,最終整個系統中最多只能有2100萬個比特幣。
比特幣系統大約每10分鐘會記錄一個數據塊,這個數據塊里包含了這10分鐘內全網待確認的部分或全部交易。所謂的“挖礦”,就是爭奪將這些交易打包成“交易記錄區塊”的權利。比特幣系統會隨機生成一道數學難題,后續會詳細描述該數學難題,所有參與挖礦的節點一起參與計算這道數學難題,首先算出結果的節點將獲得記賬權。
每個節點會將過去一段時間內發生的、尚未經過網絡公認的交易信息進行收集、檢驗、確認,最后打包并加簽名為一個無法被篡改的“交易記錄區塊”,并在獲得記賬權后將該區塊進行廣播,從而讓這個區塊被全部節點認可,讓區塊中的交易成為比特幣網絡上公認已經完成的交易記錄,永久保存。
1.5.1 挖礦的原理
挖礦最主要的工作就是計算上文提到的數學難題,最先求出解的礦工即可獲得該塊的記賬權。在介紹這個數學難題前,先簡單介紹一下哈希算法。哈希算法的基本功能概括來說,就是把任意長度的輸入值通過一定的計算,生成一個固定長度的字符串,輸出的字符串即為該輸入的哈希值。比特幣系統中采用SHA-256算法,該算法最終輸出的哈希值長度為256bit。由于此小節主要介紹挖礦原理,關于哈希算法的詳細介紹請參見2.2.1小節,哈希運算的算法原理請參見2.4.1小節。
比特幣中每個區塊生成時,需要把上一個區塊的哈希值、本區塊的交易信息的默克爾樹根、一個未知的隨機數(nonce)拼在一起計算一個新的哈希值。為了保證10分鐘產生一個區塊,該工作必須具有一定難度,即哈希值必須以若干個0開頭。哈希算法中,輸入信息的任何微小改動即可引起哈希值的巨大變動,且這個變動不具有規律性。因為哈希值的位數是有限的,通過不斷嘗試隨機數nonce,總可以計算出一個符合要求的哈希值,且該隨機數無法通過尋找規律計算出來。這意味著,該隨機數只能通過暴力枚舉的方式獲得。挖礦中計算數學難題即為尋找該隨機數的過程。
哈希值由16進制數字表示,即每一位有16種可能。根據哈希算法的特性,出現任何一個數字的概率是均等的,即每一位為“0”的概率為1/16。要求某一位為“0”平均需要16次哈希運算,要求前n位為“0”,則需要進行哈希計算的平均次數為16的n次方。礦工為了計算出該隨機數,需要花費一定的時間進行大量的哈希運算。
某個礦工成功計算出該隨機數后,則會進行區塊打包并全網廣播。其他節點收到廣播后,只需對包含隨機數的區塊按照同樣的方法進行一次哈希運算即可,若哈希值以“0”開頭的個數滿足要求,且通過其他合法性校驗,則接受這個區塊,并停止本地對當前區塊隨機數的尋找,開始下個區塊隨機數的計算。
隨著技術的發展,進行一次哈希計算速度越來越快,同時隨著礦工的逐漸增多,算出滿足哈希值以一定數量“0”開頭的隨機數的時間越來越短。為保證比特幣始終按照平均每10分鐘一個區塊的速度出塊,必須不斷調整計算出隨機哈希計算的平均次數,即調整哈希值以“0”開頭的數量要求,以此調整難度。比特幣中,每生成2016個區塊就會調整一次難度,即調整周期大約為兩周(2016×10min=14天)。也就是說,對比生成最新2016個區塊花費的實際時間和按照每10分鐘出一個塊生成2016個塊的期望時間,若實際時間大于期望時間則降低難度,若實際時間小于期望時間則增加難度。
同時,為防止難度變化波動太大,每個周期調整幅度必須小于一個因子(當前為4倍)。若幅度大于4倍,則按照4倍調整。由于按照該幅度調整,出塊速度仍然不滿足預期,因此會在下一個周期繼續調整。
1.5.2 礦池的原理
隨著區塊鏈的日漸火爆,參與挖礦的人越來越多,按照比特幣原本的設計模式,只有成功打包一個區塊的人才能獲取獎勵。如果每個礦工都獨立挖礦,在如此龐大的基數下,挖礦成功的概率幾乎為0,只有一個幸運兒可以獲取一大筆財富,其他礦工投入的算力、電力資源就會白白虧損?;蛟S投入一臺礦機,持續挖礦好幾年甚至更久才能挖到一個區塊。
為了降低這種不確定性,礦池應運而生。假如有10萬礦工參與挖礦工作,這10萬礦工的算力和占這個網絡的10%,則這10萬個礦工中的某個礦工成功挖到下個塊的概率即為1/10。即平均每個礦工成功挖到下個區塊的概率為1/1000000,即平均每個礦工要花費19年可以成功挖到一個區塊,然后獲得相應的比特幣獎勵。這種挖礦模式風險過大,幾乎沒人可以承受。但是假設這10萬個礦工共同協作參與挖礦,則平均每100分鐘即可成功挖到一個區塊,然后按照每個礦工提供的算力分配該次收益。這10萬個礦工的收益也會趨于穩定。
當然上述只是對礦池原理進行一個簡化的分析,實際情況則要復雜得多。當前大部分礦池是托管式礦池,一般由一個企業維護一個礦池服務器,運行專業的軟件,協調礦池中礦工的計算任務。礦工不需要參與區塊的驗證工作,僅由礦池服務器驗證即可,因此礦工也不需要存儲歷史區塊,這極大地降低了礦工的算力及存儲資源消耗。
協調礦工進行計算的思路也非常簡單,礦池將打包區塊需要的交易等信息驗證完成后發送給礦工,然后降低礦工的挖礦難度。比如某個時段比特幣系統需要哈希值“0”開頭的個數大于50個,礦池可以將難度降低到40個“0”開頭,礦工找到一個40個“0”開頭哈希值的方案后,即可提交給礦池。礦池收到一個滿足哈希值“0”開頭個數大于50個的方案時,即可提交至比特幣網絡。當然,你也許會想:如果礦工計算得到一個“0”開頭個數大于50的哈希值后,則直接提交給比特幣網絡,獨享該區塊的收益;如果計算得到一個“0”開頭數在40到50之間的則提交到礦池,享受整個礦池分配的收益。該方案當然是行不通的,因為區塊內容是由礦池發送給礦工的,即受益者地址已經包含在該區塊中了,即使直接提交,最終受益的也是礦池。如果修改該地址,即意味著區塊內容改變,則前面計算的哈希值也無效了。最后礦池按照礦工提交方案數量計算貢獻的算力,最后根據算力分配收益。
當前礦池為協調礦工計算工作所采用的最為流行的協議為Stratum協議,該協議采用主動分配任務的方式。礦工首先需要連接到礦池訂閱任務,礦池會返回訂閱號ID、礦池給礦工指定的難度及后續構造區塊所需要的信息。連接成功后,需要在礦池注冊一個賬戶,添加礦工,每個賬戶可以添加多個礦工。注冊完成后即可申請授權,礦池授權成功后才會給礦工分配任務。礦池分配任務時,會提供任務號ID及打包區塊需要的相關信息。收到任務后,礦工即開始哈希計算并打包區塊。如果礦工收到新任務,將直接終止舊任務,開始新任務,同時礦工也可以主動申請新任務。
這種托管式礦池一直飽受爭議,礦池的存在大大降低了挖礦的門檻,使普通設備也可以參與到挖礦中,吸引更多礦工參與區塊鏈網絡,同時降低礦工的風險。但是弊病也非常明顯,礦池的存在一定程度上違背了區塊鏈去中心化的理念。于是有人提出了P2P礦池來取代托管式礦池,但是由于其效率遠低于托管式礦池,收益低下,司馬遷說的好:“天下熙熙,皆為利來,天下攘攘,皆為利往?!贝蟛糠值V工都更愿意因為利益而選擇托管式礦池。
由于托管式礦池掌握著大量的算力資源,擁有非常大的話語權,甚至某個礦池或者幾個礦池聯合掌握的算力超過整個網絡的50%時,可以隨意決定出塊內容、雙花等。但是也不用太過擔心,從經濟學的角度來講,擁有大量算力的礦池,已經是既得利益者,為保障自己的利益,肯定會不遺余力地保障比特幣網絡的平穩運行。
1.6 比特幣分叉
軟件由于方案優化、BUG修復等原因進行升級是一種非常常見的現象。如手機應用等傳統軟件,升級非常簡單,只需廠商發布,用戶接受升級即可。但是對于比特幣這種去中心化的系統,升級是非常困難的,需要協調網絡中每個參與者。軟件升級意味著運行邏輯的改變,但是在比特幣中,升級必然會導致不同節點在一定時間內運行不同的版本,于是就會產生分叉。
分叉主要包含軟分叉和硬分叉兩種。如果比特幣升級后,新的代碼邏輯向前兼容,即新規則產生的區塊仍然會被舊節點接受,則為軟分叉;如果新的代碼邏輯無法向前兼容,即新產生的規則產生的區塊無法被舊節點接受,則為硬分叉。
1.軟分叉
軟分叉由于向前兼容,新舊節點仍然運行在同一條區塊鏈上,并不會產生兩條鏈,對整個系統影響相對較小。到目前為止,比特幣發生過多次軟分叉,如BIP-34,BIP-65,BIP-66,BIP-9等。其中比特幣改進建議(Bitcoin Improvement Proposal, BIP)指的是比特幣社區成員針對比特幣提出的一系列改進建議,這些改進建議的具體內容感興趣的讀者可以通過訪問BIP的網站自行查閱。
此處以BIP-34為例,簡單說明軟分叉的過程。在舊版本中,存在一個無意義的字段“coinbase data”,礦工不會去驗證該字段的內容。BIP-34升級的新版本則要求該字段必須包含區塊高度,同時將版本信息由“1”修改為“2”。該升級共包含三個階段。
第一個階段:礦工將版本號修改為“2”,此時所有礦工驗證區塊時,按照舊的規則驗證,即不關心“coinbase data”字段內容,所有礦工不論以新規則還是舊規則打包區塊,均可以被整個網絡接受。
第二階段:如果最新產生的1000個區塊中,版本號為“2”的區塊個數超過75%時,則要求版本號為“2”的礦工必須按照新的規則打包區塊,升級的礦工收到版本號為“2”的區塊時,只會接受“coinbase data”字段包含區塊高度的區塊,對于版本號為“1”的區塊,仍然不校驗該字段并接受。
第三階段:如果最新產生的1000個區塊中,版本號為“2”的區塊個數超過95%,則升級的礦工只接受版本號為“2”的區塊,并會對“coinbase data”字段進行校驗,版本號為“1”的區塊則不被接受,以此來逼迫剩余少量礦工進行升級。
軟分叉雖然對系統的影響較小,但是為了保證向前兼容,不能新增字段,只能在現有數據結構下修改,即可升級的內容非常有限。同時,因為這些限制,軟分叉一般升級方案比較復雜,復雜的方案往往更容易產生BUG,并且可維護性很差。
2.硬分叉
硬分叉相比軟分叉則會“暴力”很多,由于不向前兼容,舊版本礦工無法驗證新版本的區塊而拒絕接受,仍然按照舊的邏輯只接受舊版本礦工打包的區塊。而新版本產生的區塊則會被新版本礦工接受,因此新版本礦工保存的區塊會和舊版本礦工保存的區塊產生差別,即會形成兩條鏈。
硬分叉修改余地很大,方案設計比較簡單,但是如果整個網絡中有兩種不同的意見,就會導致整個生態的分裂。當前比特幣影響最廣泛的硬分叉事件即為2017年8月1日的硬分叉,比特幣由一條鏈分叉產生一條新的鏈“比特現金(Bitcoin Cash, BCH)”。
這次硬分叉的起因是開發者與礦工在比特幣擴容方案上的分歧。比特幣區塊大小為1MB,按照每10分鐘一個區塊的速度,全球每秒只能完成大約7筆交易。比特幣發展初期,1MB的區塊足夠打包出塊間隔內產生的所有交易,但是在比特幣如此火爆的今天,這種處理速度顯然達不到要求。一筆交易往往需要等待數個小時甚至更久,當前比特幣網絡已經有大約幾十萬交易排隊等待打包確認。比特幣交易可以支付手續費(不強制要求),由于礦工逐利的屬性,礦工在打包區塊時,往往會選擇手續費更高的交易打包。這意味著,如果不想排隊,則需要支付更高的手續費,以期望獲得優先處理權。而過高的手續費顯然違背了比特幣的設計初衷。
為了解決以上問題,經過社區討論,最終形成了兩個改進方案,分別是擴容方案和隔離見證方案。
擴容方案的想法比較直接,既然現在因為區塊太小而導致交易處理速度低下,那就直接擴大區塊的容量,使其能容納更多的交易。原來1MB不夠用,那么就擴成2MB、8MB,甚至直接擴到32MB。
隔離見證方案的想法是,將交易分為兩部分,一部分是交易信息,另一部分是見證信息,這兩部分信息分開進行處理。好比一輛車太小,要搭車的人太多,于是讓車上所有人將背包和行李放在另一輛跟著的貨車上,這樣原來的車就可以容納更多的人了。
支持擴容方案的主要是礦工們。礦工們認為交易的高效才是最重要的,這樣才能體現比特幣的世界貨幣價值。礦工的利益來源于挖礦,如果比特幣交易處理吞吐量較低,用戶為使自己的交易盡早得到打包處理會傾向于向礦工提供更高的手續費,礦工因此可以獲得超額手續費,其短期收益是增加的。但長期來看,只有比特幣價格維持上漲,挖礦的收益才會持續提升。因而,從長遠考慮,擴容是必須的,畢竟只有比特幣交易更加順暢,入場人數增多,資金盤越來越大,礦工的收益才會獲得顯著增長。采用擴容方案,礦工可以在每個區塊中包含更多的交易,從而獲取更多的手續費,然而若使用隔離見證的擴容方案,小額的交易將不通過區塊確認,礦工的手續費收益會大幅降低,因此礦工更傾向于支持擴容方案。
隔離見證方案的支持者主要是比特幣開發團隊的部分核心成員。他們認為,擴容方案是一個“揚湯止沸”的方案,畢竟不可能無限制地對區塊的容量進行擴大。同時,區塊的變大會使得挖礦的門檻提高,從而降低普通礦工的參與度,導致比特幣系統的去中心化程度減弱。
2016年2月和2017年3月,爭議雙方兩次進行商討,希望雙方各退一步,接受一個折中的方案,該方案中,區塊容量將會被擴大到2MB,同時也對比特幣部署隔離見證的方案。但是,由于期間有參與方反悔或者反對,導致最終沒有達成共識,這也給“硬分叉”埋下了伏筆。
在2017年8月1日,比特大陸投資的礦池ViaBTC團隊,采用比特大陸提出的UAHF(用戶激活的硬分叉)方案,挖出了第一個區塊,對比特幣區塊鏈進行了硬分叉。自此,與比特幣競爭的分叉幣比特幣現金誕生。比特幣現金區塊鏈的區塊容量達到了8MB,且沒有采用隔離見證方案。
1.7 比特幣類加密數字貨幣
比特幣的流行刺激了全球對于發行電子貨幣的熱情,各式各樣的加密數字貨幣涌現出來。目前全球發行的加密數字貨幣有兩千多種,比如比特幣、比特現金、以太幣、瑞波幣、恒星幣等,各種加密數字貨幣市值和影響力不盡相同。很多加密數字貨幣源自比特幣或者以太坊源代碼的克隆,也有一些針對特定問題構建了獨特解決方案的加密數字貨幣,從應用場景和技術的角度來講有一定的創新性,比如:萊特幣(LTC)、質數幣(XPM)、Zcash、門羅幣等。這些幣在加密數字貨幣方面的應用外,也給區塊鏈技術的發展做出了很大的貢獻,提供了很多新的思路。
萊特幣(Litecoin, LTC)受到了比特幣(BTC)的啟發,并且在技術上具有相同的實現原理。萊特幣旨在改進比特幣,與其相比,萊特幣具有三種顯著差異:第一,萊特幣網絡每2.5分鐘(而不是10分鐘)就可以處理一個塊,因此可以提供更快的交易確認;第二,萊特幣網絡預期產出8400萬個萊特幣,是比特幣網絡發行貨幣量的4倍之多;第三,萊特幣在其工作量證明算法中使用了由Colin Percival提出的scrypt加密算法,這使得相對于比特幣,在普通計算機上進行萊特幣挖掘更為容易。每一個萊特幣被分成100000000個更小的單位,通過8位小數來界定。
質數幣(Primecoin, XPM)號稱擁有科研價值和現實意義。質數幣仍然使用PoW機制,它挖礦的過程就是尋找質數鏈。質數在數論領域具有極高價值,質數幣是一種使挖礦過程中消耗的大量能源產生價值的加密數字貨幣。
Zcash是首個使用零知識證明機制的區塊鏈系統。零知識證明簡單點講,就是證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的,所以Zcash可提供完全的支付保密性。Zcash是比特幣的分支,保留了比特幣原有的模式,不同之處在于,Zcash交易能夠自動隱藏區塊鏈上所有交易的發送者、接受者及數額。只有那些擁有查看密鑰的人才能看到交易的內容。用戶擁有完全的控制權,他們可自行選擇向其他人提供查看密鑰。
門羅幣(Monero, XMR)是另一個比較流行的隱私保護的加密數字貨幣,它同樣具有隱藏地址、保護用戶的隱私與匿名的功能。與Zcash不同,門羅幣采用環簽名方式保護用戶隱私。環簽名環中一個成員利用他的私鑰和其他成員的公鑰進行簽名,但卻不需要征得其他成員的允許,而驗證者只知道簽名來自這個環,但不知道誰是真正的簽名者,這個方式解決了對簽名者完全匿名的問題。
1.8 本章小結
本章作為本書的第一章,以比特幣作為起點帶領讀者進入區塊鏈的世界。對于剛開始接觸區塊鏈知識的讀者來說,了解比特幣的發展歷史能夠很好地幫助理解區塊鏈的基礎思想,而且第三節也以故事的形式通俗地講解了比特幣的原理。除了這些基礎知識,本章還對比特幣的交易、挖礦和分叉等概念進行了進一步的討論,使得讀者能夠全面地了解比特幣。本章最后還擴展介紹了類似于比特幣的其他加密數字貨幣,讓讀者由點及面地了解比特幣相關的信息。以加密數字貨幣作為入口,讀者能夠更好地開啟學習了解區塊鏈技術的旅程。
需要鄭重聲明的是,本章主要目的是從技術的角度介紹當前較有特色的一些數字貨幣,并不代表筆者認可這些數字貨幣(及后續章節涉及的數字貨幣)的價格,希望讀者能基于本章以及本書其他章節對數字貨幣的價值有一個自己的認識,也希望讀者能正確地認識到其中存在的風險。同時對于本書提到的一些數字貨幣交易平臺僅僅是為了介紹當前的生態,不代表筆者為其資質背書。