1. 程式人生 > >比特幣(Bitcoin) POW難度調節機制

比特幣(Bitcoin) POW難度調節機制

比特幣白皮書在工作量證明章節中解釋了工作量證明(PoW)的方式:

我們在區塊中補增一個隨機數(Nonce),這個隨機數要使得該給定區塊的隨機雜湊值出現了所需的那麼多個0。我們通過反覆嘗試來找到這個隨機數,直到找到為止,這樣我們就構建了一個工作量證明機制。只要該CPU耗費的工作量能夠滿足該工作量證明機制,那麼除非重新完成相當的工作量,該區塊的資訊就不可更改。由於之後的區塊是連結在該區塊之後的,所以想要更改該區塊中的資訊,就還需要重新完成之後所有區塊的全部工作量。

那這個隨機數難度值是怎麼產生的呢?

區塊雜湊值的計算結果是一個隨機數,沒有人能直接控制計算的結果。打個比方,重複N次(N趨近於無窮大)擲一個六面的骰子,每擲一次就可以擲出一個6(包含6)以下的數字,但是如果要想擲出3以下的數字,取得每個結果時平均雪要擲2次才行;也就是說,擲出“3以下(含3)”比擲出“6以下(含6)”要難一倍,需要多做一倍的“工作量”。

如果定義“6以下”這個規則的難度係數(困難度)為“1”,那麼“3以下”這個規則的難度係數為“2”,意味者要想符合規則要求,需要2倍的工作量;“1以下“的難度係數則為6,意味著該規則需要6倍的工作量。

比特幣協議中,規定一個256位的整數0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF為難度“1”,在當時的全網算力下大約需要10分鐘左右的雜湊計算工作量才可以滿足小於等於這個數這一規則。

如果想確保10分鐘這個工作時間恆定,那麼當算力提高n倍時,需要把難度值也調高n倍。2015年10月Bitcoin網路的難度值為608億,可以推算出現在的全網算力比2009年初增大了608億倍。

難度值的計算實際上就是簡單的除法。只不過涉及到的整數太大(遠遠超過內建的整數位數),沒法直接用普通數學庫的除法來運算,需要藉助高精度的演算法庫(比如GMP)來完成,這就比較麻煩。所以bitcoin wiki中給出了一種藉助泰勒級數變體實現的快速對數演算法計算難度值的示例。

區塊儲存時,block_header中有一個欄位是與難度值相對應的,即bits。用一個32位的整數來壓縮儲存當期256位的目標值。壓縮規則很簡單,bits欄位的最高位位元組為指數(little endian中的第4個位元組),儲存目標值有效的位元組數,如果目標值的最高位為1(大於0x80),需要在前面補上一個0x00。(比如難度值1的目標值有效位為0x00FFFF......,補0後共0x1D個位元組)。另外3個位元組為尾數(mentissa),擷取目標值最高3個位元組來儲存。

這樣,難度值1對應的目標值寫成bits格式,就是0x1D00FFFF。以此類推,目標值為0x00000000000404CB000000000000000000000000000000000000000000000000時,bits的格式為0x1B0404CB。

計算難度值時其實可以採用簡易演算法:尾數部分相除,再乘以指數部分帶來的差異即可。(2 ^ [指數部分相減的結果 * 8]),計算速度比“快速對數法”要快很多(但是如果超出double型所容許的位數會有溢位)。

現有的演算法中,難度值每2016個區塊調整一次,但新的難度值不需要與難度“1”進行比較運算,而是根據前2015個塊的出塊時間來計算。

問:為什麼是2015?答:因為最初程式設計師的程式碼寫錯了,糾正這個錯誤會導致分叉,所以只能將就一下了

difficulty = [prev_target] * 【前2015個區塊生成所用的時間】 / 1209600 (按標準每10分鐘出一個塊,2016個塊所需要的秒數)

因為演算法確定,所以分佈計算時也能保證所有節點計算出的難度值都一致,不會出現分歧。區塊鏈同步時,節點或客戶端會優先選取累積難度最大的鏈作為主鏈,僅有高度(height)的“偽造慢鏈”很難被認可,除法偽造出的難度值也很高。但是隻要偽造了一個塊的難度,後續所有的區塊必須用相應的難度重新計算一遍,這往往需要攻擊者擁有的算力與當前全網的真實算力相當才有可能完成。

比特幣發展的早期,“偽造慢鏈”攻擊應該是很難防的,但是一旦算力達到一定規模,在PoW下這種攻擊需要極大的成本和海量的計算時間(不光是金錢,還需要時間),因而一般只需通過優化演算法根據累積難度來標識出主鏈即可。這是PoW下用高額成本的代價換來的成果—算力保護。

相關推薦

(Bitcoin) POW難度調節機制

比特幣白皮書在工作量證明章節中解釋了工作量證明(PoW)的方式: 我們在區塊中補增一個隨機數(Nonce),這個隨機數要使得該給定區塊的隨機雜湊值出現了所需的那麼多個0。我們通過反覆嘗試來找到這個隨機數,直到找到為止,這樣我們就構建了一個工作量證明機制。只要該CP

挖礦:挖礦難度升級 區塊鏈交易平臺壟斷加速!

幣挖礦:比特幣挖礦難度升級,行業壟斷加速! 2017年,韭菜們被收割,幣圈哀嚎陣陣,引起市場的恐慌不斷上升。一年的時間裡,幣圈的漲漲浮浮,韭菜們追漲、殺跌、抄底在無限迴圈著。想要獲利是很重要的,但是更重要的是韭菜們怎麼讓自己不被割。然而比特幣挖礦難度升級,韭菜們如何改變被割

區塊鏈:講故事告訴你的原理及運作機制

一個故事告訴你比特幣的原理及運作機制推薦:週末花時間看了一些比特幣原理相關的資料,雖然不敢說把每個細節都完全搞懂了,不過整體思路和關鍵部分的主要原理還是比較明白。寫一篇文章分享給大家。這篇文章的定位會比較科普,儘量用類比的方法將比特幣的基本原理講出來。這篇文章不會涉及演算法和

一個故事告訴你的原理及運作機制

問題的提出 比特幣產生的動機 以物易物 話說在這個世界上,有一個叫位元村的小村莊,村莊共有幾百戶人家。這個村莊幾乎與世隔絕,過著自給自足的生活。由於沒有大規模貿易,位元村村民一直過著以物易物的生活,也就是說村民之間並沒有使用統一的貨幣,互相間的貿易基本上就是老張家拿一袋

挖礦難度降15% 礦圈重新洗牌,礦工還要關機嗎?

最近比特幣收益不斷縮水。礦圈有人關機,有人退出,挖礦參與人員減少,挖礦難度降低。堅守的礦工,隨著挖礦難度降低,可挖到更多的比特幣。日本有一家公司,11月通過挖礦獲取696個BTC(約264萬美元)。 據悉12月3日挖礦難度再一次做出調整,挖礦難度下降15.13%,創下歷史第二大跌幅。相對

轉:一個故事告訴你的原理及運作機制

轉自:http://blog.codinglabs.org/artic ... -easy.html#jtss-tqq週末花時間看了一些比特幣原理相關的資料,雖然不敢說把每個細節都完全搞懂了,不過整體思路和關鍵部分的主要原理還是比較明白。寫一篇文章分享給大家。這篇文章的定位會比較科普,儘量用類比的

一個故事告訴你的原理及運作機制_系統架構

週末花時間看了一些比特幣原理相關的資料,雖然不敢說把每個細節都完全搞懂了,不過整體思路和關鍵部分的主要原理還是比較明白。寫一篇文章分享給大家。這篇文章的定位會比較科普,儘量用類比的方法將比特幣的基本原理講出來。這篇文章不會涉及演算法和協議中比較細節的部分,打算後面會再寫一

區塊鏈BTC98Bitcoin原始碼安裝編譯

在這兒主要介紹Linux下的比特幣Bitcoin安裝,我們選擇ubuntu 12.04的環境,安裝相對容易得多。Windows下並不推薦,因為基於mingW配置相以繁瑣。 同時也可以參考build官方文件。    先拉下原始碼: 安裝Berkeley DB 4.8以上版本: sudo apt-get

Bitcoin原始碼安裝編譯

轉載自:http://www.cnblogs.com/wintersun/p/3813424.html        比特幣 (貨幣符號: ฿;英文名:Bitcoin;英文縮寫: BTC),是一種用於開源的P2P軟體而產生的電子貨幣。比特幣全域性圖是這樣的: 在這兒主要介紹Linux下的比特幣Bitco

bitcoin-cli轉賬與交易的api使用總結

需要使用到3個api,分別是 createrawtransaction(建立交易),signrawtransaction (簽名交易),sendrawtransaction(廣播交易), 2.1命令格式: createrawtransaction [{“txid”:”id”,”vout”:n},…] {“

一個通俗易懂的故事告訴你的原理及運作機制

轉載自http://blog.csdn.net/zhiren2011/article/details/44966449  向感謝作者! 一篇關於比特幣的有意思的文章,分享給大家! 週末花時間看了一些比特幣原理相關的資料,雖然不敢說把每個細節都完全搞懂了

bitcoin原始碼解析之整體架構和流程

1. 比特幣簡介 比特幣(BitCoin)的概念最初由中本聰在2009年提出,根據中本聰的思路設計釋出的開源軟體以及建構其上的P2P網路。比特幣是一種P2P形式的數字貨幣。點對點的傳輸意味著一個去中心化的支付系統。 與大多數貨幣不同,比特幣不依靠特定貨幣機構

Ubuntu下編譯安裝Bitcoin

一、安裝第三方庫:       1.安裝libssl, libevent, libboost庫等:         sudo apt-get install build-essential libtool autotools-dev automake pkg-conf

bitcoin原始碼解析之資料結構

1. CTxOutAn output of a transaction. It contains the public key that the next input must be able to sign with to claim it.CTxOut類圖欄位屬性說明nValue交易輸出對應的金額scr

區塊鏈-bitcoin節點安裝及RPC呼叫

節點安裝: 從比特幣官網下載執行環境(bitcoin-0.16.2-win64.zip) 壓縮包內可執行檔案有:bitcoin-cli bitcoind  bitcoin-qt  bitcoin-tx test_bitcoin                   

《詳解白皮書》- Proof-of-Work(PoW工作量證明機制)

工作量證明:要求使用者進行一些耗時適當的複雜運算,並且答案能被服務方快速驗算,以此耗用的時間、裝置、能源作為擔保成本,以確保服務與資源是被真正的需求所使用。 To implement a distributed timestamp server on a peer-to-peer basis,

PoW挖礦算法原理及其在、以太坊中的實現

print 惡意攻擊 actions 規則 rom header() const state divisor PoW,全稱Proof of Work,即工作量證明,又稱挖礦。大部分公有鏈或虛擬貨幣,如比特幣、以太坊,均基於PoW算法,來實現其共識機制。即根據挖礦貢獻的有效工

機制1:記賬的方式,交易的語法,指令碼,P2PKH交易

原文連結:郭老師的備課資料 比特幣的共識機制生成了一個append-only的賬本,一旦交易在賬本中,再也不能更改。礦工——也即一些有較高計算力的節點,生成區塊,並且驗證交易是正確的(簽名是正確的、幣沒有重複花費)等。賬本和區塊鏈網路使得比特幣成為一種貨幣。在本文中,將介紹一些細節。

Learning Bitcoin and Other Cryptocurrencies 學習和其他加密貨幣 Lynda課程中文字幕

Learning Bitcoin and Other Cryptocurrencies 中文字幕 學習比特幣和其他加密貨幣 中文字幕Learning Bitcoin and Other Cryptocurrencies 比特幣是隻線上存在的一種貨幣形式 雖然它成為全球頭條新聞,但很

代碼分析4 節點發現機制

避免 失敗 活動 自己的 發現 通過 代碼分析 社區 結果 當程序第一啟動時,它並不知道任何活躍節點的ip地址。為了發現一些全節點的ip地址,他們會查詢硬編碼在比特幣內核或BitCoinJ中的,一個或多個DNS域名,在返回的結果中應該包含一個或多個DNS A記錄,裏面有一些