跳到主要內容

關於架設礦池 (Mining Pool),淺談「那些別人不會跟你講的事」



架設一個「Functionable」的礦池其實很簡單,到 GitHub 把別人寫好的 Node.js Mining Pool 直接搬回家裝一裝馬上就能上線了,但實際上運行起來還是有很多眉眉角角的存在,不過這些細節未必是別人不會跟你講,有時候反而是「別人覺得你應該知道」。如果對於有相關經驗的人來說這些可能都只是常識,對我來講並不是,所以我也會假設其他人都跟我一樣因而寫了這篇「圖解礦池架設」,就是想讓同樣有興趣架設礦池的新手能用比較熟悉的圖形介面去操作。

目前各個加密貨幣佔全網算力 10% 以上的礦池不在少數,我完全能理解大家喜歡在幾分鐘就出塊的礦池挖礦 (實際上我也是),但這種超大型礦池的存在一方面也就違反的去中心化的初衷,完全的去中心化是不可能也不合理的,不過能有更多的礦池來維護整體網路的節點也絕非壞事,所以才會想從粗淺的技術面向去討論礦池架設,讓有興趣的人能了解更多細節,也從完全 Newbie 的角度去談談「那些別人不會跟你講的事」。


而這篇會以「CryptoNight」算法的礦池為例,代表的加密貨幣包括「門羅幣」Monero (XMR)、Electroneum (ETN)、Bytecoin (BCN) ...等。這個算法的特性在於可以使用 CPU 挖礦、硬體門檻低、抗 ASIC 設計,可以說是對實現去中心化的作法比較具體而且嚴格。



Chapter 1 礦池選擇

這邊講的並不是選擇要挖哪個幣,CryptoNight 算法的貨幣都可以通用同一個礦池架構。實際上困難的部分都有箇中翹楚先幫你做好了,光在 GitHub 上就能看到好幾十個版本的 CryptoNight 礦池,就我所瞭解所有的分支都是從 @zone117x 的 node-cryptonote-pool 分叉而來的,這個最原始的版本即使在現在還是非常輕便好用,並不佔據太多的伺服器資源。同類型我看到功能最完善的大概是 @SadBatman 的版本,但很可惜它的有些功能是只設計給 Sumokoin 使用的,很多新部件都直接在 Javascript 內寫死,並不會自動抓取 Config 檔,為了把它套用在 ETN 上也是花了我不少腦細胞。

還有另一個赫赫有名的分支就是 @Snipa22 的版本,大家最熟悉的 SupportXMR 就是使用這個版本架設而成的,但因為它多了註冊登入的功能 (這部分會用到 MySQL Database),對我來說管理上比較麻煩也消耗更多的資源而因此作罷,何況我自己也是非常討厭註冊會員的人,更不要說去管理了。

目前看到最完整的礦池版本包括以下額外功能 :
  • TLS/SSL 連線
  • 健康狀態監控
  • Email 通知
  • 自訂起付額
  • 自訂礦工名稱
  • 個別礦工圖表
  • 出塊獎勵預測
其實這些也都不是多瞎趴的功能,但當別人的礦池有你卻沒有那差距就出來了,都已經沒巨量算力吸引人了細節總要加減顧一下。




Chapter 2 技術困難 

礦池的運作邏輯其實很簡單,單純就是一架一個節點 (Node) 和隨時可以轉帳的錢包然後讓別人連線進來挖礦,每個人上繳的 Shares 都紀錄在 Redis 資料庫裡,有出塊就按照比例大家一起分贓,所有數據再輸出成 API 從網頁介面呈現出來讓礦工可以查看。 
我原本想更有條理的去討論每一個環節遇到的問題,但發現其實問題就是莫名其妙一大堆根本沒有條理,所以只會大概提幾個代表。

     Section 1 作業系統

在架設礦池的作業系統大概分成兩種,分別是 Linux 和 Windows Server,Windows Server 我沒用過但聽說是微軟出的整人道具所以不討論。而且目前大部分網路上能找到的資料也都是基於 Linux 系統或 Docker 的環境,所以一定是推薦用 Linux 啦,但要用哪個發行版呢?其實我覺得沒什麼差,礦池並不是真的會讓伺服器附載量超大或完全不能接受斷線的進程 (可能掉一兩個 Shares),但如果你到網路上去找推薦的作業系統多半得到的結果就輕量穩定選 Debian 或 CentOS、專業選 Red Hat、新潮選 Ubuntu Server,當然這些都是很主觀 (甚至很固著) 的評價,也像我說的礦池並不是對伺服器環境要求很嚴苛的進程所以可以選擇自己習慣的作業系統就好了。

那我選擇 Ubuntu Server 主要是社群中新的資料比較完備 (雖然大部分是 Desktop 版本的但都通用),加上本身也比較熟悉 Ubuntu 的操作 (不過在 SSH 裡其實也都是一個樣)。當然如果你是租用 GCP 或 AWS 等雲端主機可能沒這麼多選擇,而且它們提供的也都是已經虛擬化的機器所以也不適合再去用 ESXi 做虛擬化管理,那就只好有什麼 Linux 就用什麼囉。


     Section 2 TLS/SSL

礦工跟礦池的連線需要加密,礦池網站連線也需要加密,API 也要加密,基本上現在什麼都需要 TLS/SSL,尤其是網站架設的部分,Google 搜尋引擎已經確認了會優先收錄 HTTPS 安全連線的網頁,而大部分的挖礦程式也早已開始支援 TLS/SSL 的連線。

這部分會先從礦池埠口 (Port) 的加密連線開始說起,在我一開始安裝的礦池版本是沒有這個功能的所以我一直很鬼打牆的想要靠 Reverse Proxy 來達成,其實 Proxy 本身並沒有問題但我一直把他想成熟悉的 HTTP Protocol,一直想靠 Nginx 做一個反向代理來加密挖礦埠口,這個想法就跟想把一台汽車開在水上一樣蠢,因為不同的傳輸協定就像講著不同的語言,就算成功傳了過去對方的接口也是聽不懂。所以最後還是去找比較新版本的礦池來將功能移植過來再加上「Let's Encrypt」的 SSL 憑證才完成的。
而網頁伺服器大部分人應該都會想到使用 Apache、Nginx 加上憑證就可以成功升級 HTTPS,但我真的對寫落落長的 Config 檔很感冒,所以推薦一個會自動簽發憑證、設定檔簡短的的伺服器「Caddy」,它會將架設的網站直接預設為 SSL 連線 (自動幫你用 Certbot) 而且 Config 檔只要一行就可以正確運行了,大部分的功能也都算完備 (Proxy、Gzip、Cache ...等),但需要注意的是伺服器端的 Cache 是需要額外裝插件的,如果懶得用可以用 Cache-Control 開啟瀏覽器端快取的控制就好。
而網頁介面會抓取 API 提供的數據加以圖形化,所以 API 也得要用 SSL 傳輸才可以,不然在以加密的連線中呼叫未加密的物件會被瀏覽器拒絕,作法其實是和礦池本體一樣的就不多贅述。

     Section 3 網站優化

這部分其實並不困難,單純是因為礦池為了讓你可以隨裝即用寫了非常多 Javascript 去抓取 Config 檔,所以你只要改好 Config 檔礦池網站幾乎就可以直接上線了,以及外連了不少 JS 腳本和 CSS 樣式表,這兩部分對 SEO (搜尋引擎最佳化) 都是不太友善的做法,所以我們要做的事就是盡可能把不必要的 JS 刪掉改成更容易檢索的元素,以及自己 Host 所有的外連檔案並且把同類型的檔案合併,我做的更絕一點就是直接給它一個 <script> 或 <style> 然後全部塞進去,這樣連外連都免了。
寫程式要做 Code Beautify (排版),但網頁要上線卻剛好相反,最好的情況就是原始碼都擠在一起想看都看不懂,這樣才能將網頁大小降到最低、瀏覽器解析速度提升到最快,所以要善用「JS Compressor」和「CSS Compressor」來將程式碼壓縮。
以及所有靜態元素都要快取 (Cache),可以將「JS、CSS、IMG」全部整理在一個資料夾內然後用你習慣的架站伺服器針對這個資料夾設定一個禮拜以上的瀏覽器快取。

可以藉由 Google PageSpeed Insights 來看看你的網站目前優化的如何,也可以根據 Google 所提供的建議來去修正網站,雖然並不是每一個項目都會直接影響到 SEO 但絕對會反應在使用者的感官上,如果礦池網站載入速度慢人家可能就會覺得伺服器品質不好所以不挖了 (雖然根本是兩個不同的系統)。




Chapter 3 算力告急

這大概是所有剛起步的礦池都會遇到的問題吧,我目前也是非常煩惱算力不夠導致出塊頻率低的情況,畢竟要好幾天才能出一個區塊對礦池來說真的是一點都不討喜,那目前唯一能做的就是盡量完善礦池的功能和一直到 PTT 業配自己的礦池。其實光從礦池選擇上就反應了去中心化是一件很難達成的事,大家都會想十分鐘出一次區塊、每天收一次付款,而且經營已久的大礦池 (Nanopool、Mining Pool Hub) 又提供超多貨幣的礦池,造成不少新興小幣的挖礦事業都被固定大戶給包走了。

出塊頻率低就有點像抽樂透,如果小於理論時間就出塊那等於是大賺,像我一開始去 Nicehash 買算力來挖,因為運氣好的關係最後的收益是花費的兩倍,但一定就會有相反的情況,可能挖了半天就是不出塊,大家也分不到錢。因此在礦池中加了「預估下次出塊獎勵」讓大家可以看到下一次能拿到多少,也算是一種挖礦動力吧。




Chapter 4 待解的問題

其實最初會想要架礦池是為了 Bypass Coinhive,我本身應該可以算是奈米戶裡面的重度使用者了,在 Coinhive 的平均算力可以達到 2000 H/s 以上,所以就想架一個礦池讓所有 JS Miner 連線到自己的礦池,一來避掉了三成手續費,二來我想靠超低難度的挖礦埠口讓收益最大化,但現實往往沒我想的順利,我所說的其實我都做到了,但在超低難度的情況下會很平凡的出 Shares 對礦池來說是不小的附載,如果改成浮動難度又非常容易被 Timeout (實際上可能是對方已經跳出網頁),種種的因素造成附載量最小化和收益最大化無法兼顧,可能會需要一個更好的礦池機制來去針對網頁挖礦優化,所以這部分就暫時告吹了。

也不得不說 Coinhive 收三成手續費其實有它的道理在,第一它是用 Hashes 計算收益並不是 Shares,在瀏覽器挖礦時其實算力非常低 (Ryzen5 1600 只能跑 100H/s),要挖到出 Share 其實是有點難度的,它直接以 Hashes*0.7 計價我個人認為是合理的,這部分我也曾經寫信去靠北過怎麼收這麼多,當時它回應我它們其實賺的沒有大家想像的多甚至有時會賠本經營,我現在開始有點相信它了,但那 Coinhive 到底賺什麼?由於 Monero 手續費非常高,大部分礦池也都有設定較高的起附門檻甚至得自行負擔轉帳費,Coinhive 也不例外,要達到 0.5 XMR 才能免手續費,我猜它就是賺那些永遠領不出來的 Dust,光用想的就覺得很可怕,因為要靠網頁挖礦挖到 0.5 XMR 可不是簡單事啊。




P.S.

有關於礦池架設的資源在網路上其實一點都不少,只是多半都是英文的資料,我自己習慣要查什麼也都是用英文來找,有遇到任何問題其實可以翻一翻 GitHub 的 Issues,裡面往往有不少前人也可能遇過同樣的困難。 
再講一些廢話,其實整個幣圈的中文資源一點都不少,技術向的文章可以說是寫的會讓人看到痛哭流涕那種,但不知道為何從 Google 搜尋非常多關鍵字最後跳出來的都是那幾個專 PO 拔辣新聞的媒體網站,好的文章反而都被埋沒了,這點真的是滿讓人不解的,如果想找有內容的文章可以上 Medium 這個平台逛逛,有滿多不錯的資源。


最後還是廣告一下自己的礦池 : 台灣 Monero 礦池



留言

  1. 矿池的出币的速度跟什么有关呢?一样的矿机在不同的矿池上面出币的速度不一样是什么原因呢?

    回覆刪除
  2. 挖賽,原來那個礦池是大大的,失敬失敬

    回覆刪除
  3. 請問你還有在架礦池嘛?我有問題想請教你一下?可以跟你連絡嘛?感謝您

    回覆刪除

張貼留言



這個網誌中的熱門文章

Linux (Ubuntu) 查詢硬碟容量、剩餘大小指令

在 Ubuntu Desktop 版本或有安裝 GUI 像 Xfce 的 Server 版本當然可以直接從圖形介面查看硬碟容量和已經使用的大小, 但如果是在純 CLI 版本或使用 SSH 連線時呢?那就需要用到指令了。 顯示硬碟容量、已使用、可用大小。 df -h 查詢資料夾所占硬碟的大小。 du -h 查詢檔案大小 ls -l

吃光硬碟讀寫的大怪獸 - Superfetch 是什麼?可以關嗎?

Superfetch 是 Windows 內建的硬碟快取功能,它會預先將檔案讀取起來到 Ram 裡方便稍後做使用,所以常常在工作管理員內都可以看到 Superfetch 往往占掉了不少的硬碟使用量,那這樣的情形是好的嗎?其實理論上並不會有太大影響,畢竟 Superfetch 只是將等會要讀取的內容先預置在 Ram 中,如果不趁硬碟負載小的時候優先讀取,之後反而可能忙不過來呢。當然如果你是使用 SSD 的話可能會為使用壽命擔心, 高頻率的讀取可能加速固態硬碟老化,那在讀取速度原本就很快的 SSD 當然就相對的沒有必要開啟 Superfetch 了。 Superfetch 在電腦待機時吃掉大部分硬碟使用量是很常有的事。 要關閉也很簡單, Win+R > services.msc 打開「服務」,找到 Superfetch。 右鍵 > 內容,將它更改為「 已停用 」後確定即可。

TLS / SSL 金鑰轉檔,「.crt / .key」如何轉成「.pem」?( OpenSSL 教學)

不管是哪個 Certificate Authority (CA) 發的憑證多半金鑰檔都是給「.crt / .key」格式的檔案,像是「ca_bundle.crt」、「 certificate.crt」和「.private.key」這種檔案, 但是在實際使用 (Nginx、Apache...等伺服器) 卻會需要的是「.pem」檔 ,那要怎麼轉換呢?其實可以直接使用 OpenSSL 這個軟體和幾行指令來達成。 OpenSSL 官方網站 :  https://www.openssl.org 下載頁面 :  https://www.openssl.org/source sudo apt-get install openssl 以 Linux (Ubuntu / Debian ...等) 為例,可以直接使用 apt-get 指令下載安裝 OpenSSL,如果是其他系統可以參考官方網站的說明。 openssl rsa -in private.key -text > private.pem openssl x509 -inform PEM -in certificate.crt > certificate.pem openssl x509 -inform PEM -in ca_bundle.crt > ca_bundle.pem 以前述所提到的「ca_bundle.crt」、「 certificate.crt」和「.private.key」三個檔案為例,就可以用上方的指令完成轉檔,其實同副檔名的轉檔指令都相同,所以兩個「.crt」的指令其實是重複的,也要記得套換成自己的檔案名稱。 如果需要申請免費的 SSL 憑證也可以參考之前介紹過的 SSL For Free ,它是使用「Let's Encrypt」核發的憑證,以及如果覺得申請憑證和定期更新太麻煩,也可以考慮自動化的 Caddy Server 能自動幫網站升級 HTTPS。