本文目錄
1. 什么是挖礦
2. 什么是礦工
3. 挖礦四步驟
-- 3.1. 驗(yàn)證交易
-- 3.2. 把交易加入?yún)^(qū)塊
-- 3.3. 驗(yàn)證區(qū)塊
-- 3.4. 把區(qū)塊加入主鏈
1. 什么是挖礦
比特幣系統(tǒng)中,挖礦主要有兩個(gè)目的:
- 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)
第一個(gè)目的是蘸际,挖礦根據(jù)比特幣共識(shí)來驗(yàn)證所有交易寸爆。因此,挖礦通過拒絕非法或者異常的交易來為比特幣交易提供安全保障箍铭。
- 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)
第二個(gè)目的是,挖礦會(huì)在每個(gè)區(qū)塊里產(chǎn)生新的比特幣椎镣,就像中央銀行印錢一樣诈火。每個(gè)區(qū)塊所能產(chǎn)生的比特幣是有限的,并且會(huì)隨著時(shí)間遞減衣陶。
總的來說柄瑰,挖礦行為主要是為整個(gè)比特幣系統(tǒng)提供安全保障闸氮,并且產(chǎn)生新的比特幣剪况。
挖礦,其實(shí)是一種比喻的說法蒲跨。比特幣的總量是2100萬枚译断,是限量供應(yīng)。就像其他稀有金屬一樣(比如黃金)或悲,總量有限孙咪,每開采一點(diǎn),可使用量也會(huì)變少巡语。
2. 礦工
之前提到過翎蹈,比特幣是一個(gè)點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)。這里的“點(diǎn)”就是節(jié)點(diǎn)(node)男公,所謂節(jié)點(diǎn)就是指運(yùn)行了比特幣軟件的計(jì)算機(jī)荤堪。每個(gè)人都可以成為一個(gè)節(jié)點(diǎn),只要你在計(jì)算機(jī)上安裝了比特幣軟件枢赔,然后你的計(jì)算機(jī)就會(huì)自動(dòng)在網(wǎng)絡(luò)上傳播比特幣交易澄阳。有些節(jié)點(diǎn)會(huì)把交易加入到區(qū)塊,放到區(qū)塊鏈上踏拜,這樣的節(jié)點(diǎn)就是挖礦節(jié)點(diǎn)(mining node)碎赢,也就是我們通常所說的礦工(miner)。當(dāng)然速梗,也可以用礦工來代指維護(hù)挖礦節(jié)點(diǎn)的人肮塞。
3. 挖礦四步驟
比特幣挖礦有四個(gè)步驟:
- 驗(yàn)證交易
- 把已驗(yàn)證交易加入?yún)^(qū)塊
- 驗(yàn)證區(qū)塊
- 把已驗(yàn)證區(qū)塊加到鏈上
3.1 驗(yàn)證交易
任何比特幣節(jié)點(diǎn)接收到一筆比特幣交易后第一件事就是驗(yàn)證這筆交易襟齿。有一個(gè)標(biāo)準(zhǔn)清單來驗(yàn)證一筆交易是否合法有效,這個(gè)清單里所包含的檢查條目有十幾條枕赵,就不一一翻譯了蕊唐,可以在這個(gè)網(wǎng)址上看到詳細(xì)條目https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch10.asciidoc
3.2 把已驗(yàn)證交易加入?yún)^(qū)塊
被驗(yàn)證過的交易會(huì)放在記憶池里 (memory pool) 或者交易池(transaction pool)里。礦工會(huì)構(gòu)建一個(gè)新的空區(qū)塊烁设,并從記憶池里收集一些交易放入到這個(gè)區(qū)塊中替梨。那么這個(gè)新的區(qū)塊包含什么東西呢?總的來說装黑,每個(gè)區(qū)塊里包含的信息如下:
- coinbase交易
- 已驗(yàn)證交易若干
- 交易費(fèi)用
- 區(qū)塊頭(Block Header)
3.2.1 Coinbase交易
coinbase交易副瀑,每個(gè)區(qū)塊里的第一筆交易就叫做coinbase交易(coinbase transaction),這筆交易里只包含了一個(gè)輸入(Input), 叫做coinbase恋谭,用來創(chuàng)建新比特幣糠睡。實(shí)際上,coinbase只是一個(gè)"空白"輸入("blank" input)疚颊。
每個(gè)新區(qū)塊所產(chǎn)生的比特幣數(shù)量是每21萬個(gè)區(qū)塊后(大約四年)自動(dòng)減半的狈孔,下面這張圖就是每21萬個(gè)區(qū)塊后,每個(gè)區(qū)塊可以產(chǎn)生的新比特幣數(shù)量材义。
3.2.2 區(qū)塊頭(Block Header)
區(qū)塊頭主要是用來識(shí)別一個(gè)區(qū)塊,其實(shí)就像是一堆元數(shù)據(jù)(metadata)其掂,相當(dāng)于iPhone手機(jī)里的“關(guān)于本機(jī)“信息油挥。區(qū)塊頭包含的數(shù)據(jù)如下圖所示:
Version,版本款熬, 指這個(gè)協(xié)議版本深寥,也就是比特幣軟件版本。
Previous Block Hash贤牛, 上一個(gè)區(qū)塊哈希值惋鹅。
Merkle Root,默克爾樹殉簸。用默克爾樹這種方法將這個(gè)區(qū)塊里的所有交易ID(TXIDs)進(jìn)行配對(duì)后闰集,進(jìn)行哈希SHA256運(yùn)算后,會(huì)產(chǎn)生一個(gè)特定的值喂链。
Timestamp, 時(shí)間戳返十,當(dāng)前時(shí)間,相當(dāng)于創(chuàng)建這個(gè)區(qū)塊時(shí)的時(shí)間點(diǎn)椭微。
-
Bits洞坑,用來存儲(chǔ)當(dāng)前系統(tǒng)的target用的,是難度值(Target)的簡(jiǎn)化版蝇率,系統(tǒng)將target變成bits存放在當(dāng)前區(qū)塊里迟杂。當(dāng)一個(gè)區(qū)塊頭的數(shù)據(jù)哈希SHA256運(yùn)算后得出的值刽沾,要小于或者等于這個(gè)target。
Bits轉(zhuǎn)成Target, source: http://learnmeabitcoin.com/glossary/bits Nonce, 是一個(gè)需要去“猜”的數(shù)字, 用這個(gè)數(shù)字來和區(qū)塊頭里的其他數(shù)據(jù)進(jìn)行哈希運(yùn)算(也就是猜數(shù)字)排拷。從0開始猜侧漓,如果0不對(duì),就1监氢,1不對(duì)布蔗,就2,這樣遞增下去浪腐。直到這個(gè)數(shù)字返回一個(gè)區(qū)塊哈希值小于目標(biāo)難度值(target nBits)纵揍。
礦工要“猜”的數(shù)字NONCE。
礦工要“猜”的數(shù)字NONCE议街。
礦工要“猜”的數(shù)字NONCE泽谨。
用一個(gè)簡(jiǎn)單的不等式來表示就是:
Hash Function H(Nonce+一個(gè)區(qū)塊里其他數(shù)據(jù))= Block Hash ≤ 當(dāng)前Target
Nonce和這個(gè)區(qū)塊里的其他數(shù)據(jù)經(jīng)過哈希運(yùn)算后吧雹,得到一個(gè)值,這個(gè)值要小于等于target nBits涂身。在這樣的情況下雄卷,這位礦工在這個(gè)10分鐘的競(jìng)賽中獲得了勝利。同時(shí)访得,他需要把這個(gè)得到答案的區(qū)塊傳給其他節(jié)點(diǎn)龙亲,接下來需要其他節(jié)點(diǎn)對(duì)這個(gè)區(qū)塊進(jìn)行驗(yàn)證陕凹,這樣悍抑,他就可以獲得新的比特幣以及交易費(fèi)用。
根據(jù)以上的描述搜骡,一個(gè)區(qū)塊包含的主要信息就如下圖所示:
在網(wǎng)頁前端里顯示如下,https://blockchain.info/block-height/286819
3.2.3 驗(yàn)證區(qū)塊
既然一位礦工聲稱自己是第一個(gè)解出難題的人佑女,那么其他礦工需要對(duì)他的答案進(jìn)行驗(yàn)證记靡。那么,跟驗(yàn)證交易一樣团驱,驗(yàn)證區(qū)塊也需要符合一些列的標(biāo)準(zhǔn)摸吠,通過驗(yàn)證后才能成為有效區(qū)塊放到網(wǎng)絡(luò)上,這些驗(yàn)證標(biāo)準(zhǔn)是:
- 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ū)塊頭的哈希值小于目標(biāo)難度值
- The block timestamp is less than two hours in the future (allowing for errors) 區(qū)塊的時(shí)間戳小于未來兩小時(shí)
- The block size is within acceptable limits 區(qū)塊的大小是在限定范圍內(nèi)(比特幣每個(gè)區(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" (這個(gè)區(qū)塊里的所有交易都是合法有效的)
3.2.4 把區(qū)塊加入到主鏈接上
當(dāng)一個(gè)節(jié)點(diǎn)收到一個(gè)新的已被驗(yàn)證過的區(qū)塊后嚎花,這個(gè)節(jié)點(diǎn)會(huì)看一下這個(gè)區(qū)塊的上一個(gè)區(qū)塊哈希值寸痢,看看它的“爹”是誰,然后把這個(gè)區(qū)塊的“爹”找到紊选,把這個(gè)區(qū)塊接到它“爹”后面啼止,這樣一個(gè)區(qū)塊就被正式的納入到區(qū)塊鏈主鏈上(main chain)了道逗,一個(gè)有效的鏈才算成功的“長(zhǎng)高”了。
參考文獻(xiàn)
[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 修改標(biāo)題為“小白學(xué)比特幣”献烦,增加參考文獻(xiàn)
- 20180315 修改關(guān)于coinbase交易描述
- 20180314 修改標(biāo)題
- 20180310 修改對(duì)于Bits的解釋滓窍;增加關(guān)于Nonce截圖;增加網(wǎng)頁前端區(qū)塊信息截圖
- 20180307 首次發(fā)布