加密貨幣與他們的產地

電腦演算法礦工、加密貨幣、礦池生態系

用電腦…挖礦?

所謂挖礦就是讓電腦執行特定程式,反覆運算找出某個值 "nonce" 代入符合 HashFunction(“TXs” + "nonce") < TargetDifficulty 的解來給自己「挖出」一些加密貨幣。Bitcoin 用的函數是兩次的 SHA256,而 Ethereum 則是使用自己發明的 Ethash 演算法。

挖礦的本質就像買樂透,儘管區塊獎勵是先搶先贏,算力強的礦工也只是「較有機會」挖到礦,小礦工理論上仍能取得成比例的報酬。但隨著全世界的人不斷不斷的投入資源、建置更多的挖礦設備,現在以個人之力挖到礦的機率已經非常非常小。

以 Ethereum 為例,一張中高階顯示卡每秒可以做三千萬次 Hash,但挖到礦平均需要一千兩百兆次的嘗試(2017/7/16),算起來平均要 1.26 年才會挖到一次,普通礦工根本沒辦法承受如此不穩定的收入。

憑個人之力挖礦太看天吃飯,礦工們合起來建造了礦池。

基本上,礦池要解決的是礦工收入不穩定的問題,它把散落的運算資源整合起來一起挖礦,挖到之後再按照每個礦工的貢獻比例分錢下去,概念上就像集資包牌買樂透,用眾人之力把收入的機率分布攤平。此外,礦池負責維護節點運作,礦工可以專心在運算上,也降低了挖礦的成本,礦池則收取少量手續費。

理想的礦池和礦工之間的分工大致是這樣:礦池藉由連接區塊鏈網路的節點接收交易訊息,產生待打包的區塊廣播給礦工,並分配每個礦工負責尋找 nonce 的範圍。通常礦池會設定一個比較低的門檻,可能是實際 target difficulty 的 1/1000000,礦工找到符合的 nonce 就回報給礦池,礦池驗算後就記錄為一個 “share”,再用每個礦工提交的 share 估算貢獻比例。因為礦工已經篩選出一些不錯的 nonce,礦池可以很容易的從中找出夠小的值去符合真正挖礦的標準, 層層過濾的過程和淘金礦倒有幾分相似。

就像跟人包牌買樂透怕被獨吞一樣,難道礦池不擔心礦工把可以挖到礦的 nonce 私藏,只把挖不到但符合 share 標準的 nonce 交出來混錢嗎? 答案是否定的,因為在開始挖礦之前,我們要先決定好的那個 “TXs” 交易紀錄區塊裡面,就會標示這個塊的 miner 是誰,所以當礦工對著礦池給好的資料做運算,找出來的 valid share 就具有專一性,即使礦工真的找到某個符合Hash(“TX”+nonce)<TargetDifficulty 的值想要自己私藏拿去領賞,最後仍是礦池會收到錢,這個礦工還會少一個 share,理論上沒有動機這麼做。

礦池不擔心礦工捲款潛逃,但要如何公平地分配收益仍是個困難的問題。目前比較常見的分潤模式有:PPS(Pay Per Share), PPLNS(Pay Per Last N Share), RBPPS(Round Base Pay Per Share) 三種,各有優缺點和不同的風險承擔角色。

採 PPS 模式的礦池會在礦工每次提交 share 的時候立刻認列,是最簡單好懂的模式。每個 share 的價格是預先決定並動態調整的,相當於礦池「買」了這個 share,礦工的收入穩定,而實際挖到的塊多寡則由礦池概括承受,所以通常會抽取較高的手續費。

相較之下,PPLNS 模式只會在礦池確定有收入的時候才發錢。每次挖到礦會參照礦工前一段時間的 share 數分配收益,波動由礦工和礦池共同承擔,通常會用隨時間遞減的權重計算,收入較為平滑,但實作上會比較複雜一點。

至於 RBPPS 則完全由礦工承擔風險,它像 PPS 一樣實時認列,但不直接發錢,而是登記為一個 share,每次挖到塊稱為一個 round,再依照這個 round 期間你佔的 share 比例分潤,礦工收益完全看礦池出塊是否穩定。

因為實作起來簡單,RBPPS 是目前許多開源礦池採用的模式,但也存在著一些問題,對總算力低的礦池而言出塊間隔長短並不穩定,隨著礦工們的 share 持續累積,繼續挖礦的收益期望值會隨著分母上升而遞減,礦工有經濟誘因在很久沒出塊時切到其他礦池挖礦,等本來的礦池出塊後再切回來,但如果每個礦工都這麼做,礦池就停擺了。

在礦池間切換的礦工可以有超額利潤,留守的人則有損失

此外,也有礦池採用類似線上遊戲的 DKP 制度,礦工每次挖到塊會累積 credit,當有塊挖出來的時候就由當時 credit 最高的礦工全拿,並把他的 credit 歸零。但這種模式顯然對小礦工不利,期望值算起來大礦工會拿到不符比例多的額外收益。

總的來說,不同的分潤模式都是在追求礦工收入穩定、公平、低礦池風險之間的權衡。大礦池有足夠的資源請工程師優化系統,也較能提供礦工穩定的收入,小礦池則有靈活的優勢,可以經營名氣尚小的潛力幣種。

營運礦池的各種經濟考量

通常礦工在意的不外乎是礦池的手續費高低、收入波動、伺服器穩定度三項重點。礦池收取的手續費除了要付維護系統跟電費的開支,還要在給礦工發薪水的時候承擔鏈上(on-chain)交易的手續費,所以一般會在累積到一大筆錢的時候再一次性支付。當礦池規模漸漸擴大的時候,光支付就會產生龐大的交易流量,常常處理不完造成塞車。

最近有 Ethereum 礦池嘗試用智能合約實現類似 Bitcoin 單筆交易包含多地址支付的功能,但似乎會讓交易所錢包辨識失敗,猜測原因是因為底層節點 geth 的監聽功能 “filter” 只會對交易的第一組地址有反應,導致後續的交易沒被聽見,以致於無法觸發交易所入帳的事件。滿期待交易所能改一下架構,否則都不能用智能合約支付,對許多 Ethereum 應用來說也挺困擾的。

目前已經可以在 GitHub 上找到幾組開源的礦池程式,稍有經驗的人都能輕易的架起礦池。但儘管架池簡單,經營倒挺困難,要找到足夠的礦工和算力加入才能確保收入穩定。比起礦工是單純的設備成本收入考量,經營礦池有時候更像在經營社群,需要培養一定的群眾,提供不錯的周邊服務,才能讓礦工願意在收益變化的時候不至於軍心潰散,肯留下來跟著礦池一起打拼。

由GPUMining社團營運的音樂幣礦池

以上內容如果有錯誤還請聯繫賜教
https://fb.me/artistichorn

覺得文章不錯的話也可以小額贊助喔
BTC:
1HUHtZ2mTLZgJai35msRfj6jupULP2kc6N
ETH:
0xc1F9BB72216E5ecDc97e248F65E14df1fE46600a
Musicoin:
0x6746b0b11f2c723ae85a016744481b00cb13a007