挖礦難度曲線
① 新手不可不知的免入坑礦機回本周期計算
挖礦從最初的野蠻生長,到現在已經逐步形成一個業態豐富,分工明確的千億級市場。
基於PoW共識機制的加密資產的挖礦,是一門變電為「金」的手藝。而這聽起來頗具誘惑力的手藝,也曾讓不少懷揣希望,投資挖礦的朋友血本無歸,慘淡退場。
如果挖礦是一個赤裸裸的謊言,那為什麼還有那麼多人確實從中獲益,甚至持續投資?
那麼,這其中問題出在哪裡?
因資本的逐利性和人性中的惡性,在實施過程中,其實存在著各種各樣的「陷阱」,導致收益不及預期。如果沒有合理的風險規避措施,確實很容易導致虧損。
還是以比特幣挖礦為例,針對一個常見的營銷陷阱——「礦機回本周期」做一個分享,希望讀者能在接下來十幾分鍾的閱讀里獲益。
01 「有毒」的營銷口號
在礦機的宣傳和買賣過程中,有一個即關鍵又雞肋的參數,叫做「回本周期」。如果是比較負責任的商家或渠道商,會註明這是「靜態回本周期」。
這個數據是參照礦機的理論算力和功耗,發布數據時刻的挖礦難度,區塊獎勵,實時幣價以及一個特定的電價計算所得。根據上述數據,先計算出當天挖礦的凈收益。然後用礦機成本價格除以這個凈收益,就可以得到靜態的回本周期。
這個數值一般不大,大部分礦機靜態回本周期在300天以內,而部分性能遠超當下同類的礦機(如礦機性能提升2-4倍,或者某幣種首次出現的FPGA礦機或ASIC礦機),靜態回本周期甚至可以達到150天以內。
這么快速的回本時間,對於普通投資者來說,簡直是暴利,就像一顆色彩艷麗的毒蘋果吸引投資者吞噬!
但實際情況總會跟預期有巨大差別,隨著礦機大量出貨,每台礦機的收益會被快速攤薄,因為大部分加密資產的單位時間產量是固定的。
試想一下,在你買了礦機幾個月後,因為廠商大量出貨,導致算力暴漲30%,而因」各種原因「電價被礦場提高了10%,市場動盪又引起幣價暴跌,屋漏偏逢連夜雨,偏偏在這個時候發生了區塊獎勵減半,你會突然發現礦機此時的靜態回本周期是無限長,因為此時挖礦收益已經不抵電費支出。你也只能無語望蒼天,心裡來一句「你大爺,我挖個毛線啊」。
02 影響挖礦收益的因素
靜態回本周期是一個不能用來充飢的畫餅,但我們在進行投資決策的時候,又不能不考慮投資回報率的問題,那如何評估礦機的回本周期,使它盡可能得更接近實際情況呢?
要解決這個問題,我們首先要了解影響挖礦收益的因素有哪些,為什麼靜態回本周期不值得參考。
以比特幣為例,目前絕大部分礦池採用基於PPS的收益模式(如PPS+,FPPS等)。而根據「挖礦收益的計算方法」,可以得到:
括弧部分為單位算力日理論收益,計算時,也可直接從第三方網站獲取
我們發現實際 影響比特幣挖礦收益的要素 有以下幾個:
礦機算力 :正常行情下,礦工並不會太早選擇給礦機超降頻處理,可視為固定參數;
挖礦難度 :從比特幣的發展歷程來看,比特幣挖礦按難度持續增長,當前挖礦難度,為2019年同時期的 2倍 ,為2018年同時期的 3倍 , 變化劇烈 ;
圖1 比特幣挖礦難度變化曲線
區塊獎勵 :比特幣目前區塊獎勵為6.25BTC,這個數值將保持近4年(下次減半在2024年5月份),可以視為固定參數;
交易費獎勵 : 在較長周期內,交易費平均值穩定在一個固定的區間。如果市場沒有出現劇烈波動(如2017年底大牛市,導致大量BTC交易產生,引起網路擁堵,交易費獎勵大幅度提高),變化不大,可以視為固定參數;
圖2 比特幣交易費獎勵在挖礦收益中的佔比變化情況
幣價 :如果將挖礦收益兌換為現金時的幣價不同,挖礦收益也會大有不同。但在實際操作中,可以通過套期保值等金融手段將挖礦收益提前鎖定在預期幣價。也為了盡量減少變數,計算挖礦收益時,可將幣價視為固定參數。
此外, 電價 對挖礦的影響也比較直接,電價影響挖礦成本,電價越高,挖礦收益越低。一般情況下, 靠譜的礦場 不會頻繁修改電價,電費成本可以視為固定參數。
綜上, 挖礦難度的劇烈波動 ,是導致靜態挖礦回本周期與挖礦實際回本周期產生巨大差異的主要原因 。因此,想要更為准確的預測挖礦回本周期,需要把挖礦難度的變化考慮在內。
因此,在計算投資回報的過程中要 結合自身情況綜合考慮 ,下面列幾種其他的可能情況,以供參考:
如果有 更優勢電力資源 ,數據還會有所不同,比如如果電價達到 0.21元/度 ,那麼礦機將在第55次難度調整時(大約2022年8月),達到挖礦凈收益 最大值13900元 ;
鑒於目前最新一代礦機使用的晶元製程已經達到很高水準,樂觀估計, 接下來2-3年內礦機的更新迭代速度會大幅度降低 。全網算力的變化,會持續圍繞S19為代表的新一代礦機替代之前所有老礦機進行, 全網算力緩慢增長 。因此,未來三年內, 平均每次挖礦難度增幅可以設定低一些 。如此,結果也會大有不同;
幣價 對挖礦收益有劇烈影響。投資挖礦時,可以通過套期保值,提前將未來的挖礦收益以某個幣價售出,來鎖定幣價(筆者對未來兩年行情持樂觀態度,投資者可以 留足現金流 , 等待在一個較高的幣價進行套期保值 ),降低幣價波動對挖礦收益可能帶來的影響,獲取穩定收益。
整體而言,隨著加密資產受眾越來越多,挖礦行業也逐漸合規,挖礦利潤也必定從暴利回歸薄利,挖礦投資風險也會越來越大,未來需要整合優質資源,使用必要的金融手段來規避風險,鎖定收益。
各位老鐵還有什麼好的想法可以留言,大家共同討論哦(#^.^#)
② 如何計算挖礦每天所獲得的收益
雖然每個人擁有的礦機數量不同,想算出自己的每日收益,其實很簡單,優質的比特幣站點都有相關的軟體幫你計算出最終收益,但是你想知道收益的產出原理嗎?
那麼各位要先明白挖礦的基本信息:
區塊·獎勵(BlockReward): 每挖出一個新的區塊,系統會給礦工的獎勵比特幣,目前區塊的獎勵是6.25比特幣。
算力(Hashrate): 算力(也就是哈希值碰撞)是比特幣網路處理能力的度量單位。即為礦機計算哈希函數輸出的速度。比特幣網路必須為了安全目的而進行密集的數學和加密相關操作。
例如,當網路達到10Th/s的哈希率時,意味著它可以每秒進行10萬億次計算。
難度(Difficulty): 比特幣系統的難度是動態調整的,每挖2016個塊便會做出一次調整,調整的依據是前面2016個塊的出塊時間,如果前一個周期平均出塊時間小於10分鍾,便會加大難度,大於10分鍾,則減小難度,目的是為了保證系統穩定的每過10分鍾產出一個塊,所以難度調整的時間大概是2周(2016* 10 分鍾)
比特幣網路初始難度定義為1,即Difficulty=1,它所表示的意思是,比特幣網路剛開始運行的時候,每進行2^48/(2^16-1)≈2^32次Hash計算,理論上能挖出一個區塊。
隨著挖礦算力的提升,比特幣挖礦難度在不斷提升,當挖礦難度為D時,理論上挖出一個新區塊需要進行D*2^32次哈希運算。
礦工的算力為H(單位為hash/s),他每天(24小時)的幣產出為P,挖礦難度為D,系統獎勵為R,那麼:
難度X6.25獎勵(R)X時間=比特幣產出
P=H×x6.25×(24×60×60)D×232
數學不好的小夥伴不要慌,可以直接通過相關網站查詢到當天全網算力難度,編寫此文章時當天難度為【16.95T】
假設礦工算力為1TH/s(即10^12H/s),
當前的難度=16.947.802.333.946(16.95T)
加上系統當前的區塊獎勵=6.25比特幣,
計算可以得出1T每天(24小時)
可以獲得收益=0.00000742BTC
當然,這只是一個最基礎的PPS收益演算法,除了區塊獎勵外,還有打包交易的曠工費,這部分的計算和礦池的結算方式有所相關。
礦池還有多種結算方式。以上介紹的是最為基礎的結算方式PPS(PayPer Share)。根據礦工提交的有效工作量來結算收益。
目前比特幣礦池主要的結算還有FPPS和PPS+等等,可以讓你在基礎上獲得而外的獎勵。
目前基本上收益方式多為選擇PPS+結算的礦工,他們與礦池的關系相當於打工者與公司的關系,礦工的收益不受礦池幸運值波動的影響。不管礦池幸運值如何,PPS結算方式下,只要礦工算力、挖礦難度、系統獎勵確定了,礦工的收益就是確定的,拿穩定的「工資」。
數學不太好的,實在看不懂的小夥伴。記得關注今日礦工,一起研究挖礦小樂趣。
③ 011:Ethash演算法|《ETH原理與智能合約開發》筆記
待字閨中開發了一門區塊鏈方面的課程:《深入淺出ETH原理與智能合約開發》,馬良老師講授。此文集記錄我的學習筆記。
課程共8節課。其中,前四課講ETH原理,後四課講智能合約。
第四課分為三部分:
這篇文章是第四課第一部分的學習筆記:Ethash演算法。
這節課介紹的是以太坊非常核心的挖礦演算法。
在介紹Ethash演算法之前,先講一些背景知識。其實區塊鏈技術主要是解決一個共識的問題,而共識是一個層次很豐富的概念,這里把范疇縮小,只討論區塊鏈中的共識。
什麼是共識?
在區塊鏈中,共識是指哪個節點有記賬權。網路中有多個節點,理論上都有記賬權,首先面臨的問題就是,到底誰來記帳。另一個問題,交易一定是有順序的,即誰在前,前在後。這樣可以解決雙花問題。區塊鏈中的共識機制就是解決這兩個問題,誰記帳和交易的順序。
什麼是工作量證明演算法
為了決定眾多節點中誰來記帳,可以有多種方案。其中,工作量證明就讓節點去算一個哈希值,滿足難度目標值的勝出。這個過程只能通過枚舉計算,誰算的快,誰獲勝的概率大。收益跟節點的工作量有關,這就是工作量證明演算法。
為什麼要引入工作量證明演算法?
Hash Cash 由Adam Back 在1997年發表,中本聰首次在比特幣中應用來解決共識問題。
它最初用來解決垃圾郵件問題。
其主要設計思想是通過暴力搜索,找到一種Block頭部組合(通過調整nonce)使得嵌套的SHA256單向散列值輸出小於一個特定的值(Target)。
這個演算法是計算密集型演算法,一開始從CPU挖礦,轉而為GPU,轉而為FPGA,轉而為ASIC,從而使得算力變得非常集中。
算力集中就會帶來一個問題,若有一個礦池的算力達到51%,則它就會有作惡的風險。這是比特幣等使用工作量證明演算法的系統的弊端。而以太坊則吸取了這個教訓,進行了一些改進,誕生了Ethash演算法。
Ethash演算法吸取了比特幣的教訓,專門設計了非常不利用計算的模型,它採用了I/O密集的模型,I/O慢,計算再快也沒用。這樣,對專用集成電路則不是那麼有效。
該演算法對GPU友好。一是考慮如果只支持CPU,擔心易被木馬攻擊;二是現在的顯存都很大。
輕型客戶端的演算法不適於挖礦,易於驗證;快速啟動
演算法中,主要依賴於Keccake256 。
數據源除了傳統的Block頭部,還引入了隨機數陣列DAG(有向非循環圖)(Vitalik提出)
種子值很小。根據種子值生成緩存值,緩存層的初始值為16M,每個世代增加128K。
在緩存層之下是礦工使用的數據值,數據層的初始值是1G,每個世代增加8M。整個數據層的大小是128Bytes的素數倍。
框架主要分為兩個部分,一是DAG的生成,二是用Hashimoto來計算最終的結果。
DAG分為三個層次,種子層,緩存層,數據層。三個層次是逐漸增大的。
種子層很小,依賴上個世代的種子層。
緩存層的第一個數據是根據種子層生成的,後面的根據前面的一個來生成,它是一個串列化的過程。其初始大小是16M,每個世代增加128K。每個元素64位元組。
數據層就是要用到的數據,其初始大小1G,現在約2個G,每個元素128位元組。數據層的元素依賴緩存層的256個元素。
整個流程是內存密集型。
首先是頭部信息和隨機數結合在一起,做一個Keccak運算,獲得初始的單向散列值Mix[0],128位元組。然後,通過另外一個函數,映射到DAG上,獲取一個值,再與Mix[0]混合得到Mix[1],如此循環64次,得到Mix[64],128位元組。
接下來經過後處理過程,得到 mix final 值,32位元組。(這個值在前面兩個小節《 009:GHOST協議 》、《 010:搭建測試網路 》都出現過)
再經過計算,得出結果。把它和目標值相比較,小於則挖礦成功。
難度值大,目標值小,就越難(前面需要的 0 越多)。
這個過程也是挖礦難,驗證容易。
為防止礦機,mix function函數也有更新過。
難度公式見課件截圖。
根據上一個區塊的難度,來推算下一個。
從公式看出,難度由三部分組成,首先是上一區塊的難度,然後是線性部分,最後是非線性部分。
非線性部分也叫難度炸彈,在過了一個特定的時間節點後,難度是指數上升。如此設計,其背後的目的是,在以太坊的項目周期中,在大都會版本後的下一個版本中,要轉換共識,由POW變為POW、POS混合型的協議。基金會的意思可能是使得挖礦變得沒意思。
難度曲線圖顯示,2017年10月,難度有一個大的下降,獎勵也由5個變為3個。
本節主要介紹了Ethash演算法,不足之處,請批評指正。
④ 自學區塊鏈(六)BTC-挖礦難度
我們來看下挖礦的計算公式
H(block header) target,這個target就是 目標閾值
BTC用的哈希演算法是SHA-256,它產生的哈希值是256位,那麼就有2^256種取值,這個就是他的輸出空間,要增大挖礦難度, 就調節目標值在這個輸出空間所佔的比例 。
挖礦難度和目標閾值是成反比的, 當算力強時,調節難度,使目標閾值變小 。
不調節難度,隨著礦工數量增多,隨著算力的上升,那麼挖到區塊的時間就會變短,從10分鍾縮短到1分鍾甚至幾秒鍾,這個會帶來什麼樣的問題呢?可能很多人覺得這不是挺好嗎,交易等六個確認就會縮短時間了,交易就會變快了。其實出塊時間縮到很短,風險是很大的,因為網路延遲,出塊時間變短,不同節點很可能接到不同的區塊信息,導致會有很多分叉節點出現。礦工會根據自己認為正確的區塊接著挖。這種情況下,惡意節點發動分叉攻擊就比較容易成功,因為誠實節點的算力被分散了。
導致不需要51%的算力就能成功,所以縮短出塊時間是不利於BTC系統的穩定的。雖然10分鍾不一定是最優的時間,但是也算是比較合理的。
下面是 算力增長曲線
下面是 挖礦難度曲線
下面是 平均出礦時間
我們來看下難度公式:每2016個區塊調整一次挖礦難度,10分鍾出一個平均算下來是兩星期調整一次。
previous_difficulty是上一次的挖礦難度,分母是最近2016個區塊花費的時間
每個節點挖礦是獨立的,BTC的協議也是開源的,會不會有礦工不修改挖礦難度呢?可能性是存在的,但是不影響結果,因為廣播給其他節點需要獨立驗證block header的哈希值, 這個header裡面有難度的一個壓縮編碼,修改難度產生的結果是不會被誠實的節點認可的。
⑤ 挖礦難度表示
比特幣的挖礦難度可以使用Target Threshold,nBits或Difficulty表示,它們互相等價:
這三個值的轉化關系可以採用下面的實例來說明:
首先獲取哈希值為 的區塊原生十六進制信息如下:
區塊中nBits採用小端格式表示,解析區塊信息,得到nBits欄位值為0x4c86041b。因此轉化為大端格式為0x1B04864C,這個值是Target Threshold的壓縮格式表示,可以將它轉化成256位的Target Threshold值:
開頭的一個位元組為指數,後面三個位元組為系數,則:
計算出Target Threshold值為 。
再計算Difficulty的值,它有兩個值,計算公式分別為:
由此可以使用 Python 計算出bdiff的值:
因此,得到在比特幣客戶端中的difficulty值bdiff為14484.162361225399。
為了檢驗上述結果,可以在比特幣核心客戶端中使用 getblock "" 命令得到該區塊的json格式信息:
最終,可以發現該區塊的bits和difficulty欄位信息與上面分析計算的相關結果一致。
nBits的大端格式表示法中,其系數最大為0x7fffff,這是因為Target Threshold數據類型是無符號整型,而它繼承自有符號數據類,則在實際中Target Threshold系數的最高位有可能是1,這可能會被解析成一個負數。則在挖礦過程中難度值永遠無法小於一個負數。因此,為了解決這個問題,比特幣核心在生成nBits值時需要首先檢查一下生成的nBits是否會被解析為一個負數。如果是,首先在系數開頭補8位0,即除以256,然後指數再加上1。這樣由nBits轉化為Target Threshold過程中轉化公式就與普通值相同了,即指數位都是減去3,轉化過程上面已經提到。
舉個例子說明:
哈希值為 的區塊信息如下:
發現bdiff值為1,則利用bdiff與Target Threshold關系可以計算出:
將Target Threshold值 轉化為nBits的過程中可以發現其系數為0xffff00,指數為0x1c,這樣:
然而由於系數最高位為1,則如果這樣表示的話就可能將Target Threshold解析為負數。因此,我們將系數除以256,指數加上1,得到系數為0x00ffff,指數為0x1d。這樣:
最終,nBits值為0x1d00ffff(大端表示),與json格式信息一致。
⑥ 什麼是比特幣挖礦難度如何調整原理是什麼
比特幣挖礦難度(Difficulty),是對挖礦困難程度的度量,挖礦難度越大,挖出區塊就越困難。目標值(Target)與挖礦難度成反比。難度越高,目標值越小。而難度目標是目標值通過轉化得到,是一個只有 4 個位元組的欄位(為了便於理解,本文將難度目標等同目標值處理)。比特幣系統正是通過調整區塊頭中難度目標來控制挖出區塊所需平均時間的。
目標值是個長度為 256 比特的字元串,換句話說目標值約有 2^256 種可能的取值。調整難度目標就是調整目標值在整個輸出空間的佔比。
舉例說明:挖礦就如射擊,所有射出去的子彈都會落在一個很大的靶子上。難度目標就是這個大靶子上圈出一個范圍,這個范圍越小,被射中的難度就越高。調節難度目標,就是調節這個圈在整個靶子上的佔比。
挖礦算力增大,單位時間射擊的次數就越多,目標范圍被射中所需的時間就越短。反之,挖礦算力減小,目標范圍被擊中所需的時間就越長。而比特幣系統追求的平均出塊時間為 10 分鍾,這時候就需要調整難度目標來實現。
02 如何調整難度目標?
比特幣系統是怎樣調整難度目標的呢?在《白話區塊鏈入門 080 | 數說比特幣,了解 比特幣 必須知道這 10 個數字》一文中,我們介紹了比特幣系統每過 2016 區塊(大約為 14 天時間),會自動調整一次難度目標。所有區塊高度為 2016 整數倍的區塊,系統就會自動調整難度目標。如果上一個難度目標調整周期(也就是之前 2016 個區塊),平均出塊時間大於 10 分鍾,說明挖礦難度偏高,需要降低挖礦難度,增大難度目標(准確地說是目標值);反之,前一個難度目標調整周期,平均出塊時間小於 10 分鍾,說明挖礦難度偏低,需要縮小難度目標。
03 難度目標的可調范圍
比特幣系統設定,難度目標上調和下調的范圍都有 4 倍的限制。舉例說明:假設上一個難度目標調整周期內的 2016 個區塊,由於算力暴漲,只用 7 天就全部挖出來了,通過難度目標調整,將難度目標縮小一倍,可以將平均出塊時間維持在 10 分鍾左右,但如果算力暴漲,前 2016 個區塊全部挖出只用了 1 天,那麼難度目標最小隻能調整為原來的四分之一。
04 總結
比特幣的算力是持續波動的,比特幣系統通過難度目標的調整,使得平均出塊時間維持在 10 分鍾左右。難度目標和挖礦難度成反比,挖礦難度越大,難度目標越小。當區塊高度為 2016 的整數倍時,比特幣系統就會在該區塊上,自動調整難度目標。如果上一個難度目標調整周期內,平均出塊時間超過 10 分鍾,那麼降低挖礦難度,增大難度目標;反之則提高挖礦難度,減小難度目標。難度目標上調和下調的范圍都有 4 倍的限制。
比特幣每 2016 個區塊(大約 14 天)調整一次挖礦難度,相比於 BCH 每個區塊都調整(大約 10 分鍾調整一次),有明顯的滯後性。你認為是哪種調整方式更合理呢?為什麼呢?歡迎在留言區分享你的觀點。
⑦ 09年比特幣挖礦效率
比特幣網路的挖礦難度已經從 16.6 T 減少到 13.9 T,下降了 15.95%,並創下有史以來第二大跌幅。在此,我們將根據 Coin Metrics 數據探究一下比特幣挖礦難度調整的歷史。
事實上,在比特幣誕生的第一年裡,挖礦難度其實降低了很多倍(例如,比特幣網路曾花了超過一個月時間才開采出 2016 個區塊),但因為挖礦難度不能低於 1,所以這個數字就一直沒有變化。