1. 程式人生 > >比特幣挖礦演算法

比特幣挖礦演算法

基礎資料

發行總量:2100萬。
新區塊生成周期:約10分鐘。
挖礦難度調整週期:每2016個區塊,大約2個星期。
挖礦獎勵:比特幣的挖礦獎勵來源於兩部分:

  • 創世區塊獎勵50個比特幣,以後每210000個區塊減半,即約4年調整一次。目前已經經歷了兩次減半,當前的挖礦獎勵為12.5個比特幣。
  • 比特幣的每個交易必須支付一定數額的手續費給礦工。這個設定是為了防止惡意節點發送大量的垃圾交易對比特幣網路進行DOS攻擊。

挖礦演算法

挖礦參考演算法:挖礦演算法為SHA256。在挖礦過程中,礦工將比特幣的80個位元組長度的區塊頭資料進行兩次SHA256運算,運算結果就是一個256位(32位元組)長度的字串。通過比較與當前難度值的大小判斷當前區塊是否合法。即滿足下列條件:
SHA256(SHA256(block_header))< difficulty


如果不滿足上面的條件,則需要在區塊頭中改變一下隨機值,或者使用隨機資料填充coinbase交易,這樣就能改變區塊頭的資料,從而找到滿足條件的區塊。這就是PoW機制的精髓所在,使用單向函式,迫使礦工不斷地嘗試隨機數找到符合條件的區塊以完成一定的計算量,保障系統的安全穩定。

例項分析

為了更加深入理解比特幣的挖礦演算法,以一個實際的區塊資料為例。

0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b57100401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020602ffffffff0100f2052a010000004341041b0e8c2567c12536aa13357b79a073dc4444acb83c4ec7a0e2f99dd7457516c5817242da796924ca4e99947d087fedf9ce467cb9f7c6287078f801df276fdf84ac000000000100000001032e38e9c0a84c6046d687d10556dcacc41d275ec55fc00779ac88fdf357a187000000008c493046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af7748014104f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3ffffffff0200e32321000000001976a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac000000000100000001c33ebff2a709f13d9f9a7569ab16a32786af7d7e2de09265e41c61d078294ecf010000008a4730440220032d30df5ee6f57fa46cddb5eb8d0d9fe8de6b342d27942ae90a3231e0ba333e02203deee8060fdc70230a7f5b4ad7d7bc3e628cbe219a886b84269eaeb81e26b4fe014104ae31c31bf91278d99b8377a35bbce5b27d9fff15456839e919453fc7b3f721f0ba403ff96c9deeb680e5fd341c0fc3a7b90da4631ee39560639db462e9cb850fffffffff0240420f00000000001976a914b0dcbf97eabf4404e31d952477ce822dadbe7e1088acc060d211000000001976a9146b1281eec25ab4e1e0793ff4e08ab1abb3409cd
988ac0000000001000000010b6072b386d4a773235237f64c1126ac3b240c84b917a3909ba1c43ded5f51f4000000008c493046022100bb1ad26df930a51cce110cf44f7a48c3c561fd977500b1ae5d6b6fd13d0b3f4a022100c5b42951acedff14abba2736fd574bdb465f3e6f8da12e2c5303954aca7f78f3014104a7135bfe824c97ecc01ec7d7e336185c81e2aa2c41ab175407c09484ce9694b44953fcb751206564a9c24dd094d42fdbfdd5aad3e063ce6af4cfaaea4ea14fbbffffffff0140420f00000000001976a91439aa3d569e06a1d7926dc4be1193c99bf2eb9ee088ac00000000

獲取的資料是16進位制的,其中前80個位元組是區塊頭資料。對前80個位元組資料進行雙SHA256運算,得到當前區塊的雜湊值。Go語言程式碼如下:

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])  // 選擇區塊的前80個位元組,即區塊頭資料,進行第一次雜湊運算
    second := sha256.Sum256(first[:])   // 將第一次結果繼續雜湊,得到第二個結果,該結果為區塊雜湊值
    fmt.Printf("blockheader is: \n%x\n", block[:80])
    fmt.Printf("doublehash is:\n%v\n", Hash(second))
}

執行結果為:

blockheader is:
0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b5710
doublehash is:
000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506

可以發現經過兩次SHA256運算之後得到的結果就是區塊雜湊。

相關推薦

演算法

基礎資料 發行總量:2100萬。 新區塊生成周期:約10分鐘。 挖礦難度調整週期:每2016個區塊,大約2個星期。 挖礦獎勵:比特幣的挖礦獎勵來源於兩部分: 創世區塊獎勵50個比特幣,以後每210000個區塊減半,即約4年調整一次。目前已經經歷了兩次

演算法

Bitcoin mining uses the hashcash proof of work function; the hashcash algorithm requires the following parameters: a service string, a nonce, and a counter

#part1# 演算法

之前,我總以為挖礦就是把Nonce值都試一遍,然後用SHA256演算法算一遍。後面發現自己把東西看得太簡單,我嘗試嘗試講講比特幣的挖礦演算法的流程。 區塊頭 首先挖礦演算法的目標物件只是區塊中的區塊頭,共80個位元組,我們來看看區塊頭有哪些欄位:

的兩種方式

  比特幣挖礦,一般有兩種方式,早期一般都是solo方式,就是單槍匹馬淘金,隨著挖礦設備性能的指數級提高,solo已經無法保障收入,現在一般都是采用加入礦池的方式。 solo方式 說明如下: solo礦工一般通過bitcoind來網絡上獲得新的交易。 挖礦軟件(比如50Miner,GU

《區塊鏈100問》第27集:機進化史

gpo tran per 很難 區塊 出了 http lin sin 自從比特幣誕生以來,比特幣挖礦經歷了以下四個階段:   CPU挖礦-GPU挖礦-專業礦機挖礦-礦池挖礦。   2009年1月3日,比特幣創始人中本聰用電腦CPU挖出了第一批比特幣。   隨著大家對比特幣

對環境真正的影響是什麽?

sta -o 機制 表示 出現 qwt 競爭優勢 錯誤 還要 加密貨幣挖礦其實比印制法幣耗費的電力少。 截至現在,比特幣每天交易數量高達15萬-40萬筆。隨著比特幣網絡算力難度的增加,挖礦對環境影響的問題也愈加突出。比特幣挖礦制度簡介 比特幣挖礦制度指通過計算機硬件

速率單位kH/s,MH/s,GH/s匯率轉換

比特幣挖礦kH/s,MH/s和GH/s有什麼區別? 另外,當我說300 kH /s這是否意味著每秒產生30萬個雜湊? 最佳說明 當然: 1 kH /s是每秒1,000次雜湊(雜湊)(有時錯誤地寫成KH /s)。 1 MH /s是每秒1,000,000

難度升級 區塊鏈交易平臺壟斷加速!

幣挖礦:比特幣挖礦難度升級,行業壟斷加速! 2017年,韭菜們被收割,幣圈哀嚎陣陣,引起市場的恐慌不斷上升。一年的時間裡,幣圈的漲漲浮浮,韭菜們追漲、殺跌、抄底在無限迴圈著。想要獲利是很重要的,但是更重要的是韭菜們怎麼讓自己不被割。然而比特幣挖礦難度升級,韭菜們如何改變被割

什麼意思

認知能力的邊界決定了資訊的利用效率,而結構或者制度決定了資訊的傳播效率。所以,判斷一個區塊鏈的社群是否有價值,資訊的維度是第一個判斷標準。 我們看到新古典經濟學中對資訊的假設是認為市場資訊是完全對稱透明的,而事實上這個假設並不成立。資訊不僅是不對稱的,而且資訊

Go語言學習(三) 簡單類實現

//utils.go package main import ( "bytes" "encoding/binary" "log" ) func IntToHex(num int64)[]byte{ buff:=new(bytes.Buffer) //開闢記憶體,

浪費電?你不懂背後的真相!

挖比特幣,費電。 眾所周知。 以目前通用的螞蟻礦機s9i為例。 實打實的1365瓦,具體跑起來的話只會更誇張。平均每天耗電35度電左右。 來自去年的資料,比特幣挖礦在2017年的實時耗電量已經佔到全球總耗電量的0.5%,並且已超越了159個國家的耗電量。下面這

雲算力是什麼?這得要從談起

雲算力挖礦是什麼?相信還有不少幣圈礦工是不太瞭解的,因為很多礦工定義比特幣挖礦就是礦機挖礦,買一堆螞蟻礦機、阿瓦隆礦機、神馬礦機就可以開始比特幣挖礦。但隨著比特幣挖礦市場的快速升溫,挖礦行業也不斷進步和探索著新的挖礦方式。因為參與挖礦的礦工不斷在增加,全網算力也

僅算電費,成本是多少?

比特幣投資,可通過挖礦低廉的方式獲取。那挖到一個比特幣的成本是多少?礦工如何降低挖礦成本,如何控制風險?特別是行情低迷的時,挖到一個比特幣只算電費成本是多少? 挖礦成本主要是礦機的價格和電費,礦機的算力和全網算力相關。礦機的算力高於全網算力,獲取比特幣快,礦機功耗高,也是電費高。比特幣暴

難度降15% 圈重新洗牌,礦工還要關機嗎?

最近比特幣收益不斷縮水。礦圈有人關機,有人退出,挖礦參與人員減少,挖礦難度降低。堅守的礦工,隨著挖礦難度降低,可挖到更多的比特幣。日本有一家公司,11月通過挖礦獲取696個BTC(約264萬美元)。 據悉12月3日挖礦難度再一次做出調整,挖礦難度下降15.13%,創下歷史第二大跌幅。相對

區塊鏈學堂——(一)

10萬+人民幣一枚喲2017,還有三天就要謝幕了,如果要盤點今年最值得投資的標的,恐怕非比特幣莫屬,2017年一整年,比特幣在爭議中不斷螺旋上升,暴漲暴跌,風起雲湧。比特幣就如同高爾基描寫的《海燕》——在烏雲和大海之間,像一道黑色的閃電在高獓的飛翔,一會兒翅膀碰著波浪,一會箭

什麼是和區塊鏈共識機制?

經常有人說比特幣是“挖”出來的,而且需要用“礦機”來挖,那這究竟這是什麼意思呢? 比特幣採用一種稱為“工作量證明(PoW,Proof of Work)”共識機制來判斷誰記賬。 什麼是共識機制呢?區塊鏈技術的核心是由系統中節點競爭進行記賬,這個競爭的評判標準稱之為“共

通過原始碼學習 --

挖礦的過程就是區塊生成的過程 同時也是比特幣“發行”的過程。 1. 礦工節點通過暴力碰撞法找到滿足條件的雜湊值(下文詳述) 即為挖礦成功,從而獲取比特幣獎勵 大約每十分鐘產生一個區塊, 每210000個區塊(大約4年)獎勵比特幣減半 2009.1 – 50

,到底是怎麼一回事回事?

        比特幣是一個分散式的點對點網路系統。因此沒有“中央”伺服器,也沒有中央發行機構。

——錢包

1. BitCoin錢包 BitCoin是錢包的一種,目前它需要下載上百G的資料,且之後還會不斷增加,其它錢包也有資料比較少的,但是做礦池一般用bitcoin,可以把它看成實時更新的礦池資料庫。 如果想做礦池的話,必須把錢包資料下到本地,而且後臺程序要一直開著更新資料。還需要給錢包加密。 2. 安裝配置錢包

我竟然被抓去做了礦工

linux 比特幣引言世界上還是牛人多,在2011年的時候,一名大三的學生有了困擾,隨後上知乎發布了一個提問大三學生手頭有6000元,有什麽好的理財投資建議?在2017年的今天,上到了知乎熱門提問,因為在提問下面有一個獲得上萬點贊的回答買“比特幣,保存好錢包文件,然後忘掉你有過6000元這回事,五年後再看看。