你若是想加入比特幣挖礦行列,我們不會極力勸阻你,但會提醒你比特幣挖礦潮很像當年的淘金熱。歷史上的淘金熱充斥著各種年輕的淘金者下海淘金發財的故事,並且不可避免地,許多人最終失去了一切。在這些確實經歷了千辛萬苦的人們當中,也只有少數人變得富有。我們將在本章中瞭解到,和傳統淘金以及其他快速致富途徑一樣,比特幣挖礦也面臨著類似的挑戰和風險。我們首先要看一下技術細節。要成為比特幣礦工,你必須加入比特幣網絡並與其他節點相聯。建立鏈接之後,還有六個任務要完成:
1.監聽交易廣播。監聽網絡上的交易廣播,然後驗證它們的簽名是正當有效的,交易輸出沒有被重複支付。
2.維護區塊鏈網絡和監聽新的區塊。必須先維護區塊鏈。為了做到這一點,一開始你可以要求其他節點把區塊鏈上的歷史記錄(在你加入區塊鏈網絡之前的)同步過來。然後,監聽那些被廣播到網絡上的新的區塊。你的任務是驗證你收到的每個區塊,這裡的驗證是指保證區塊裡的每筆交易都是有效的,而且這個區塊包含了一個有效的隨機數。我們會在本章後面談到驗證隨機數的技術細節。
3.組裝一個備選區塊。一旦擁有最新的全部區塊鏈數據備份,你就可以開始製造你自己的區塊了。要做到這一點,你要把所監聽到的交易進行組合併放進一個新的區塊,然後把該新區塊排在整條鏈中最新的區塊的後面。你必須保證你建立的新區塊裡的每筆交易都是正當有效的。
4.找到一個讓你的區塊有效的隨機數。這一步的工作量最大,也是礦工工作中最難的一個環節。我們後面會談到細節。
5.希望你的區塊被全網接受。即使你找到了一個區塊,也不能保證該區塊會成為共識鏈(concensus chain)的一部分。這需要有點運氣,希望其他的礦工接受你的區塊,然後從該區塊開始繼續接龍下去,而不是從你的競爭對手發現的區塊開始。[1]
6.利潤。如果所有其他礦工接受了你的區塊,那你就能獲取利潤。在2015年,一個區塊的獎勵是25個比特幣,大約在10 000美元左右。此外,如果在該區塊裡的任何交易都有交易費,所有交易費也會為礦工所有。到目前為止,交易費作為額外收入,相對來說還比較低,大概是一個區塊默認獎勵的1%。
我們可以把礦工的任務分成兩類:第一類任務是驗證交易和區塊,這是比特幣網絡賴以生存和運轉的基礎。這些任務也是比特幣協議需要礦工的首要原因。第二類任務是和其他礦工競爭,爭取可以找到區塊並因此獲益。這些任務並不是比特幣網絡存在所必需的,而是為了鼓勵礦工去完成第一類任務而設置的。當然,這兩類任務都是使比特幣成為一個數字貨幣的必要條件,因為礦工必須獲得獎勵才會去完成這些重要的任務。加 入 會 員 微 信
尋找有效區塊
現在回到如何找到一個使區塊有效的隨機數的問題上。在第3章中我們討論過,區塊鏈主要有兩層基於哈希函數的結構。第一層在是區塊鏈上,每個區塊的頭部都有一個指針指向其前一個區塊,第二層是在每一個區塊裡,包括所有交易的梅克爾樹。
作為礦工,首先需要從你的交易池中選出一系列有效的交易並且編譯成梅克爾樹。當然,只要不超過每個區塊隨機數的交易上限,你可以選擇編譯的交易數量。然後,組裝出一個新的區塊,讓它的頭部指向區塊鏈上的前一個區塊。新區塊的頭部,有一個32位的隨機數區域。你需要嘗試不同的臨時隨機數,直到該隨機數能使整個區塊的哈希值小於目標值。這個目標值一般體現為以零開始的特定位數的數值。作為一名礦工,你可能使隨機數從0開始,每次增加數值1,直到該隨機數能使區塊有效為止,如圖5.1所示。
圖5.1 尋找有效區塊
註:在這個例子中,礦工嘗試了一串都是零的臨時隨機數,但沒有產生有效的哈希值,所以礦工繼續嘗試其他不同的臨時隨機數。
在大多數情況下,隨機數試過所有32位可能的取值後,仍然不能產生一個有效的哈希值,這時候你必須做出更多的改變。注意,圖5.1中幣基(coinbase)還有一個隨機數可以改動。當你遍歷區塊頭部隨機數所有可能的取值後,可以改變幣基裡的隨機數,比如加1,然後可以重新改變區塊頭部隨機數來尋找有效的哈希值。
當改變幣基裡的隨機數後,整個梅克爾樹上交易的哈希值都會改變(見圖5.2),因為幣基值的改變會向上傳遞,所以改變幣基的隨機數值比改變頭部隨機數值的代價要大很多。正因為如此,礦工大部分時間只改動頭部的隨機數,只有在遍歷頭部232個隨機數值且還沒有找到一個有效區塊時,才改動幣基的隨機數。
圖5.2 改變臨時隨機數
註:改變幣基裡的臨時隨機數,整個梅克爾樹的哈希值都會因此而改變。
你所嘗試的絕大多數臨時隨機數都不會成功,但若能夠堅持足夠長的時間,你總能找到一對正確的臨時隨機數組合——頭部隨機數與幣基隨機數,用來產生一個符合哈希值要求的新區塊。找到後要立即宣佈,就有希望得到相應的區塊獎勵。
每個人都在運算同一個謎題嗎?
你可能會想,如果每個礦工都在臨時隨機數值上逐步加1,豈不是大家都在按照同一個運算模式解同樣的謎?豈不是最快的一個總贏得競爭嗎?不會的。首先,礦工們不太可能在完全相同的一個區塊上進行運算,因為每個礦工都會把或多或少不同的交易用不同的次序來放進區塊內。但更關鍵的是,就算兩個不同的礦工所組建的區塊裡包括了一模一樣的交易,這兩個區塊的哈希值還是會不同。請記住在幣基交易裡,礦工會寫自己的地址接收新鑄幣。這個地址本身的區別會沿著梅克爾樹往上傳遞直達樹根,導致整棵樹上的哈希函數值不同,從而保證了沒有兩個礦工的區塊是一樣的。除非兩個礦工共享公開密鑰。這種情況只有可能兩個礦工同在一個礦池(我們以後會討論)。同在一個礦池的礦工會互相通信,確保使用不同的幣基臨時隨機數以避免重複工作。
找到一個有效區塊到底有多難?到2015年年底,這個挖礦的難度目標區域值(用16進制來表示)為:
所以任何有效區塊的哈希值必須低於這個值。換句話說,大約268個臨時隨機數里只有不到一個可以成功,這是一個非常巨大的數值。一個粗略的估計,它比全球人口總和的平方還要大。也就是說,如果地球上的每個人都是一個包含7億人口的獨立星球,那麼總人口將會是265。
決定難度
每挖出2 016個區塊,挖礦難度會改變一次,這個週期大約是兩個星期。難度的改變是根據上2 016個區塊的挖礦效率來決定的。用下列公式來表達:
注意,2 016× 10分鐘就是兩周,也就是說,如果產生一個區塊需要10分鐘,那麼產生2 016個區塊就需要兩周時間。所以這個公式的意義就是,測量全網難度進而維持平均每10分鐘產生一個新的區塊的速度。挖礦難度改變的週期是兩周,並沒有什麼特別的意義,只不過是一個權衡之下的結果。如果這個週期太短,難度會隨著每一個週期找到的區塊的數目的不同而波動(概率問題)。如果太長,整個網絡的哈希算力會與難度大大地失去平衡(難度的調整滯後於計算能力的變化)。
每個比特幣礦工獨立地計算難度,只接受達到這個難度的區塊。兩個在不同分叉上的礦工可能會有不同的計算難度,但在同一個區塊工作的礦工一定會對計算難度達成共識。
圖5.3中顯示,挖礦難度會隨著時間不斷地增加。其增加不一定是穩定線性或者是指數型,而是取決於市場行為。挖礦難度會受到有多少新礦工加入的影響,新礦工的加入本身又由比特幣的當前價格來決定。總的來說,當越來越多的礦工加入並且挖礦的硬件設備效率越來越高,找到有效區塊所花費的時間就會越短,緊接著難度就會增加,直到重新回到每10分鐘找到下一個有效區塊。
在圖5.3中,雖然整個網絡的哈希速度是平滑向上增長的,那條實線代表的難度卻呈現階梯函數式增長。這是因為每產生2 016個區塊才會調整計算難度。
圖5.3 挖礦難度隨時間變化(2014年年中)
註:y軸開始於80 000TH/s(全網算力)。哈希速度是基於超過1 008個區塊計算出來的平均值。
資料來源:bitcoinwisdom.com
可以從另外一個角度來看網絡增長率,即看平均要多長時間才能找到一個有效區塊。圖5.4(a)展示出區塊鏈上兩個連續區塊產生的間隔時間是多少秒。它逐漸下降,跳升,又逐漸下降。當然產生這種現象的原因就是每2 016個區塊之後,難度重新被設定,找到區塊的時間又重新回到大約10分鐘。雖然一個調整週期內難度都不會變,但是隨著越來越多的礦工加入,全網哈希算力增加而難度不變,找到有效區塊的速度越來越快,直到大概兩個星期內2 016個區塊被發現之後,難度會被重新調整。
圖5.4(a)找到一個有效區塊所花費的時間(2014年早期)
註:y軸開始於460秒。找到一個有效區塊花費的時間是2 016個區塊樣本花費時間的平均值。由於當時全網挖礦速度的連續快速增長,找到一個有效區塊所花費的時間在兩周的時間內穩步減少。
資料來源:bitcoinwisdom.com
圖5.4(b)找到一個有效區塊所花費的時間(2015年早期)
註:y軸開始於540秒。找到一個有效區塊花費的時間是2 016個區塊樣本建造時間的平均值。由於整個網絡增長開始減速,所以找到有效區塊的平均時間非常接近10分鐘,偶爾還會因為全網算力縮小而超過10分鐘。
資料來源:bitcoinwisdom.com
即使找到有效區塊的時間目標被設定為平均10分鐘,但是在2013年和2014年的大多數時間,這個時間平均是9分鐘左右,並且在兩周的週期末尾階段時接近8分鐘。計算表明,全網運算能力的增速大概是每兩周25%,或者每年幾百倍,這個數字非常驚人。
不出所料,這種增長不會無休止地進行,2015年的增速就降低很多(偶爾也會負增長)。在圖5.4(b)中,我們可以看到全網哈希算力達到了一個穩定的狀態,發現每個區塊的時間非常接近10分鐘,甚至有時會超過10分鐘,在這種情況下難度將會被調低。這種曾經被認為不可想像的狀況卻在2015年頻繁發生。
雖然到目前為止,全網哈希算力還沒有經歷過災難性的倒退,但是並不排除它發生的可能性。一個有關比特幣崩盤的設想被稱作「死亡螺旋」,不斷下降的比特幣價格導致挖礦無利可圖,礦工們因此而退出挖礦(全網運算能力下降),繼而進一步導致價格下跌。
[1] 如果下一個區塊始於其他人發現的有效區塊,你發現的這個區塊就會變成無效區塊而被丟棄。——譯者注