從程序員的角度來看比特幣探勘算法
本頁:Blocks說挖礦其實是解決一個數學問題,但是閱讀Block hashing algorithm並沒有太大幫助。我也嘗試閱讀 bitcoind 原始碼,但閱讀程式碼比閱讀文件花費更多時間:)
我已經編寫了一個簡單的 json-rpc 客戶端來呼叫 getwork() 方法來獲取“數據”,但是在這個“數據”旁邊我應該做什麼呢?
任何人都可以從程序員的角度解釋挖礦過程嗎?
挖礦算法如下:
- 步驟 0 - 從網路中檢索前一個塊的雜湊。
- 第 1 步 - 收集稱為“區塊”的潛在交易列表。此交易列表來自點對點比特幣網路。
- 第 2 步 - 計算潛在交易塊的雜湊值以及隨機數。
- 第 3 步 - 如果雜湊值超過目前設置的難度級別,那麼您已經探勘了該塊。如果沒有,請從第 1 步重新開始。第 1 步中對交易列表的任何添加以及第 2 步中隨機數的更改都意味著有可能在下一輪中滿足該標準。
從程序員的角度來看,虛擬碼可能看起來像這樣:
P := 先前開采的區塊的雜湊值 B := 一個交易塊 H := 雜湊函式 D := 難度級別 0 檢索 P 1 構造/修改 B 2 IF H(P, B, 一些隨機數) > D END 3 轉到 1
我應該警告您,該描述中存在一些不准確之處,但在大多數情況下,這應該足夠好了。這裡有一些更有用的說明:
什麼是雜湊?
雜湊是將數據轉換為一定範圍內的數字的函式。雜湊具有知道它的輸出本質上是不可預測的屬性(在給定範圍內)。用於比特幣探勘的特定雜湊函式是兩次應用的 SHA256。
難度級別如何運作?
雜湊函式的這種不可預測性意味著放入隨機數據(交易+隨機數)本質上會產生一定範圍內的隨機數。進一步限制所需輸出的範圍會影響一個人在一輪中找到它的可能性。這創造了一種方法,可以根據算法在網路上執行的次數來機率確定解決方案的找到頻率。具體來說,當您聽到術語“gigahashes”或“terahashes”時,這是指可以執行第 3 步的次數。隨著整個網路每秒雜湊數的增長,網路會自動提高難度,以便在大約 10 分鐘內找到解決方案。
當一個區塊被開採時會發生什麼?
當一個塊被挖出時,礦工將該塊發送給網路上的所有其他礦工,作為它找到它的證據。該塊包含交易列表、找到的散列、特定的隨機數和對前一個散列的引用。當每個礦工收到新開采的區塊時,它會刪除該區塊中存在的所有目前正在開采的交易(因為它們已經在區塊鏈中得到確認)並將該區塊廣播給其他做同樣事情的礦工。傳播發生得很快。
注意:該區塊的原始礦工獲得“礦工費”,這是一種獎勵,除了“coinbase”獎勵外,還包括交易中任何未使用的硬幣。coinbase 獎勵從 50 個比特幣開始,每 210,000 個區塊減半(大約每 4 年一次)。coinbase 獎勵最終會變得如此之小,以至於與礦工的費用相比它是微不足道的。