基礎(chǔ)數(shù)據(jù)
發(fā)行總量:2100萬(wàn)朽肥。
新區(qū)塊生成周期:約10分鐘梗脾。
挖礦難度調(diào)整周期:每2016個(gè)區(qū)塊,大約2個(gè)星期繁涂。
挖礦獎(jiǎng)勵(lì):比特幣的挖礦獎(jiǎng)勵(lì)來(lái)源于兩部分:
- 創(chuàng)世區(qū)塊獎(jiǎng)勵(lì)50個(gè)比特幣拱她,以后每210000個(gè)區(qū)塊減半,即約4年調(diào)整一次扔罪。目前已經(jīng)經(jīng)歷了兩次減半秉沼,當(dāng)前的挖礦獎(jiǎng)勵(lì)為12.5個(gè)比特幣。
- 比特幣的每個(gè)交易必須支付一定數(shù)額的手續(xù)費(fèi)給礦工矿酵。這個(gè)設(shè)定是為了防止惡意節(jié)點(diǎn)發(fā)送大量的垃圾交易對(duì)比特幣網(wǎng)絡(luò)進(jìn)行DOS攻擊唬复。
挖礦算法
挖礦參考算法:挖礦算法為SHA256。在挖礦過(guò)程中全肮,礦工將比特幣的80個(gè)字節(jié)長(zhǎng)度的區(qū)塊頭數(shù)據(jù)進(jìn)行兩次SHA256運(yùn)算盅抚,運(yùn)算結(jié)果就是一個(gè)256位(32字節(jié))長(zhǎng)度的字符串。通過(guò)比較與當(dāng)前難度值的大小判斷當(dāng)前區(qū)塊是否合法倔矾。即滿足下列條件:
SHA256(SHA256(block_header))< difficulty
如果不滿足上面的條件妄均,則需要在區(qū)塊頭中改變一下隨機(jī)值柱锹,或者使用隨機(jī)數(shù)據(jù)填充coinbase交易,這樣就能改變區(qū)塊頭的數(shù)據(jù)丰包,從而找到滿足條件的區(qū)塊禁熏。這就是PoW機(jī)制的精髓所在,使用單向函數(shù)邑彪,迫使礦工不斷地嘗試隨機(jī)數(shù)找到符合條件的區(qū)塊以完成一定的計(jì)算量瞧毙,保障系統(tǒng)的安全穩(wěn)定。
實(shí)例分析
為了更加深入理解比特幣的挖礦算法寄症,以一個(gè)實(shí)際的區(qū)塊數(shù)據(jù)為例宙彪。
首先獲取區(qū)塊號(hào)為100000的區(qū)塊原始數(shù)據(jù),可以在https://webbtc.com/block/000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506.hex上獲扔星伞:
0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b57100401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020602ffffffff0100f2052a010000004341041b0e8c2567c12536aa13357b79a073dc4444acb83c4ec7a0e2f99dd7457516c5817242da796924ca4e99947d087fedf9ce467cb9f7c6287078f801df276fdf84ac000000000100000001032e38e9c0a84c6046d687d10556dcacc41d275ec55fc00779ac88fdf357a187000000008c493046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af7748014104f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3ffffffff0200e32321000000001976a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac000000000100000001c33ebff2a709f13d9f9a7569ab16a32786af7d7e2de09265e41c61d078294ecf010000008a4730440220032d30df5ee6f57fa46cddb5eb8d0d9fe8de6b342d27942ae90a3231e0ba333e02203deee8060fdc70230a7f5b4ad7d7bc3e628cbe219a886b84269eaeb81e26b4fe014104ae31c31bf91278d99b8377a35bbce5b27d9fff15456839e919453fc7b3f721f0ba403ff96c9deeb680e5fd341c0fc3a7b90da4631ee39560639db462e9cb850fffffffff0240420f00000000001976a914b0dcbf97eabf4404e31d952477ce822dadbe7e1088acc060d211000000001976a9146b1281eec25ab4e1e0793ff4e08ab1abb3409cd988ac0000000001000000010b6072b386d4a773235237f64c1126ac3b240c84b917a3909ba1c43ded5f51f4000000008c493046022100bb1ad26df930a51cce110cf44f7a48c3c561fd977500b1ae5d6b6fd13d0b3f4a022100c5b42951acedff14abba2736fd574bdb465f3e6f8da12e2c5303954aca7f78f3014104a7135bfe824c97ecc01ec7d7e336185c81e2aa2c41ab175407c09484ce9694b44953fcb751206564a9c24dd094d42fdbfdd5aad3e063ce6af4cfaaea4ea14fbbffffffff0140420f00000000001976a91439aa3d569e06a1d7926dc4be1193c99bf2eb9ee088ac00000000
獲取的數(shù)據(jù)是16進(jìn)制的释漆,其中前80個(gè)字節(jié)是區(qū)塊頭數(shù)據(jù)。對(duì)前80個(gè)字節(jié)數(shù)據(jù)進(jìn)行雙SHA256運(yùn)算篮迎,得到當(dāng)前區(qū)塊的哈希值男图。Go語(yǔ)言代碼如下:
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
)
const HashSize = 32
type Hash [32]byte
func (hash Hash) String() string {
for i := 0; i < HashSize/2; i++ {
hash[i], hash[HashSize-1-i] = hash[HashSize-1-i], hash[i]
}
return hex.EncodeToString(hash[:])
}
func main() {
block, _ := hex.DecodeString("0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b57100401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020602ffffffff0100f2052a010000004341041b0e8c2567c12536aa13357b79a073dc4444acb83c4ec7a0e2f99dd7457516c5817242da796924ca4e99947d087fedf9ce467cb9f7c6287078f801df276fdf84ac000000000100000001032e38e9c0a84c6046d687d10556dcacc41d275ec55fc00779ac88fdf357a187000000008c493046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af7748014104f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3ffffffff0200e32321000000001976a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac000000000100000001c33ebff2a709f13d9f9a7569ab16a32786af7d7e2de09265e41c61d078294ecf010000008a4730440220032d30df5ee6f57fa46cddb5eb8d0d9fe8de6b342d27942ae90a3231e0ba333e02203deee8060fdc70230a7f5b4ad7d7bc3e628cbe219a886b84269eaeb81e26b4fe014104ae31c31bf91278d99b8377a35bbce5b27d9fff15456839e919453fc7b3f721f0ba403ff96c9deeb680e5fd341c0fc3a7b90da4631ee39560639db462e9cb850fffffffff0240420f00000000001976a914b0dcbf97eabf4404e31d952477ce822dadbe7e1088acc060d211000000001976a9146b1281eec25ab4e1e0793ff4e08ab1abb3409cd988ac0000000001000000010b6072b386d4a773235237f64c1126ac3b240c84b917a3909ba1c43ded5f51f4000000008c493046022100bb1ad26df930a51cce110cf44f7a48c3c561fd977500b1ae5d6b6fd13d0b3f4a022100c5b42951acedff14abba2736fd574bdb465f3e6f8da12e2c5303954aca7f78f3014104a7135bfe824c97ecc01ec7d7e336185c81e2aa2c41ab175407c09484ce9694b44953fcb751206564a9c24dd094d42fdbfdd5aad3e063ce6af4cfaaea4ea14fbbffffffff0140420f00000000001976a91439aa3d569e06a1d7926dc4be1193c99bf2eb9ee088ac00000000")
first := sha256.Sum256(block[:80]) // 選擇區(qū)塊的前80個(gè)字節(jié),即區(qū)塊頭數(shù)據(jù)甜橱,進(jìn)行第一次哈希運(yùn)算
second := sha256.Sum256(first[:]) // 將第一次結(jié)果繼續(xù)哈希逊笆,得到第二個(gè)結(jié)果,該結(jié)果為區(qū)塊哈希值
fmt.Printf("blockheader is: \n%x\n", block[:80])
fmt.Printf("doublehash is:\n%v\n", Hash(second))
}
運(yùn)行結(jié)果為:
blockheader is:
0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b5710
doublehash is:
000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
可以發(fā)現(xiàn)經(jīng)過(guò)兩次SHA256運(yùn)算之后得到的結(jié)果就是區(qū)塊哈希岂傲。