比特幣區塊鏈挖礦原理入門由淺到深

Hank Huang
The Z Institute

--

自從開始學習區塊鏈相關知識之後,腦袋中對於挖礦的機制開始有越來越多的問號。而網路上大部分的文章都只有講到一些大面向,並沒有談到一些細節的部份,於是就稍微整理下關於挖礦的整體流程。

這篇文章將會著重在挖礦的流程與細節部分,因此只會稍微帶過一些基礎的知識。這篇文章也不是在教學如何開始挖礦,而是挖礦的原理部分。

甚麼是挖礦?

先從最基本說起,比特幣區塊鏈是一個紀錄在比特幣上所有交易的帳本,你可以想像每一個區塊就是帳本上的一頁,每一個區塊(頁)上都寫著很多筆的交易。

from: https://medium.com/@benzwjian/區塊鏈如何運作-b7c8d4131a0e

在中心化的世界中,會有一個被大家信任中央機關負責管理這本帳本,例如:中央銀行,並將新的交易持續紀錄在帳本上。而在比特幣的世界中,我們拿掉了這個中央機關,改成讓所有節點都各自擁有這本帳本

挖礦就是要決定出負責更新下一個區塊的節點,在挖礦比賽中勝出的礦工可以更新下一個區塊並獲得獎勵,其他所有節點會驗證這個區塊並更新自己的帳本,形成了去中心化的世界。

挖礦的過程是一個猜數字比賽,你可以想像成一個丟骰子比賽,誰先丟出小於3點的點數(1或2)就贏了,但這個骰子如果只有六面那就太簡單了,在挖礦的世界裡這個骰子是個好幾億(天文數字)面的骰子。

在挖礦的過程中礦工會耗費大量的能源去猜這個數字,為了讓這些辛勤的礦工繼續的賣命工作,中本聰設置了一個獎勵機制,獎勵勝利的礦工新挖出來的比特幣(目前是12.5個比特幣)加上這個區塊中所有交易的交易手續費。所以大家普遍認知挖礦是為了要獲利,但其實挖礦的理念是為了維持比特幣的去中心化。

在對挖礦有初步了解後,接下來進入到挖礦流程細節的部分

挖礦流程

在所有的流程中,都是持續聽取網路上發生的新事情,不斷的將新交易加入到交易池中,並確認是否有人挖到新的區塊

  1. 在上一輪挖礦結束後,將最新的區塊更新到自己的帳本上,並把已確認的交易從交易池中刪除。
  2. 創建候選區塊(candidate block),並從交易池中選擇喜歡的交易(通常是有較高手續費的交易)並把他們打包到候選區塊中
  3. 創建Coinbase transaction,也就是獎勵的部分,包含了基本的新比特幣獎勵以及交易手續費。獎勵將是區塊中呈現的第一筆交易,因為其中新的比特幣不是從誰誰誰那裡交易過來的,而是無中生有的。
  4. 創建區塊頭(Block Header),包括版本號、上一個區塊的hash、Nonce…等等
  5. 開始挖礦,猜測Nonce來更新區塊的哈希(hash)值
  6. (假設你是第一個猜到的礦工)成功挖出區塊,並廣播給你鄰近的節點讓他們驗證,若區塊是合法的,這些節點會再把區塊廣播下去並更新他們自己的帳本
  7. 下一輪挖礦競賽開始

再更深入一點…

我們針對第四個步驟進行更深入的探討,也就是猜測哈希值部分

比特幣區塊鏈使用的是SHA256算法,也就是說我們把區塊頭的東西都丟進去後會產生一個64位元的16進位數字:

SHA256( Block Number, Timestamp, Nonce, Data, Prev. Block’s Hash)➝

0f8ef3377b30fc47f96b48247f463a726a802f62f3faa03d56403751d2f66c67

這個輸出是無法預測的,接下來我們只要不斷的變更Nonce值,讓輸入值(Input)不同,就會獲得不同的哈希值(Output)

那哪個哈希值才是正確答案?

在比特幣中為了要讓平均產出區塊的時間落在10分鐘左右,設置了一個難度目標值(Difficulty Target),猜測出的數字必須要小於這個目標值才算正確,大於目標值的結果全部都算是錯誤。

https://medium.com/swlh/how-does-bitcoin-blockchain-mining-work-36db1c5cb55d

上圖將所有的哈希值從小到大向上排列,從最底層(最小的哈希值)到目標值(Target)都是正確的哈希值。一個符合某目標的哈希值例子:

000000000000000000000000f8ef337347f96b42743260f62f3a3d56751d2c67

簡單來說,這個目標值可以看成是領頭”0"的數量。一個16進位的64位元數字有1⁶⁶⁴種不同的結果,假設目標值是前面18位元都要是0,那低於目標值的數就只剩下1⁶⁴⁶個。而隨機猜中低於目標值的數(正確答案)的機率就是:

1⁶⁴⁶/1⁶⁶⁴= 0.00000000000000000002%

因此我們可以藉由減少或增加領頭0的數量,來增加或減少難度。

假設我們將目標值設成只要最前面的一個數字是0就好,那我們的難度就直接降低到1⁶⁶³/1⁶⁶⁴=1/16=6.25%

https://medium.com/swlh/how-does-bitcoin-blockchain-mining-work-36db1c5cb55d

問題來了…

在挖礦過程中,我們藉由猜測Nonce來找到符合目標的哈希值,但在區塊頭中,Nonce的大小是32bits,也就是²³²,約40億種可能,這就產生了兩個問題:

  1. 有可能找不到適合的Nonce使得哈希值低於目標值。
  2. 平均一台挖礦的機器一秒鐘可以計算1億個哈希值,也就是只要40秒就可以試完所有的Nonce

但比特幣平均十分鐘才挖出一個區塊?

?????????????

所以挖礦機制中除了Nonce其實還有兩個隱藏的關鍵解決了這個問題:

  1. 輸入值中的時間戳記會隨著時間而改變
https://medium.com/swlh/how-does-bitcoin-blockchain-mining-work-36db1c5cb55d

因為時間戳記每一秒都在更新,每過一秒你的輸入和輸出就會變得完全不同,嘗試過的Nonce就會因此產生出不同的結果。因此若你的礦機運算的超級快,在一秒之內就把所有的Nonce全部試完了,你可以等下一秒再全部試一次。

那如果你不想等下一秒呢?因此還有第二個關鍵:

2. 更換被打包的交易組合

https://medium.com/swlh/how-does-bitcoin-blockchain-mining-work-36db1c5cb55d

同樣的道理,若交易組合被更換了,造成輸入值的改變,而得到的哈希值也會截然不同,因此我們就可以不休息,不斷挖礦。

以上是一整個挖礦流程的細節,有一些部分可能太複雜因此在很多文章中都是點到為止,希望有讓大家理解~

參考資料:

How does Bitcoin / Blockchain Mining work?

Blockchain: What is Mining?

--

--

Hank Huang
The Z Institute

M.S. in Institute of Data Science and Engineering @NCTU | Deep Learning & Blockchain | instagram.com/hannnnk1231__