小明學習筆記 | 一文看懂礦池是幹嘛的
編者按:本文來自36氪戰略合作區塊鏈媒體 “Odaily星球日報 ”(公眾號ID:o-daily, APP下載 )。
編者按:區塊鏈涉及到的技術很多,從網際網路底層到不明覺厲的密碼學,可是往往關注幣價者多而研究技術的人少。牛市的時候,大家為了炒幣也會努力學習,熊市的時候,反正也沒啥事,我覺得可以更加努力學習。作為一個文科生,我當然會有很多理科生看起來覺得很白痴的問題。作為一個記者,我不難找到業內懂的人用人話給我解釋,而且他們往往不會當面嫌棄我。
這是小明學習筆記第六期,如果有其他有趣問題,歡迎投稿和提問。
---------這是華麗麗的正文分割線---------
回顧過往,小明學習筆記已經從周更變成月更,這一篇距離上一篇可以說是季更了。由於我現在的工作主要是編輯了,所以一般是帶著記者出去採訪和寫稿,很少自己單獨寫稿,所以學習筆記的更新估計也是綿綿無絕期。
這期要分享的是礦池,首先要感謝 xDAG 的核心開發者謝銳,同時他也是 xDAG 官方挖礦軟體的設計者,年前給我科普了很多這方面的知識。
我最早了解這個行業是在2017 年採訪 ViaBTC微位元,當時楊海坡總結,礦池就像礦工的聯盟,把大家聚起來挖礦。這個確實已經是礦池非常本質而且通俗的解釋。
我們都知道,隨著比特幣而誕生的 PoW 共識機制,其挖礦的過程本質就是在做隨機數碰撞,誰猜中者這個隨機數誰就可以獲得記賬權、成為這輪的出塊人。因為是亂猜,所以單位時間內猜的次數越多,猜中的概率就越大。
隨著專業礦機等裝置出現,比特幣、萊特幣等幣種全網挖礦算力增加,大部分的礦工靠自己solo挖礦已經很難挖到幣,礦池應運而生。礦池就像一個聯盟,把這些零散的礦工甚至是礦場集合起來一起挖礦,按算力佔比給礦工收益, 這樣既可以增加挖到幣的概率、也可以穩定礦工的收入 ,同時礦池提供的技術也有利於降低挖礦效率。
礦池究竟把什麼任務給到礦工?
神魚也曾經總結,礦池其實就是在分派任務給大家算。不過,我想知道得更細節,就是礦工們究竟在算什麼?礦池又是怎麼分配任務的呢?
《淺談礦池和礦場(礦池篇)》 這篇文章舉了個例子說明挖礦的過程:“礦池將區塊難度分成很多難度更小的任務下發給礦工計算,礦工完成一個任務後將結果提交給礦池,叫提交一個 share。假設全網難度要求 n 的值為 100,即前 100 個位元位為 0,礦池可能會給礦工分配一個任務,要求前 30 位為 0,然後再從所有提交的任務中,尋找有沒有湊巧前 100 位為 0 的目標值。”
謝銳告訴我,理論上,礦池給礦工分配任務的方式可以有兩種:
第一種,礦池只是一個節點,打包交易的還是礦工。礦池會把任務的完整資訊給到到礦工,礦工打包交易、然後廣播。礦工知道完整資訊,但是需要填的東西比較多,簽名也是礦工籤的。
第二種礦池節點直接打包,給到礦工的是結果的中間狀態,或者說非完整資訊,礦工填完他要填的東西。塊最後的組合由礦池來做。礦工把 nounce 發給礦池,簽名是礦池。
“唯一不會變的是,你接入這個礦池的資料同步方式。”
看完上面兩種方式,顯然大部分商業運營礦池會選擇第二種,挖礦收益的分配就是按照簽名。如果我既是礦工也是礦池主,兩種沒有區別,大可選擇第一種。
看到上面說的 nounce 值,你大概會有點懵逼,這其實就是我們常說的 PoW 過程中要碰撞的那個隨機數,下面還會解釋。
根據《精通比特幣》一書,挖礦的目標是找到一個使區塊頭雜湊值小於難度目標的 nonce。前提是選取的交易已經確定,說到這裡,我們就需要來學習一下比特幣的區塊頭結構。
在區塊頭裡面,基本上挖礦節點能改變的東西就兩個:交易和 nounce。既然挖礦的目標是讓區塊頭雜湊值小於目標,整個步驟基本上是:決定你要打包的交易並形成對應 merkle tree 根——亂猜一個 nounce —— 把 nounce 放到區塊頭裡面雜湊一下——才知道有沒有小於目標雜湊值,即大於目標難度。
So,基本上你所選的交易和 nounce,都無助於你“預知”最後的雜湊值大小(nounce 值大,區塊頭雜湊不一定就變大變小),你每一步都只能亂猜。別人一次可能就猜中了,你猜了幾萬次都還沒有中,你唯一能做的就是比別人在同一時間裡面猜更多次,這就是礦機在做的事情——把自己所有的精力都集中起來做一件事。
再說說礦機的抗 AISC 屬性
說到礦機,我問真的存在抗 ASIC 的演算法嗎? 謝銳總體認為本質上沒有抗 ASIC,不過不同的演算法會讓製造 ASIC 礦機的成本更高。
任何 PoW 幣種都會有一套挖礦演算法/軟體,ASIC 晶片就是把這個軟體燒成電路。最早的晶片都是專用的,比如收音機的晶片只能做收音機的東西。FPGA(Field Programmable Gate Array) 則是可程式設計陣列,在矽晶片上施加電壓,一個與門就可以變成非門。這類晶片應用範圍更廣,首先上頭成本比ASIC高;而且為了做得更通用,還是有冗餘,沒有 ASIC 高效。所以現在大家會在電腦上設計、在FPGA上設計,然後燒 ASIC。如此類推,GPU 甚至 CPU 能做的計算型別就更多了。如果想知道 FPGA 具體為什麼比 CPU 和 GPU 更高效,可以參考 這篇文章 。
為什麼會有冗餘?舉個假設性的例子(不準確但有助理解),比如 5+5 ,FPGA 可能沒有 5 這個概念,就要變成 1+1+1+1+1,ASIC就可以直接算 5+5。這讓我想起王嘉平接受 Odaily星球日報採訪時說過一句話:在計算機領域,靈活性/通用和高效往往是衝突的。
“ASIC 最強的就是平行計算 ,FPGA稍微差一點。其實本質上沒有抗ASIC,只能讓它反推的每一步更難,比如要求把東西放在記憶體裡算,比如需要算方差,需要把每個資料都放進記憶體,GPU 到 FPGA 到 ASIC,(ASIC)需要的視訊記憶體晶片可能是 GPU 的 100 倍。(要不要研發某個幣種的 AISIC 礦機)只看成本和收益。”通俗來說,可以理解為研發一臺挖以太坊的 ASIC 礦機比研發比特幣 ASIC 礦機更難,而且同樣時間下研發出來的晶片,對比起普通 CPU/GPU 效果提升不明顯。比特幣可能是提升了成千上萬倍,以太可能提升了幾倍到幾十倍,效果划不來。
類似的分析也可在公開資料看到,比如耳朵財經的這段話:
“Ethereum使用了Ethash演算法,前身為Dagger演算法(Vitailk發明),其目的是為了抵制ASIC礦機。如何抵制ASIC礦機呢?通過將挖礦和記憶體頻寬相捆綁,即降低其他硬體的運算優勢,從而達到挖礦裝置平等這一理念。
Ethash演算法沒有阻擋ASIC礦機的出現,只是拖延了出現的時間。
繫結記憶體頻寬意味著可以通過提高記憶體頻寬速度來提高算力,或者在相同記憶體頻寬速度下降低功耗,只不過目前記憶體頻寬價格過高以及ETH價格過低,從成本上考慮,ASIC礦機相較GPU來得不夠划算。
Litecoin使用的是密碼學家兼程式設計師Colin Percival於2009年發表的論文Stronger Key Derivation via Sequential Memory-hard Functions上所發明的scrypt演算法。原理和Ethash較為相似,都是提高挖礦時記憶體的使用成本,延緩ASIC礦機的出現。
2014年,Zeusminer研發出了專門針對scrypt演算法的ASIC礦機。這也說明通過繫結某一硬體(如記憶體)從而抬高挖取的使用成本是沒有辦法完全杜絕ASIC礦機。”
現在大部分號稱抗 ASIC 的挖礦演算法,都是將記憶體和計算捆綁。
以太中文網 還整理了一下不同 PoW 演算法部署 ASIC 之後挖礦效率增長倍數:
SHA256 約1000倍
Scrypt和NeoScrypt 約1000倍
X11和X16R 約1000倍
Equihash 約100倍
Cuckoo Cycle 約100倍
CryptoNight 約50倍
Ethash 約2倍
礦池的收益分配模式
最後簡單提下礦池的收益分配模式,其實這個已經有很多文章解釋過。礦池的分配模式大類有兩種:
第一種是實際出塊情況分幣:時間週期內,礦池挖到多少塊,就按照算力比例分配所得挖礦收益(一般不包括手續費)。
這種方式的時間週期一般按挖出塊的時間為止,即兩次挖到塊的時間之內的算力分佈比例分配收益;也可以每天結算,如果你所在的礦池爆了好幾個塊,當天的收益就很高,如果礦池一天都沒有挖到什麼塊,那麼所有人今天都沒有收益。這稱為 PPLNS(Pay Per Last N Shares)。
第二種即按理論值分幣:時間週期內(一般是一天),理論上礦池能得到多少收益,按照算力比例給礦工分錢,相比上一種穩定。
借用這篇文章裡的一個例子 :假如在某 10 分鐘,你為某礦池提供了 1 T 算力,當時該礦池算力共為 100 T,全網算力 1000 T,比特幣網路平均每 10 分鐘出一個塊,出塊獎勵為 12.5 個 BTC,礦池佔全網總算力的十分之一,礦池收益期望值為 1.25 個 BTC,你的算力佔礦池算力的百分之一,無論礦池是否挖到區塊,你的收益都是理論收益 1.25 BTC。這種稱為 PPS(Pay Per Share)。由於 PPS 模式下,礦池承擔風險,所以費用的比率會更高。
行文至此礦池的基本知識科普得差不多了。突然想起最近(我是在年前採訪的……)看文章看到以太坊的空塊率多了很多,我又順便問了一下礦池為什麼要挖空塊,得到的回答是省時間:“挖空塊的好處,不用同步資料,也不用下載,而且上傳更快,(不過短時間內)出塊太多會提升難度。”
想知道得更詳細,可以參考 《科普入門 | 空塊是什麼?為什麼礦工要挖空塊? 》 這篇文章:
“挖空塊技術唯一的優勢就在於,因為空塊只有一條資訊,空塊礦工省去了‘打包’大量資訊的時間。這使得空塊礦工挖完這個區塊,直接就可以開始下一個區塊的挖礦。
如果是大礦場甚至礦池級別的硬體,這一操作說起來只是節省了幾秒鐘的時間,不過大礦池幾秒鐘時間的算力,秒秒鐘幾百萬上下真是一點也不誇張啊。
一般情況下,礦池是不喜歡挖到空塊的。畢竟節省那點時間,也值不到收益的 6%~8% 啊。
最後就是區塊鏈網路維護的問題了,如果大量的區塊變成空塊的話,需要傳遞的資訊流通不了,也會造成區塊鏈網路的大堵塞,堵塞帶來的區塊鏈網路效能下降是有可能降低數字貨幣價格的。
目前以太坊的空塊率變高,可能是和即將到來的挖礦收益降低有關的,想著趁一個區塊還獎勵三個以太坊趕緊多挖點屯著。”
我是Odaily星球日報編輯盧曉明,探索真實區塊鏈,爆料、交流請加lohiuming,煩請備註姓名、單位、職務和事由。
之前第一期學習的是虛擬機器( 《小明學習筆記 | 一文看懂區塊鏈跨鏈機制》 ),第二期是跨鏈( 《小明學習筆記 | 一文看懂區塊鏈虛擬機器》 ),第三期 《小明學習筆記 | 一文看懂網際網路TCP/IP協議》 ,第四期是《 小明學習筆記 | 一文看懂可驗證隨機函式VRF 》,第五期是《 小明學習筆記 | 看不懂 BCH 算力大戰怎麼才結束?點這裡 》
參考文章:
FPGA與CPU、GPU、ASIC的區別,FPGA在雲端計算中的應用方案