前面我們談到礦工所要做的計算是十分困難的。我們現在談一下為什麼計算如此困難,以及看一看礦工用來進行這些計算所用到的硬件設備。
礦工計算難度的核心在於,對SHA-256哈希函數的運算。我們在第1章抽像地討論過哈希函數。SHA-256是一個通用的密碼學哈希函數,它是在2001年被標準化的密碼學哈希函數大家族裡的一員。SHA是安全哈希算法(Secure Hash Algorithm)的簡稱。SHA-256是一個不錯的選擇,因為它是比特幣被發明時可用的密碼學哈希函數中保密性最強的。雖然它的安全性有可能隨著時間推移而慢慢降低,但至少現在它還是很安全的。SHA-256的設計來自美國國家安全局(NSA),這也導致了一些陰謀論的誕生,但是並不影響它是一個很強的哈希函數的事實。
近距離瞭解SHA-256
圖5.5展示了SHA-256運算的具體細節,雖然我們不需要知道比特幣工作原理的所有細節,但是對礦工計算任務的大概瞭解是很有幫助的。
SHA家族
SHA-256名稱中的「256」代表它有256位的狀態和輸出,技術上來說,SHA-256是SHA-2函數家族中幾個密切相關的函數成員之一,包括SHA-512(它有更大的狀態位,所以也更加安全)。還有一個是SHA-1, 這是一個有160位輸出的早期函數,雖然目前認為安全性不高,但是同樣應該在比特幣腳本裡。
整個SHA-2家族,包括SHA-256在密碼學上的安全性是得到公認的,而下一代產品SHA-3家族已經從一個公開的競賽(由美國國家標準與技術研究所舉辦)中誕生了。SHA-3目前正在進行最後階段的標準化測試,但在比特幣出現的時候,它還沒有出世。
SHA-256是一個256位的狀態機。這256個狀態被分割成8個32位的字段,這樣它可以最優化地運行在32位的硬件上。每一輪運算選擇一定數量的字段——有些會進行一些小的逐位調整——最終進行32位模加法運算(modular addition),然後運算結果被移到狀態最左的第一個字段,這樣使得整個狀態進行向右位移。這種設計的思路來自簡單位的線性反饋移位寄存器(Linear Feedback Shift Registers,簡稱LFSR)。
圖5.5展示了一輪SHA-256的壓縮函數運算,一個完整的SHA-256運算要做64次這樣的迭代運算,在每一輪運算中,會使用稍微不同的常數,所以所有的迭代運算都是不一樣的。
礦工的任務就是盡可能快地進行這種函數運算。礦工們互相比拚運算速度,算得越快收益越高。為了實現盡可能快的速度,礦工需要進行32位字段操控,32位模加法運算,同時做按位邏輯運算。
圖5.5 SHA-256的結構
註:這是一輪壓縮運算。Maj是按位運算的。Ch也是按位運算的,根據第一個輸入值的不同而決定是選擇第二個還是第三個。Σ0和Σ1通過按位循環和⊕運算來操縱32位的字符輸入。
我們很快就會看到,在比特幣機制下,為了得到供其他節點使用的哈希函數,實際上要求兩輪SHA-256運算。這是比特幣的奇怪之處,進行兩次運算的原因並不清楚,但這就是比特幣的個性,作為比特幣礦工只能服從。
CPU挖礦
第一代挖礦工作都是在普通電腦上完成的,也就是用通用中央處理器(CPU)來進行運算。事實上,CPU挖礦的工作就像圖5.6中代碼所示的邏輯那樣簡單,也就是說,礦工簡單地按照線性的方式嘗試所有的臨時隨機數,在軟件中進行SHA-256的運算,並檢查結果確認是否找到一個有效區塊。請注意,正如我們之前提到過的,這段代碼要進行兩次SHA-256運算。
圖5.6 CPU挖礦的偽代碼
普通電腦運行這段代碼到底有多快?一台高端的個人桌面電腦,每秒可以計算大約2千萬次哈希函數(20MH/s),按照這個速度,根據2015年早期的難度水平(267),大概需要幾十萬年來找到一個有效區塊。毫不誇張地說,挖礦真的非常困難!
如今使用一個普通電腦用CPU挖比特幣,在目前的難度下已經無利可圖了。在過去的幾年裡,用CPU挖礦的曠工可能會非常失望地發現,他們永遠不可能通過挖礦賺到錢,因為他們不瞭解比特幣是如何運行的。
GPU挖礦
第二代礦工意識到用CPU挖礦是在做無用功,他們開始用顯卡或者圖形處理器(GPU)來挖。
幾乎每一個現代個人電腦都有內置的GPU以支持高性能圖像處理,這些GPU都有高吞吐量和高並行處理功能,這兩點對比特幣挖礦都非常有利,比特幣挖礦存在大量的並行處理,因為你需要同時用不同的臨時隨機數計算多個哈希值。2010年,有一門計算機語言開放運算語言(Open Computing Language,簡稱OpenCL)誕生了,這是一個可以使GPU進行非圖像處理類工作的通用語言。OpenCL是一門高級語言,人們可以用它在顯卡上做很多種類型的運算,而且速度比在CPU上的要快。這給通過GPU來進行比特幣挖礦鋪平了道路。
當時,通過顯卡來挖礦有好幾個吸引人的地方。首先,買顯卡很容易,而且哪怕是業餘愛好者也能輕鬆配置顯卡。你可以在網上或大多數專營電子產品的商場裡買到它。對大眾來說,顯卡是最容易獲得的高端硬件設備。其次,顯卡還有一些格外適合比特幣挖礦的特性:顯卡的並行性設計使其具備很多算術邏輯單元(Arithmetic Logic Units,簡稱ALU),可以同時進行SHA-256運算。有一些GPU還特別集成了針對位移操作的指令,這對SHA-256的運算非常有用。
大多數顯卡都可以超頻,這意味著如果你願意承擔顯卡過熱或者出現故障的風險的話,你可以讓顯卡以高於設計頻率的頻率更快地運行。超頻是遊戲玩家們渴望了多年的特性。對於比特幣挖礦來說,超頻會增加收益,即使超頻可能引起一些運算錯誤。
舉例來說,將顯卡超頻50%,也就是說運算速度加快50%,同時可能會造成SHA-256運算出錯概率增加30%。如果顯卡錯誤地接受了一個不正確的運算結果——雖然不太可能發生——你還可以通過CPU來進行二次確認。然而,你可能永遠都不會知道一個正確的運算結果被錯過了。但是通過超頻產生的運算速度的增加,完全可以抵消由於顯卡運行錯誤產生的正確輸出減少,這樣超頻還是合算的(從經濟效益上來說)。在上述的例子中,超頻使得吞吐量增加到原來的1.5倍,而運算成功率降低到了0.7,那麼乘積就是1.05,也就是意味著超頻使得你的獲利增加了5%。為了最大化收益,人們花了很多時間去優化最佳的超頻比例。
最後,你可以通過一個CPU和一個主板加載許多個GPU。然後你便可以在安裝了多個GPU的電腦上運行比特幣節點,監聽網絡收集交易,組裝區塊,同時用多個GPU進行SHA-256的運算,以更快地找到正確的臨時隨機數及其對應的有效區塊。很多人創造性地發明了很多有趣的「自製型」硬件設置,如圖5.7所示,用一個CPU來驅動很多個GPU。這種情況僅發生在比特幣的早期,當時大多數礦工都是比特幣的愛好者,他們並不具備服務器搭建及運營經驗。但是他們還是做了很多巧妙的設計,使得大量的GPU可以在一個較小的空間裡同時運行,同時還解決了散熱的問題。
GPU挖礦的缺點
GPU挖礦也有缺點。GPU有大量的內置硬件來進行圖形處理,這些特定硬件對比特幣挖礦沒有任何用處,比如它們大量的浮點運算單元(floating point units),在SHA-256的運算中完全用不到。
礦工和遊戲玩家的對比
根據民間傳說,2011年,由於比特幣礦工採購了太多的顯卡以至於影響到了正常的市場需求,這造成了比特幣社區和遊戲社區之間的摩擦,因為遊戲玩家們發現採購某個熱門顯卡變得越來越難。有趣的是,儘管如此,很多失望的遊戲玩家因此而對比特幣產生了興趣,甚至有些遊戲玩家因此而變成了比特幣礦工!
圖5.7 一個用於比特幣挖礦的家庭組裝式GPU機架
資料來源:Istvan Finta, bitcointalk.org
同時GPU也沒有很好的冷卻處理設置,尤其是當你把大量的GPU堆放在一起的時候,這個問題就尤為突出。設計顯卡的時候並沒有考慮如圖5.7所示的這種堆放的情形,原始的設計場景就是在一台電腦、一個機箱、一塊顯卡運行做圖形處理而已。
GPU也非常耗電,所以一台普通的電腦也會消耗很多電。由此引發的另一個缺點就是,你要麼自己構建特定的主板,要麼花大價錢購買可以搭載大量顯卡的特定的主板。
一個非常高端的顯卡經過超頻之後可能使得運行速度達到200MH/s,也就是說,每秒可以進行2億次哈希運算,這是用CPU不可能達到的一個數量級。但是即便如此,即使你將100塊這樣的顯卡集成在一起進行運算,根據2015年早期的比特幣挖礦難度,仍舊需要運算幾百年才有可能找到一個有效區塊。因此,用GPU來挖礦基本上已經成為歷史,但是在其他一些另類幣的早期階段還是很有效率的。
現場可編程門陣列挖礦
2011年左右,用於現場可編程門陣列(Field-Programmable Gate Array,簡稱FPGA)的硬件設計語言Verilog,第一次用於比特幣挖礦。一些礦工開始用FPGA來代替GPU進行挖礦。
圖5.8 家庭組裝式FPGA機架
資料來源:Xiangfu Liu,www.openmobilefree.net
FPGA的工作原理是在追求定制硬件的最佳性能的同時,用戶可以現場調試或者修改硬件參數。相比之下,常用的硬件是在出廠之前就設計好的,以後是無法更改定制而只能永遠做同樣的工作。
FPGA比GPU的性能好,特別是在數位操作(bit fiddling)方面FPGA很輕易就可以做到。FPGA也很容易冷卻,不像GPU,FPGA理論上可以使用硬件板卡上的每一個晶體管進行挖礦運算。跟GPU一樣,可以將很多FPGA堆疊在一起,通過一個中央處理單元來驅動所有的FPGA,如圖5.8所示。總體來說,相比顯卡堆疊,我們可以構建一個更加乾淨整潔的大型FPGA陣列。
精心使用FPGA可以使得運算速度上升到1GH/s,也就是每秒10億次哈希運算。這顯然比CPU或者GPU在性能上都有很大的提高,不過即使你有100塊每秒運算1GH/s的FPGA板,在2015年早期的比特幣難度之下,平均仍舊需要100年的時間才能找到一個有效區塊。
雖然性能提高了,但由於以下幾個原因,用FPGA挖礦的時代也非常短暫:首先,使用FPGA來挖礦其實更加困難——幾乎需要一直超頻使用——這遠超FPGA供普通消費者而設定的頻率。因為這個原因,很多人在用FPGA挖礦的時候經常看到各種報錯和故障。其次,優化FPGA的32位加法處理上十分困難,而這在SHA-256的運算中非常關鍵。最後,FPGA在多數商店都買不到,而且相比GPU來說,只有少數人才知道怎麼搭建FPGA並進行相應的編程。
最重要的是,即使在性能功耗比方面,FPGA相比GPU的提升也不是很高,這就使得用FPGA挖礦只是一個短期現象。儘管GPU挖礦的時代持續了大約一年,而FPGA存在的時間更加有限——僅僅存在了幾個月,之後定制化的專用集成電路技術(Application Specific Integrated Circuits,簡稱ASIC)就誕生了。
專用集成電路技術挖礦
當今的挖礦市場主要被ASIC所主導。這些IC芯片(集成電路芯片)被設計、製造、優化,就是為了比特幣挖礦這個唯一目的。有幾個大型的供應商出售這些芯片,消費者可以買到不同種類的ASIC礦機——較大型但略微昂貴點的款式,或者更加小巧的,當然還有一些可以節省能源的環保型等。
設計ASIC芯片需要非常專業的知識,它們所需要的研發週期也比較長。儘管如此,比特幣ASIC芯片的設計製造過程(從發現問題到製作出解決問題的芯片)出乎意料地迅速,甚至打破了芯片行業的業界紀錄。但弊端是前幾代的早期芯片的設計有許多缺陷,而且大多數芯片沒有達到它們所承諾的性能指標。但現在的比特幣礦機芯片技術,已經相當成熟可靠了。
到2014年年底,ASIC芯片的壽命十分短暫,原因是整個網絡的運算能力不斷地快速上升。絕大部分早期的ASIC芯片在6個月後就被淘汰了。在這段時間裡,大部分的利潤都是在早期實現的(後期幾乎沒有什麼利潤了)。礦工往往在ASIC芯片「保鮮期」的前6個星期可以實現整個利潤的一半,這就使得芯片的出貨速度顯得至關重要。基於這個行業的不成熟,許多礦工經常遇到延遲出貨的情況,有些芯片送到客戶手上的時候已經快要被淘汰了。由於比特幣的全網運算能力已經穩定下來,現在的比特幣挖礦設備有比較長的壽命,但在早期,失望的客戶對供應商的欺詐控訴的事件時有發生。
在比特幣歷史的大部分時間裡,挖礦的經濟效益對小礦工來說一直不是很好,這些小礦工們需要通過在線預定礦機,等待礦機生產送貨,然後再開始挖礦賺錢。實際上,大多數情況下,由於不斷增加的挖掘難度,很多人是一開始就注定要虧錢的。好在到2013年的時候,比特幣價格大漲,徹底扭轉了比特幣礦工虧錢的狀況。實際上,挖掘比特幣一直是一個很昂貴的投資,因為要賭注比特幣的價格會上升,即使是在挖掘比特幣中賺錢的那些礦工,如果能夠把投資於挖掘設備的錢直接用於購買比特幣,並在盈利時賣掉,這樣他們的狀況會更好些。
如今你仍然可以購買礦機,我們也不會勸阻你通過這種方式去瞭解比特幣和加密數字貨幣,但是我們再次強調,這不是一個明智的生財之道。考慮到礦機運行所需要耗費的電力成本以及冷卻成本,大多數ASIC礦機都無法靠挖礦來賺回成本。
如今:專業挖礦的天下
在今天,挖礦已經從個人領域轉到了大型專業挖礦中心。為了保持競爭優勢,運作這些挖礦中心的公司不願意公佈其運營細節。據猜測,這些運營者大量採購打過折的更新的功效更高的ASIC礦機而不是採購那些能夠直接出售給個人的ASIC礦機來維持利潤。
圖5.9就是一個在格魯吉亞運作的挖礦中心的圖片。
圖5.9 Bitfury的挖礦中心
註:在格魯吉亞運作的專業挖礦中心。
要建立一個挖礦中心,需要具備三個重要因素:氣候、電費、網絡接入速度。尤其是要找一個氣溫偏寒的地方,這樣可以節省冷卻費用(大型計算中心會產生大量的熱量,如不馬上降溫,會損害礦機)。冷卻是比特幣挖礦最大的挑戰,其挖礦本身的耗電量,用單位面積來算要超過傳統的數據中心,所以也會產生差不多當量的熱量需要冷卻。當然那裡的電費要便宜。另外,接入網速要快,使得與比特幣網絡中的其他節點更快速地鏈接,這樣當新的區塊被廣播出來的時候,你可以很快監聽到。基於這些考量,所以格魯吉亞和冰島成為比特幣挖礦中心的首選之地。
與挖金礦的相似之處
儘管比特幣挖礦這個名詞起得很有意思,如果回顧比特幣挖礦的發展歷程,我們就不難發現其與歷史上的挖金礦有著有趣的相似之處。它們都開始於類似的淘金者熱潮,很多年輕人和業餘愛好者積極地參與其中。
比特幣挖礦經歷了一個逐漸演化的過程:從CPU到GPU,再到FPGA,最終達到現在的ASIC。而歷史上的挖金礦則是從個人拿著盤子在沙裡淘金,到一小群人用流沙槽來淘金,再到一群人用水沖刷金山來淘金,直到現代機械化露天挖礦(如圖5.10)。比特幣與黃金都從個人操作為主逐步演變為大公司專業運作。另外一個相似點就是,大多數的利潤都被設備製造商拿走了,不管是黃金採掘設備還是比特幣ASIC礦機生產商,而埋單的都是那些希望一夜致富的人。
圖5.10 比特幣和黃金的挖礦進程
註:我們可以看到,比特幣挖礦和黃金採掘進程有一個清晰的類似進程,兩種活動在最初都對個人用戶很友好,但是隨著時間的推移,被大型公司採取集中式大批量運作控制。
未來
現在,用ASIC挖礦是唯一一種可以賺錢的比特幣挖礦手段,但對個體礦工來說,是十分不友好的。人們不禁要問,未來會如何發展?小規模礦工是否永遠不可能再參與到比特幣挖礦中?是否有辦法把小規模礦工重新納入挖礦體系中去?更重要的是,現在使用的ASIC和專業挖礦中心是否已經違反了比特幣當初設計的初衷:一個完全去中心化的系統,在這個系統上裡每個人都能用自己的電腦去挖礦。
此外,如果這已經違背了中本聰對比特幣的最初設計,換成系統只允許CPU來挖礦是不是更好?我們將在第8章探討這些問題,以及一些對ASIC不友好的替代方案。
自我循環週期
事實上,有一些規模較小的另類幣已經使用了和SHA-256不同的解謎算法,但是它們的挖礦發展軌跡和比特幣沒有什麼不同。我們將在第8章到第10章更深入地討論這些另類幣,但是請記住,ASIC的研發和生產有著比較長的時間週期,所以如果一個使用新的解謎算法的另類幣(即使只是在SHA-256的基礎上做一點修改),在有針對性的ASIC面世之前還是會有一段時間。通常跟比特幣一樣,其他另類幣的挖礦發展也會經歷從CPU到GPU,再到FPGA,或者直接到ASIC的過程(前提是這個另類幣非常成功,比如萊特幣)。
因此,小規模礦工的策略也許應該是嘗試一些新的另類幣,在它們的價值還沒有足夠大到吸引大型挖礦集團投資的時候,成為這些另類幣的挖礦先行者,就跟黃金採掘的過程一樣,小規模礦工可以去嘗試那些還沒有被證明儲量的區域。當然,這也意味著先行者們將會面臨一個重大的風險,也就是這些另類幣有可能永遠不會成功。