你知道礦工在挖什么嗎?| 小白學(xué)比特幣之三

本文目錄
1. 什么是挖礦
2. 什么是礦工
3. 挖礦四步驟
-- 3.1. 驗證交易
-- 3.2. 把交易加入?yún)^(qū)塊
-- 3.3. 驗證區(qū)塊
-- 3.4. 把區(qū)塊加入主鏈

1. 什么是挖礦

比特幣系統(tǒng)中,挖礦主要有兩個目的:

  1. 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ù)比特幣共識來驗證所有交易。因此,挖礦通過拒絕非法或者異常的交易來為比特幣交易提供安全保障。

  1. 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. 挖礦四步驟

比特幣挖礦有四個步驟:

  1. 驗證交易
  2. 把已驗證交易加入?yún)^(qū)塊
  3. 驗證區(qū)塊
  4. 把已驗證區(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ù)量。


比特幣產(chǎn)量圖,source: http://www.lothar.com/presentations/bitcoin-brownbag/master.html

3.2.2 區(qū)塊頭(Block Header)

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


區(qū)塊頭結(jié)構(gòu)
  • 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失??;source: http://learnmeabitcoin.com/glossary/nonce

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


猜Nonce成功,WIN! Source: http://learnmeabitcoin.com/glossary/nonce

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


比特幣區(qū)塊結(jié)構(gòu)圖 Source http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html

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

區(qū)塊信息

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ā)布
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容