本節和下節將繼續討論比特幣和另類幣的技術相關性,而暫時擱置文化、政治和經濟因素。
另類幣的夭折
截至2015年,比特幣的哈希算力讓所有任何其他另類幣相形見絀。事實上,存在幾個勢力強大的礦工或者礦池,他們控制的挖礦能力高於所有其他另類幣的挖礦能力總和。這樣的礦工或者礦池,可以輕鬆攻擊一個小的另類幣(如果他們也用和比特幣一樣的SHA-256挖礦謎題),通過製造贗品和大規模混亂,最終毀了該另類幣。我們稱這種現象為另類幣的夭折。
用寶貴的挖礦算力去攻擊其他貨幣,並且得不到明顯的金錢回報,為什麼會有人這麼做?以2012年盤旋幣(CoiledCoin)被攻擊為例:比特幣礦池Eligius的總管認為,盤旋幣是個騙局,會對整個加密貨幣的生態系統產生衝擊。所以,Eligus將其挖礦資源全部用在盤旋幣上,製造出的區塊鏈把盤旋幣幾天的交易給對沖掉,同時挖了一條很長的空區塊鏈。這造成了其他盤旋幣用戶無法再使用盤旋幣的服務,也就無法再產生任何新的交易。在盤旋幣經歷了短暫的攻擊後,用戶放棄了盤旋幣,它從此銷聲匿跡。在這個案例,以及其他類似的另類幣夭折的案例裡,攻擊者都是出於金錢以外的動機而發動攻擊的。
共同挖礦
如果一個另類幣複製了比特幣的源代碼但是沒有做任何修改,按道理在這個另類幣上的挖礦是有排他性的。也就是說,你可以去試圖找挖礦謎題的答案從而找到一個有效的區塊鏈,但是只能給另類幣或者比特幣,不能一石二鳥。你可以把你的挖礦資源在比特幣和另類幣上做分配,你甚至可以在多種另類幣上分配資源而且隨時調整配置,但是你無法讓挖礦資源同時服務於多種貨幣。
在這種具有排他性挖礦的條件下,網絡效應會使很多另類幣無法實現自我增強式的循環發展。如果你開發了一個新的另類幣並成功說服當前的比特幣礦工加入你的另類幣體系,為此,他們必須停止比特幣的挖礦,也就意味著他們會立刻產生相關損失。因此,他們沒有動力加入你的另類幣體系,也就意味著你的另類幣很可能只有很低的哈希算力,也就很容易被其他比特幣礦工攻擊並夭折。
是否可以設計出這樣一種另類幣,它可以允許同時在該幣和比特幣上進行挖礦?為了達到這個目的,則必須創造出包含比特幣和該另類幣相互交易的區塊鏈,以使這些交易在兩個區塊鏈均有效。設計可使比特幣的交易出現在其區塊裡的另類幣,這個並不難,我們可以設計任何想要的另類幣的規則。但反過來卻很難。如何把另類幣的交易放入比特幣區塊鏈上?第3章和第8章已經介紹了如何把任意數據放在比特幣的區塊裡,但是這樣做會遇到比特幣特有的帶寬限制,即其數據傳輸量非常有限。
然而還是有巧妙的辦法:雖然不能把另類幣的交易內容放進比特幣的區塊裡,但是可以把另類幣的交易概要以哈希指針的形式放入比特幣區塊中。找一個可以在每一個比特幣區塊裡放入一個哈希指針的辦法很容易。具體來說,回想一下本書曾經提過每個比特幣區塊都有一個特殊的交易,稱為幣基交易,也就是礦工創建新的區塊所得的比特幣獎勵。這種交易的輸入腳本(scriptSig)區域沒有任何內容,因此可以用來存儲任意數據(當然也不需要對幣基交易進行簽名認證,因為沒有任何前序交易)。所以在一個共同挖礦的另類幣體系裡,挖礦的任務就是去計算一類特殊的比特幣區塊,幣基交易的輸入腳本區域存有指向另類幣區塊的哈希指針。
這個區塊現在可以身兼二職:對比特幣客戶端來說,其與任何其他比特幣區塊沒有區別,除了在幣基交易中多了一個可以被比特幣忽略的哈希值。另類幣的用戶知道如何解讀這個區塊:忽略比特幣的交易,只看在幣基交易中的哈希值所指向的另類幣的交易。值得注意的是,這種設計不需要比特幣做任何改變,但是需要另類幣能夠兼容比特幣,並且允許共同挖礦。
如果另類幣支持共同挖礦,那麼我們希望很多比特幣的礦工也參與進來,因為這不需要花任何額外的哈希算力。只需要增加少量的運算資源去處理區塊和交易,以及礦工需要知道和瞭解這個另類幣,就能去花費精力來挖礦了。假如25%的比特幣礦工的哈希算力同時在挖另類幣的礦,這說明,平均25%的比特幣含有指向另類幣的指針,也就意味著,在另類幣體系裡,每隔40分鐘才能產生一個新的另類幣。而更糟糕的是,當另類幣還在自我發展,並且只有小部分的比特幣礦工參與的時候,產生一個新區塊需要幾個小時甚至幾天,這種局面實在讓人無法接受。
有沒有辦法確保參與共同挖礦的另類幣的區塊,能按照穩定的速度產生?或者說,我們是否可以設定區塊產生的速度或高或低,但與比特幣中多少比例的人參與共同挖礦無關?答案是肯定的。奧妙在於,雖然另類幣的挖礦任務和比特幣一樣,但是挖礦的目標不同。另類幣體系計算的目標和困難程度和比特幣體系中的目標和困難程度都沒有關係。就如比特幣可以調整其計算目標使每個區塊按平均每分鐘產生10個的速度一樣,另類幣也可以調整自己的目標使區塊在另類幣體系也以每10分鐘或其他固定值產生一個。
這意味著,另類幣的目標值要遠遠小於比特幣的目標值。部分,甚至是大部分另類幣的區塊將不會被有效的比特幣區塊的指針指引到。但是這並不會帶來問題,你只需要把比特幣區塊鏈和另類幣區塊鏈看成是兩個平行並列的數據鏈,只是偶爾有從比特幣指向另類幣的指針,詳見圖10.5所示。在圖示的例子中,60%的比特幣礦工同時也挖另類幣的礦,另類幣大約5分鐘產生一個。這意味著另類幣的挖礦難度係數是比特幣的60%×5/10=30%。圖中40%的比特幣區塊沒有包含指向另類幣的哈希指針。
圖10.5 共同挖礦
註:圖中顯示了比特幣和另類幣的區塊鏈,以及它們之間的相互作用。
相反,每個有效的另類幣都是比特幣挖礦的結果,但是在所有滿足另類幣的挖礦算法結果中,只有30%能達到比特幣的要求。對於另外70%滿足另類幣要求卻無法滿足比特幣要求的區塊,另類幣的網絡需要驗證這些區塊是否真的符合解決挖礦的謎題。最直接的方法是向比特幣相鄰區塊和另類幣區塊進行廣播。更聰明的方法,是只廣播比特幣相鄰區塊的標題部分和比特幣區域中包含幣基交易的二進制證明。
雖然很罕見,另類幣的謎題也可能比比特幣更難。由於大部分另類幣希望產生區塊的速度要快於每10分鐘一個,這種情況不常見。當然如果希望放慢速度的話,也很容易做到。這種情況下,你就會看到有些礦工挖到比特幣,希望這些也能成為另類幣,但是部分比特幣區塊,在另類幣網絡中,由於達不到更高的難度要求而被拒絕。
最後需要指出,任意數量的另類幣都可以同時和比特幣共同挖礦,每個礦工都可以自由選擇任意另類幣共同挖礦。在這樣多種另類幣組合共同挖礦的情況下,幣基交易的輸入腳本本身就是一個指向多種另類幣的二叉哈希樹結構。注意這種結構的複雜性,因為確認包含另類幣交易需要確認以下幾點:(1)二叉哈希樹包含這個另類幣的證明;(2)二叉哈希樹證明包含幣基交易輸入腳本,而且裡面包含另類幣的哈希值;(3)二叉哈希樹證明比特幣區塊或者附近區塊有幣基交易的輸入腳本。
共同挖礦和安全
共同挖礦是一把雙刃劍。正如本書討論過的,它可以使一個另類幣更易實現自我增長的循環發展,通過增加總算力從而提高其抗攻擊能力。這種情況下,想通過購買算力去破壞另類幣的惡意競爭對手就需要付出巨大的前期投資。
另一方面,有人可能會認為這是一個安全假象。因為惡意競爭對手可以通過共同挖礦來產生比特幣,收回一部分前期投資,同時,使攻擊另類幣的邊際成本變得很小。把惡意競爭者看成規模很大的比特幣礦工,也許更易於理解。事實上,前文提到的夭折的盤旋幣,就是允許共同挖礦的。攻擊者礦池Eligius和參與攻擊者並不需要停止比特幣挖礦就可以展開攻擊。事實上,礦池的參與者甚至都不知道他們的計算資源被用於攻擊另類幣。
另類幣的挖礦謎題趨勢
截至2015年,無論是否允許共同挖礦,很少有另類幣使用和比特幣一樣的SHA-256開採難題。這表明,SHA-256算法被認為是有安全隱患的。Scrypt算法[1]是更受歡迎的選擇,因為它使得比特幣的ASIC在挖礦或者攻擊另類幣上變得毫無用處。不過,用於萊特幣挖礦所製造的Scrypt ASIC礦機可用於攻擊它們。
站在一個理性礦工的角度,當我們思考是否會共同挖礦時,我們會發現共同挖礦有很多安全問題。本書之前曾簡略地談到,只有當期望收益大於期望成本時,挖礦才有意義。對於比特幣挖礦來說,成本主要是計算哈希值。但是對比特幣礦工來說,決定是否和另類幣共同挖礦並不會對哈希計算成本產生影響。額外的成本來自其他方面:計算、帶寬、用於驗證另類幣交易的存儲空間,以及需要使軟件實時更新及在另類幣出現硬分叉或者軟分叉時,做出非正式決定。
這樣的推理引出兩個有洞察力的觀點。第一,共同挖礦有很強的規模效應,因為所有的礦工所花費的成本相同,不管其哈希算力有多大。這與比特幣有明顯差異,因為在比特幣體系中,成本和哈希算力成正比。對於小的低價值另類幣,由於低的哈希算力,一個小的獨立礦工公開挖礦的成本超過了回報,因此其無法獲利。截至2015年,通過挖另類幣獲得的收入只佔了比特幣收入的很小一部分。這預示著,與比特幣體系比,共同挖礦的另類幣將會更具中心化。
有預測指出,大部分礦工會選擇外包來對他們的交易進行驗證。另類幣規模越小,礦工就越有動力去找外包。最簡單的辦法就是加入比特幣礦池。因為礦池通常替代礦工進行運算。礦池管理員驗證比特幣和另類幣區塊交易,收集添加包含另類幣的比特幣區塊。礦工只需專注於解決挖礦謎題並找出需要的數值。這個預測與實際非常貼近。比如,G池(GHash.IO), 曾經最大的比特幣挖礦池,同時允許對域名幣、IX幣(IXCoin)和Dev幣(DevCoin)共同挖礦。這些也同時成為最受歡迎的共同挖礦另類幣。
第二個觀點,從經濟學的角度講,也許更加讓人擔心安全性而不是挖礦能力太集中。如果礦工的主要成本是工作量證明,在這種模式設計下,礦工是無法作弊的。在哈希函數的安全性保障下,挖礦沒有捷徑,並且其他礦工很容易並且也願意去驗證工作量證明。但是如果主要成本變成交易驗證時,以上兩個假設就不成立了。礦工傾向於假設他們收到的交易都是有效的,並不對這個交易做任何其他驗證。而且,礦工如果要去驗證一個區塊及其交易,其工作量就和挖礦一樣。因此,可以預期對於小的共同礦工,他們有動機跳過驗證環節。由於存在不驗證的礦工,攻擊變得更加容易,因為一個惡意的礦工可以創造一個區塊,讓其他礦工對哪條是最長的有效區塊鏈產生爭議。
簡而言之,共同挖礦在解決一個安全問題的同時,卻也產生其他多個問題,部分原因是共同挖礦和單獨挖礦在經濟收益上有重大差別。總體來說,考慮到挖礦攻擊,共同挖礦對一個新的另類幣是否是一個好主意還很難說清。
[1] Scrypt是由著名的FreeBSD黑客Colin Percival為他的備份服務Tarsnap開發的。Scrypt不僅計算所需時間長,而且佔用的內存也多,使得並行計算多個摘要異常困難,因此利用rainbow table進行暴力攻擊更加困難。scrypt沒有在生產環境中大規模應用,並且缺乏仔細的審察和廣泛的函數庫支持。——譯者注