本文目錄
1. 什么是挖礦
2. 什么是礦工
3. 挖礦四步驟
-- 3.1. 驗證交易
-- 3.2. 把交易加入?yún)^(qū)塊
-- 3.3. 驗證區(qū)塊
-- 3.4. 把區(qū)塊加入主鏈
1. 什么是挖礦
比特幣系統(tǒng)中,挖礦主要有兩個目的:
- Mining nodes validate all transactions by reference to bitcoin's consensus rule. Therefore, mining provides security for bitcoin transactions by rejecting invalid or malformed transactions. (From Mastering Bitcoin)
第一個目的是,挖礦根據(jù)比特幣共識來驗證所有交易。因此,挖礦通過拒絕非法或者異常的交易來為比特幣交易提供安全保障。
- Mining creates new bitcoin in each block, almost like a central bank printing new money. The amount of bitcoin created per block is limited and diminishes with time , following a fixed issuance schedule. (From Mastering Bitcoin)
第二個目的是,挖礦會在每個區(qū)塊里產(chǎn)生新的比特幣,就像中央銀行印錢一樣。每個區(qū)塊所能產(chǎn)生的比特幣是有限的,并且會隨著時間遞減。
總的來說,挖礦行為主要是為整個比特幣系統(tǒng)提供安全保障,并且產(chǎn)生新的比特幣。
挖礦,其實是一種比喻的說法。比特幣的總量是2100萬枚,是限量供應(yīng)。就像其他稀有金屬一樣(比如黃金),總量有限,每開采一點,可使用量也會變少。
2. 礦工
之前提到過,比特幣是一個點對點的電子現(xiàn)金系統(tǒng)。這里的“點”就是節(jié)點(node),所謂節(jié)點就是指運行了比特幣軟件的計算機。每個人都可以成為一個節(jié)點,只要你在計算機上安裝了比特幣軟件,然后你的計算機就會自動在網(wǎng)絡(luò)上傳播比特幣交易。有些節(jié)點會把交易加入到區(qū)塊,放到區(qū)塊鏈上,這樣的節(jié)點就是挖礦節(jié)點(mining node),也就是我們通常所說的礦工(miner)。當然,也可以用礦工來代指維護挖礦節(jié)點的人。
3. 挖礦四步驟
比特幣挖礦有四個步驟:
- 驗證交易
- 把已驗證交易加入?yún)^(qū)塊
- 驗證區(qū)塊
- 把已驗證區(qū)塊加到鏈上
3.1 驗證交易
任何比特幣節(jié)點接收到一筆比特幣交易后第一件事就是驗證這筆交易。有一個標準清單來驗證一筆交易是否合法有效,這個清單里所包含的檢查條目有十幾條,就不一一翻譯了,可以在這個網(wǎng)址上看到詳細條目https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch10.asciidoc
3.2 把已驗證交易加入?yún)^(qū)塊
被驗證過的交易會放在記憶池里 (memory pool) 或者交易池(transaction pool)里。礦工會構(gòu)建一個新的空區(qū)塊,并從記憶池里收集一些交易放入到這個區(qū)塊中。那么這個新的區(qū)塊包含什么東西呢?總的來說,每個區(qū)塊里包含的信息如下:
- coinbase交易
- 已驗證交易若干
- 交易費用
- 區(qū)塊頭(Block Header)
3.2.1 Coinbase交易
coinbase交易,每個區(qū)塊里的第一筆交易就叫做coinbase交易(coinbase transaction),這筆交易里只包含了一個輸入(Input), 叫做coinbase,用來創(chuàng)建新比特幣。實際上,coinbase只是一個"空白"輸入("blank" input)。
每個新區(qū)塊所產(chǎn)生的比特幣數(shù)量是每21萬個區(qū)塊后(大約四年)自動減半的,下面這張圖就是每21萬個區(qū)塊后,每個區(qū)塊可以產(chǎn)生的新比特幣數(shù)量。

3.2.2 區(qū)塊頭(Block Header)
區(qū)塊頭主要是用來識別一個區(qū)塊,其實就像是一堆元數(shù)據(jù)(metadata),相當于iPhone手機里的“關(guān)于本機“信息。區(qū)塊頭包含的數(shù)據(jù)如下圖所示:

Version,版本, 指這個協(xié)議版本,也就是比特幣軟件版本。
Previous Block Hash, 上一個區(qū)塊哈希值。
Merkle Root,默克爾樹。用默克爾樹這種方法將這個區(qū)塊里的所有交易ID(TXIDs)進行配對后,進行哈希SHA256運算后,會產(chǎn)生一個特定的值。
Timestamp, 時間戳,當前時間,相當于創(chuàng)建這個區(qū)塊時的時間點。
-
Bits,用來存儲當前系統(tǒng)的target用的,是難度值(Target)的簡化版,系統(tǒng)將target變成bits存放在當前區(qū)塊里。當一個區(qū)塊頭的數(shù)據(jù)哈希SHA256運算后得出的值,要小于或者等于這個target。
Bits轉(zhuǎn)成Target, source: http://learnmeabitcoin.com/glossary/bits Nonce, 是一個需要去“猜”的數(shù)字, 用這個數(shù)字來和區(qū)塊頭里的其他數(shù)據(jù)進行哈希運算(也就是猜數(shù)字)。從0開始猜,如果0不對,就1,1不對,就2,這樣遞增下去。直到這個數(shù)字返回一個區(qū)塊哈希值小于目標難度值(target nBits)。
礦工要“猜”的數(shù)字NONCE。
礦工要“猜”的數(shù)字NONCE。
礦工要“猜”的數(shù)字NONCE。
用一個簡單的不等式來表示就是:
Hash Function H(Nonce+一個區(qū)塊里其他數(shù)據(jù))= Block Hash ≤ 當前Target

Nonce和這個區(qū)塊里的其他數(shù)據(jù)經(jīng)過哈希運算后,得到一個值,這個值要小于等于target nBits。在這樣的情況下,這位礦工在這個10分鐘的競賽中獲得了勝利。同時,他需要把這個得到答案的區(qū)塊傳給其他節(jié)點,接下來需要其他節(jié)點對這個區(qū)塊進行驗證,這樣,他就可以獲得新的比特幣以及交易費用。

根據(jù)以上的描述,一個區(qū)塊包含的主要信息就如下圖所示:

在網(wǎng)頁前端里顯示如下,https://blockchain.info/block-height/286819

3.2.3 驗證區(qū)塊
既然一位礦工聲稱自己是第一個解出難題的人,那么其他礦工需要對他的答案進行驗證。那么,跟驗證交易一樣,驗證區(qū)塊也需要符合一些列的標準,通過驗證后才能成為有效區(qū)塊放到網(wǎng)絡(luò)上,這些驗證標準是:
- The block data structure is syntactically valid 區(qū)塊數(shù)據(jù)結(jié)構(gòu)語法有效
- The block header hash is less than the target (enforces the Proof-of-Work) 區(qū)塊頭的哈希值小于目標難度值
- The block timestamp is less than two hours in the future (allowing for errors) 區(qū)塊的時間戳小于未來兩小時
- The block size is within acceptable limits 區(qū)塊的大小是在限定范圍內(nèi)(比特幣每個區(qū)塊大小限制在1MB以內(nèi))
- The first transaction (and only the first) is a coinbase transaction (第一筆交易是coinbase交易)
- All transactions within the block are valid using the transaction checklist discussed in "verification of Transactions" (這個區(qū)塊里的所有交易都是合法有效的)
3.2.4 把區(qū)塊加入到主鏈接上
當一個節(jié)點收到一個新的已被驗證過的區(qū)塊后,這個節(jié)點會看一下這個區(qū)塊的上一個區(qū)塊哈希值,看看它的“爹”是誰,然后把這個區(qū)塊的“爹”找到,把這個區(qū)塊接到它“爹”后面,這樣一個區(qū)塊就被正式的納入到區(qū)塊鏈主鏈上(main chain)了,一個有效的鏈才算成功的“長高”了。
參考文獻
[1] Mastering Bitcoin 第二版 https://github.com/bitcoinbook/bitcoinbook
[2] http://learnmeabitcoin.com/glossary/nonce
[3] https://www.coindesk.com/information/how-bitcoin-mining-works/
ChangeLog
- 20180317 更新3.2.4 把區(qū)塊加入到主鏈接上內(nèi)容
- 20180316 修改標題為“小白學(xué)比特幣”,增加參考文獻
- 20180315 修改關(guān)于coinbase交易描述
- 20180314 修改標題
- 20180310 修改對于Bits的解釋;增加關(guān)于Nonce截圖;增加網(wǎng)頁前端區(qū)塊信息截圖
- 20180307 首次發(fā)布
