比特幣挖礦難度演算法
① 姣旂壒甯佺幇鍦ㄧ殑鎸栫熆鎴愭湰鏄澶氬皯鎬庝箞璁$畻
濡傛灉璇寸熆鏈24灝忔椂閮藉湪宸ヤ綔錛岃佹寲1涓狟TC錛岄偅涔堝氨瑕佹湁17.128P鐨勭畻鍔涖傚姞榛戣壊涓鍙拌殏鋩丼9 鏄13.5T鐨勭畻鍔涖傞偅涔堜箙闇瑕1300鍙皊9錛岃繖浜涚熆鏈24灝忔椂鍙浠ユ寲1涓狟TC錛屽傛灉鏀圭寽鍦嗘槸涓鍙皊9宸ヤ綔24灝忔椂錛岄偅涔堜箙闇瑕1.35*24=32.4搴︾數*1300鍙=42120搴︾數*0.6鍏冧竴搴=25727錛屽氨鐩鍓嶇殑闅懼害鏉ョ湅鐨勮瘽錛岄渶瑕佹嫢鏈17.128P鐨勭畻鍔涙墠鑳芥寲涓涓甯併
鎴戜滑閫氳繃浠ヤ笂鏍稿屽叧浜庢瘮鐗瑰竵鐜板湪鐨勬寲鐭挎垚鏈鏄澶氬皯鎬庝箞璁$畻鍐呭逛粙緇嶅悗,鐩鎬俊鍏嗗渾澶у朵細瀵規瘮鐗瑰竵鐜板湪鐨勬寲鐭挎垚鏈鏄澶氬皯鎬庝箞璁$畻鏈変竴瀹氱殑浜嗚В,鏇村笇鏈涘彲浠ュ逛綘鏈夋墍甯鍔┿
② 鎬庝箞鏍風煡閬撴寲鐭跨殑闅
鎬庝箞鐭ラ亾鎸栫熆鐨勯毦搴
鎸栫熆鐨勯毦搴︽槸閫氳繃涓涓鍙鍋氣滈毦搴﹀尖濈殑鍙傛暟鏉ヨ閲忕殑錛屽畠鏄姣旂壒甯佺瓑鍔犲瘑璐у竵緋葷粺涓鐨勪竴涓閲嶈佸弬鏁般
闅懼害鍊兼槸鐢卞姞瀵嗚揣甯佺郴緇熻嚜鍔ㄨ皟鏁寸殑錛屽畠浼氭牴鎹榪囧幓涓孌墊椂闂村唴鐭垮伐浠鐨勬寲鐭塊熷害鏉ヨ嚜閫傚簲璋冩暣錛屼互淇濇寔鍔犲瘑璐у竵緋葷粺涓鏂扮殑鍖哄潡浜х敓鐨勯熷害紼沖畾銆
鍦ㄦ瘮鐗瑰竵緋葷粺涓錛岄毦搴﹀奸氬父姣忎袱鍛ㄨ皟鏁翠竴嬈°傚綋鐭垮伐浠鐨勭畻鍔涳紙鍗寵$畻鏈虹殑澶勭悊鑳藉姏錛夊炲姞鏃訛紝鎸栫熆鐨勯熷害浼氬彉蹇錛岄毦搴﹀間篃浼氶殢涔嬪炲姞錛屼互淇濇寔姣旂壒甯佺郴緇熶腑鏂板尯鍧椾駭鐢熺殑閫熷害澶х害涓烘瘡10鍒嗛挓涓涓銆
鍙浠ラ氳繃姣旂壒甯佺綉緇滀笂鐨勪竴浜涚綉絝欐垨鑰呭尯鍧楁祻瑙堝櫒鏉ユ煡鐪嬪綋鍓嶇殑闅懼害鍊礆紝渚嬪侭lockchain.info銆丅TC.com絳夛紝瀹冧滑浼氬疄鏃舵洿鏂伴毦搴﹀肩殑鍙樺寲鎯呭喌銆
鎬葷殑鏉ヨ達紝鎸栫熆鐨勯毦搴︽槸鐢卞姞瀵嗚揣甯佺郴緇熻嚜鍔ㄨ皟鏁寸殑錛岄氳繃鏌ョ湅姣旂壒甯佺綉緇滀笂鐨勭綉絝欐垨鑰呭尯鍧楁祻瑙堝櫒錛屾垜浠鍙浠ュ緱鐭ュ綋鍓嶇殑闅懼害鍊箋
③ 挖礦難度表示
比特幣的挖礦難度可以使用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 分鍾調整一次),有明顯的滯後性。你認為是哪種調整方式更合理呢?為什麼呢?歡迎在留言區分享你的觀點。
⑤ 一個比特幣要挖多久什麼是比特幣
本文更新於2020年5月17日,由於比特幣減產,挖礦時間有了顯著變化。接下來,我們來解答"一個比特幣要挖多久"這個問題。
計算挖礦時間的公式是:需要的天數=1/每日收益。以當時的先進礦機螞蟻礦機S19 Pro為例,其算力為110TH/s,價格約20770元。在2020年4月26日,算力為110TH/s的機器每日收益約為0.00169121BTC。然而,減產後收益大幅下降,具體如下:
- 2020年5月12日減產前:約591.3天
- 2020年5月17日減產後:約1154天
在2017年的比特幣熱潮後,挖礦的難度顯著增加,需要專門的ASIC設備。比特幣的挖礦速度約為每10分鍾一次,但難度持續上升。以比特幣現在的全網算力來看,即使是強大的礦機也需要約10分鍾才能找到一個符合條件的哈希值。
單獨挖礦的經濟可行性較低,通常需要加入礦池或選擇雲挖礦。挖一個比特幣的成本因地區和電力價格而異,從幾百美元到數千美元不等。總的來說,比特幣挖礦的時間和成本隨著技術進步和市場動態而變化,對新手來說,挖礦不再是輕松的收入來源。
⑥ 比特幣挖礦 個人電腦一天能挖多少
一天挖不了,需要2000年。
比特幣的全球統一計算難度是2621404453(預計兩天之後變化),一個2.5GHz的CPU,需要2000多年才能算出一個比特幣。
顯卡「挖礦」要讓顯卡長時間滿載,功耗會相當高,電費開支也會越來越高。國內外有不少專業礦場開在水電站等電費極其低廉的地區,而更多的用戶只能在家裡或普通礦場內挖礦,電費自然不便宜。甚至雲南某小區有人進行瘋狂挖礦導致小區大面積跳閘,變壓器被燒毀的案例。
(6)比特幣挖礦難度演算法擴展閱讀:
比特幣網路通過「挖礦」來生成新的比特幣。所謂「挖礦」實質上是用計算機解決一項復雜的數學問題,來保證比特幣網路分布式記賬系統的一致性。
比特幣網路會自動調整數學問題的難度,讓整個網路約每10分鍾得到一個合格答案。隨後比特幣網路會新生成一定量的比特幣作為區塊獎勵,獎勵獲得答案的人。
2009年比特幣誕生的時候,區塊獎勵是50個比特幣。誕生10分鍾後,第一批50個比特幣生成了,而此時的貨幣總量就是50。隨後比特幣就以約每10分鍾50個的速度增長。當總量達到1050萬時(2100萬的50%),區塊獎勵減半為25個。
當總量達到1575萬(新產出525萬,即1050的50%)時,區塊獎勵再減半為12.5個。該貨幣系統曾在4年內只有不超過1050萬個,之後的總數量將被永久限制在約2100萬個。
⑦ 礦池難度值怎麼樣算
礦池難度值怎麼算的
礦池難度值是一個用於描述加密貨幣挖礦難度的指標,它是根據區塊鏈協議的規則和演算法來計算的。
在比特幣挖礦中,礦池難度值的計算過程如下:
確定區塊鏈協議中規定的挖礦難度計算公式。
比特幣協議中的挖礦難度計算公式為:difficulty=difficulty\_1\_target/current\_target
其中,difficulty\_1\_target是一個常量,表示挖到一個新塊所需的最小哈希值;current\_target是當前挖到的塊的哈希值。
確定計算周期。
在比特幣協議中,難度值是每2016個塊(大約兩周)調整一次。
統計計算周期內的塊數和時間。
對於每個計算周期,礦池需要記錄本周期內挖出的塊數和挖礦時間。
計算礦池難度值。
根據上述公式,將本周期內挖出的塊數和挖礦時間代入計算,得出本周期的礦池難度值。
礦池難度值的計算會根據不同的加密貨幣和區塊鏈協議而有所不同,但都遵循類似的計算方法。
⑧ 比特幣挖礦的難度和算力
難度是對挖礦困難程度的度量,即指:計算符合給定目標的一個HASH值的困難程度。
difficulty = difficulty_1_target / current_target
difficulty_1_target 的長度為256bit, 前32位為0, 後面全部為1 ,一般顯示為HASH值:, difficulty_1_target 表示btc網路最初的目標HASH。 current_target 是當前塊的目標HASH,先經過壓縮然後存儲在區塊中,區塊的HASH值必須小於給定的目標HASH, 區塊才成立。
例如:如果區塊中存儲的壓縮目標HASH為 0x1b0404cb , 那麼未經壓縮的十六進制HASH為
所以,目標HASH為0x1b0404cb時, 難度為:
比特幣的挖礦的過程其實是通過隨機的hash碰撞,找到一個解 nonce ,使得 塊hash 小於 目標HASH 值。 而一個礦機每秒鍾能做多少次hash碰撞, 就是其「算力」的代表, 單位寫成 hash/s 或者 H/s
算力單位:
比特幣系統的難度是動態調整的, 每挖 2016 個塊便會做出一次調整, 調整的依據是前面2016個塊的出塊時間, 如果前一個周期平均出塊時間小於10分鍾,便會加大難度, 大於10分鍾,則減小難度,目的是為了保證系統穩定的每過 10分鍾 產出一個塊,所以難度調整的時間大概是2周(2016 * 10 分鍾)
全網算力是btc網路中參與競爭挖礦的所有礦機的算力總和。當前難度周期全網算力會影響下一個周期的難度調整, 如果全網算力增加,挖礦難度增大,單台礦機固定時間的產出就會減少。目前全網算力大概是24.42EH/s, 一台螞蟻S9礦機的算力大概是14TH/s
那麼, 已知當前全網算力,下一個周期難度將如何調整呢?
根據公式:
因為出塊時間要穩定在10分鍾, 也就是600s:
那麼,在3.46e+12的難度下, 一台算力為14TH/s的礦機平均要花多長時間才能出一個塊呢?
根據公式:
有:
結果大概是12270天