編者按:區(qū)塊鏈涉及到的技術(shù)很多,從互聯(lián)網(wǎng)底層到不明覺厲的密碼學(xué),可是往往關(guān)注幣價者多而研究技術(shù)的人少。牛市的時候,大家為了炒幣也會努力學(xué)習(xí),熊市的時候,反正也沒啥事,我覺得可以更加努力學(xué)習(xí)。作為一個文科生,我當(dāng)然會有很多理科生看起來覺得很白癡的問題。作為一個記者,我不難找到業(yè)內(nèi)懂的人用人話給我解釋,而且他們往往不會當(dāng)面嫌棄我。
這是小明學(xué)習(xí)筆記第六期,如果有其他有趣問題,歡迎投稿和提問。
———這是華麗麗的正文分割線———
回顧過往,小明學(xué)習(xí)筆記已經(jīng)從周更變成月更,這一篇距離上一篇可以說是季更了。由于我現(xiàn)在的工作主要是編輯了,所以一般是帶著記者出去采訪和寫稿,很少自己單獨(dú)寫稿,所以學(xué)習(xí)筆記的更新估計也是綿綿無絕期。
這期要分享的是礦池,首先要感謝 xDAG 的核心開發(fā)者謝銳,同時他也是 xDAG 官方挖礦軟件的設(shè)計者,年前給我科普了很多這方面的知識。
我最早了解這個行業(yè)是在 2017 年采訪 ViaBTC微比特,當(dāng)時楊海坡總結(jié),礦池就像礦工的聯(lián)盟,把大家聚起來挖礦。這個確實已經(jīng)是礦池非常本質(zhì)而且通俗的解釋。
我們都知道,隨著比特幣而誕生的 PoW 共識機(jī)制,其挖礦的過程本質(zhì)就是在做隨機(jī)數(shù)碰撞,誰猜中者這個隨機(jī)數(shù)誰就可以獲得記賬權(quán)、成為這輪的出塊人。因為是亂猜,所以單位時間內(nèi)猜的次數(shù)越多,猜中的概率就越大。
隨著專業(yè)礦機(jī)等設(shè)備出現(xiàn),比特幣、萊特幣等幣種全網(wǎng)挖礦算力增加,大部分的礦工靠自己SOLo挖礦已經(jīng)很難挖到幣,礦池應(yīng)運(yùn)而生。礦池就像一個聯(lián)盟,把這些零散的礦工甚至是礦場集合起來一起挖礦,按算力占比給礦工收益,這樣既可以增加挖到幣的概率、也可以穩(wěn)定礦工的收入,同時礦池提供的技術(shù)也有利于降低挖礦效率。
礦池究竟把什么任務(wù)給到礦工?
神魚也曾經(jīng)總結(jié),礦池其實就是在分派任務(wù)給大家算。不過,我想知道得更細(xì)節(jié),就是礦工們究竟在算什么?礦池又是怎么分配任務(wù)的呢?
《淺談礦池和礦場(礦池篇)》這篇文章舉了個例子說明挖礦的過程:“礦池將區(qū)塊難度分成很多難度更小的任務(wù)下發(fā)給礦工計算,礦工完成一個任務(wù)后將結(jié)果提交給礦池,叫提交一個 share。假設(shè)全網(wǎng)難度要求 n 的值為 100,即前 100 個比特位為 0,礦池可能會給礦工分配一個任務(wù),要求前 30 位為 0,然后再從所有提交的任務(wù)中,尋找有沒有湊巧前 100 位為 0 的目標(biāo)值。”
謝銳告訴我,理論上,礦池給礦工分配任務(wù)的方式可以有兩種:
第一種,礦池只是一個節(jié)點,打包交易的還是礦工。礦池會把任務(wù)的完整信息給到到礦工,礦工打包交易、然后廣播。礦工知道完整信息,但是需要填的東西比較多,簽名也是礦工簽的。
第二種礦池節(jié)點直接打包,給到礦工的是結(jié)果的中間狀態(tài),或者說非完整信息,礦工填完他要填的東西。塊最后的組合由礦池來做。礦工把 nounce 發(fā)給礦池,簽名是礦池。
“唯一不會變的是,你接入這個礦池的數(shù)據(jù)同步方式。”
看完上面兩種方式,顯然大部分商業(yè)運(yùn)營礦池會選擇第二種,挖礦收益的分配就是按照簽名。如果我既是礦工也是礦池主,兩種沒有區(qū)別,大可選擇第一種。
看到上面說的 nounce 值,你大概會有點懵逼,這其實就是我們常說的 PoW 過程中要碰撞的那個隨機(jī)數(shù),下面還會解釋。
根據(jù)《精通比特幣》一書,挖礦的目標(biāo)是找到一個使區(qū)塊頭哈希值小于難度目標(biāo)的 nonce。前提是選取的交易已經(jīng)確定,說到這里,我們就需要來學(xué)習(xí)一下比特幣的區(qū)塊頭結(jié)構(gòu)。
表格來自《精通比特幣》
在區(qū)塊頭里面,基本上挖礦節(jié)點能改變的東西就兩個:交易和 nounce。既然挖礦的目標(biāo)是讓區(qū)塊頭哈希值小于目標(biāo),整個步驟基本上是:決定你要打包的交易并形成對應(yīng) merkle tree 根——亂猜一個 nounce —— 把 nounce 放到區(qū)塊頭里面哈希一下——才知道有沒有小于目標(biāo)哈希值,即大于目標(biāo)難度。
So,基本上你所選的交易和 nounce,都無助于你“預(yù)知”最后的哈希值大小(nounce 值大,區(qū)塊頭哈希不一定就變大變小),你每一步都只能亂猜。別人一次可能就猜中了,你猜了幾萬次都還沒有中,你唯一能做的就是比別人在同一時間里面猜更多次,這就是礦機(jī)在做的事情——把自己所有的精力都集中起來做一件事。
再說說礦機(jī)的抗 AISC 屬性
說到礦機(jī),我問真的存在抗 ASIC 的算法嗎? 謝銳總體認(rèn)為本質(zhì)上沒有抗 ASIC,不過不同的算法會讓制造 ASIC 礦機(jī)的成本更高。
任何 PoW 幣種都會有一套挖礦算法/軟件,ASIC 芯片就是把這個軟件燒成電路。最早的芯片都是專用的,比如收音機(jī)的芯片只能做收音機(jī)的東西。FPGA(Field Programmable Gate Array) 則是可編程陣列,在硅芯片上施加電壓,一個與門就可以變成非門。這類芯片應(yīng)用范圍更廣,首先上頭成本比ASIC高;而且為了做得更通用,還是有冗余,沒有 ASIC 高效。所以現(xiàn)在大家會在電腦上設(shè)計、在FPGA上設(shè)計,然后燒 ASIC。如此類推,GPU 甚至 CPU 能做的計算類型就更多了。如果想知道 FPGA 具體為什么比 CPU 和 GPU 更高效,可以參考這篇文章。
為什么會有冗余?舉個假設(shè)性的例子(不準(zhǔn)確但有助理解),比如 5 5 ,F(xiàn)PGA 可能沒有 5 這個概念,就要變成 1 1 1 1 1,ASIC就可以直接算 5 5。這讓我想起王嘉平接受 Odaily星球日報采訪時說過一句話:在計算機(jī)領(lǐng)域,靈活性/通用和高效往往是沖突的。
“ASIC 最強(qiáng)的就是并行計算 ,F(xiàn)PGA稍微差一點。其實本質(zhì)上沒有抗ASIC,只能讓它反推的每一步更難,比如要求把東西放在內(nèi)存里算,比如需要算方差,需要把每個數(shù)據(jù)都放進(jìn)內(nèi)存,GPU 到 FPGA 到 ASIC,(ASIC)需要的顯存芯片可能是 GPU 的 100 倍。(要不要研發(fā)某個幣種的 AISIC 礦機(jī))只看成本和收益。”通俗來說,可以理解為研發(fā)一臺挖以太坊的 ASIC 礦機(jī)比研發(fā)比特幣 ASIC 礦機(jī)更難,而且同樣時間下研發(fā)出來的芯片,對比起普通 CPU/GPU 效果提升不明顯。比特幣可能是提升了成千上萬倍,以太可能提升了幾倍到幾十倍,效果劃不來。
類似的分析也可在公開資料看到,比如耳朵財經(jīng)的這段話:
“Ethereum使用了Ethash算法,前身為Dagger算法(Vitailk發(fā)明),其目的是為了抵制ASIC礦機(jī)。如何抵制ASIC礦機(jī)呢?通過將挖礦和內(nèi)存帶寬相捆綁,即降低其他硬件的運(yùn)算優(yōu)勢,從而達(dá)到挖礦設(shè)備平等這一理念。
Ethash算法沒有阻擋ASIC礦機(jī)的出現(xiàn),只是拖延了出現(xiàn)的時間。
綁定內(nèi)存帶寬意味著可以通過提高內(nèi)存帶寬速度來提高算力,或者在相同內(nèi)存帶寬速度下降低功耗,只不過目前內(nèi)存帶寬價格過高以及ETH價格過低,從成本上考慮,ASIC礦機(jī)相較GPU來得不夠劃算。
Litecoin使用的是密碼學(xué)家兼程序員Colin Percival于2009年發(fā)表的論文Stronger Key Derivation via Sequential Memory-hard Functions上所發(fā)明的scrypt算法。原理和Ethash較為相似,都是提高挖礦時內(nèi)存的使用成本,延緩ASIC礦機(jī)的出現(xiàn)。
2014年,Zeusminer研發(fā)出了專門針對scrypt算法的ASIC礦機(jī)。這也說明通過綁定某一硬件(如內(nèi)存)從而抬高挖取的使用成本是沒有辦法完全杜絕ASIC礦機(jī)。”
現(xiàn)在大部分號稱抗 ASIC 的挖礦算法,都是將內(nèi)存和計算捆綁。
以太中文網(wǎng)還整理了一下不同 PoW 算法部署 ASIC 之后挖礦效率增長倍數(shù):
SHA256 約1000倍
Scrypt和NeoScrypt 約1000倍
X11和X16R 約1000倍
Equihash 約100倍
Cuckoo Cycle 約100倍
CryptoNight 約50倍
Ethash 約2倍
礦池的收益分配模式
最后簡單提下礦池的收益分配模式,其實這個已經(jīng)有很多文章解釋過。礦池的分配模式大類有兩種:
第一種是實際出塊情況分幣:時間周期內(nèi),礦池挖到多少塊,就按照算力比例分配所得挖礦收益。
這種方式的時間周期一般按挖出塊的時間為止,即兩次挖到塊的時間之內(nèi)的算力分布比例分配收益;也可以每天結(jié)算,如果你所在的礦池爆了好幾個塊,當(dāng)天的收益就很高,如果礦池一天都沒有挖到什么塊,那么所有人今天都沒有收益。這稱為 PPLNS(Pay Per Last N Shares)。
第二種即按理論值分幣:時間周期內(nèi)(一般是一天),理論上礦池能得到多少收益,按照算力比例給礦工分錢,相比上一種穩(wěn)定。
借用這篇文章里的一個例子:假如在某 10 分鐘,你為某礦池提供了 1 T 算力,當(dāng)時該礦池算力共為 100 T,全網(wǎng)算力 1000 T,比特幣網(wǎng)絡(luò)平均每 10 分鐘出一個塊,出塊獎勵為 12.5 個 BTC,礦池占全網(wǎng)總算力的十分之一,礦池收益期望值為 1.25 個 BTC,你的算力占礦池算力的百分之一,無論礦池是否挖到區(qū)塊,你的收益都是理論收益 1.25 BTC。這種稱為 PPS(Pay Per Share)。由于 PPS 模式下,礦池承擔(dān)風(fēng)險,所以費(fèi)用的比率會更高。
行文至此礦池的基本知識科普得差不多了。突然想起最近(我是在年前采訪的……)看文章看到以太坊的空塊率多了很多,我又順便問了一下礦池為什么要挖空塊,得到的回答是省時間:“挖空塊的好處,不用同步數(shù)據(jù),也不用下載,而且上傳更快,(不過短時間內(nèi))出塊太多會提升難度。”
想知道得更詳細(xì),可以參考《科普入門 | 空塊是什么?為什么礦工要挖空塊? 》這篇文章:
“挖空塊技術(shù)唯一的優(yōu)勢就在于,因為空塊只有一條信息,空塊礦工省去了‘打包’大量信息的時間。這使得空塊礦工挖完這個區(qū)塊,直接就可以開始下一個區(qū)塊的挖礦。
如果是大礦場甚至礦池級別的硬件,這一操作說起來只是節(jié)省了幾秒鐘的時間,不過大礦池幾秒鐘時間的算力,秒秒鐘幾百萬上下真是一點也不夸張啊。
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。