比特幣挖礦究竟在計(jì)算一個(gè)什么問(wèn)題剑梳?手動(dòng)驗(yàn)證區(qū)塊鏈給出答案

簡(jiǎn)單回顧下挖礦的流程捺球。

首先先要對(duì)所有的交易做驗(yàn)證,剔除有問(wèn)題的班巩,然后通過(guò)一套自定義的標(biāo)準(zhǔn)來(lái)選擇哪些交易希望打包進(jìn)區(qū)塊渣慕,比如說(shuō)提供的交易費(fèi)與交易占用的字節(jié)大小的比值超過(guò)某個(gè)門(mén)檻,這樣的交易才被認(rèn)為有利可圖抱慌。當(dāng)然逊桦,節(jié)點(diǎn)也可以特意選擇要加入某條交易,或者故意忽略某些交易抑进。如果是通過(guò)礦池挖礦的話(huà)强经,礦池的服務(wù)器會(huì)去篩選交易,然后分配給每個(gè)參與的礦機(jī)一個(gè)獨(dú)立的任務(wù)寺渗。

一旦篩選好交易數(shù)據(jù)匿情,層層約減,通過(guò)這些交易就可以計(jì)算出一棵Merkle樹(shù)信殊,可以確定一個(gè)唯一的摘要炬称,這就是Merkl樹(shù)的根。

然后我們?cè)僖来潍@取挖礦需要的其他信息涡拘,這些信息組成一個(gè)區(qū)塊的頭玲躯。

區(qū)塊頭的字節(jié)分配

  • version 版本號(hào),4個(gè)字節(jié)
  • previous_block_hash 前一區(qū)塊的摘要,32個(gè)字節(jié)
  • merkle_root 默克爾樹(shù)的根跷车,32個(gè)字節(jié)
  • time 區(qū)塊生成時(shí)間棘利,4個(gè)字節(jié)
  • bits 難度目標(biāo),是一個(gè)數(shù)字朽缴,4個(gè)字節(jié)
  • nonce 隨機(jī)數(shù)善玫,4個(gè)字節(jié)

區(qū)塊頭只有80個(gè)字節(jié),挖礦只需要對(duì)區(qū)塊頭進(jìn)行運(yùn)算即可不铆。交易數(shù)據(jù)都通過(guò)merkle樹(shù)固定了下來(lái)蝌焚,不需要再包含進(jìn)來(lái)。

比特幣區(qū)塊鏈?zhǔn)疽鈭D

這些信息中大部分已經(jīng)是固定下來(lái)的誓斥,或者是可計(jì)算的。

  • 版本號(hào)是跟隨比特幣客戶(hù)端而定的许帐,一段時(shí)間內(nèi)不會(huì)改變劳坑。即使要改變,也會(huì)有比特幣的核心開(kāi)發(fā)人員來(lái)協(xié)調(diào)升級(jí)策略成畦,這個(gè)可以理解為一個(gè)靜態(tài)常數(shù)距芬。
  • 前一區(qū)塊的摘要,可以通過(guò)數(shù)學(xué)方法快速計(jì)算循帐,因?yàn)榍耙粎^(qū)塊早已打包好了框仔。
  • 默克爾樹(shù)的根,剛才已經(jīng)得到了結(jié)果拄养。
  • 時(shí)間离斩,可以取打包時(shí)的時(shí)間,也不需要很精確瘪匿,前后幾秒跛梗,幾十秒也都可以。
  • 難度目標(biāo)棋弥,是參考上兩周產(chǎn)生的區(qū)塊的平均生成時(shí)間而定的核偿,兩周內(nèi)如果平均10分鐘產(chǎn)生一個(gè)區(qū)塊的話(huà),兩周會(huì)產(chǎn)生2016個(gè)區(qū)塊顽染,軟件會(huì)計(jì)算最新的2016個(gè)區(qū)塊生成的時(shí)間漾岳,然后做對(duì)比,隨之調(diào)整難度粉寞,使得接下來(lái)產(chǎn)生的區(qū)塊的預(yù)期時(shí)間保持在10分鐘左右尼荆。因?yàn)樽罱?016個(gè)區(qū)塊已經(jīng)確定,所以這個(gè)數(shù)字也是確定的仁锯。
  • 最后一個(gè)隨機(jī)數(shù)耀找,就是挖礦的目標(biāo)了。這個(gè)數(shù)字可以變化,而且要從0試到最大值野芒。直到最后出現(xiàn)的hash結(jié)果蓄愁,其數(shù)字必須低于難度目標(biāo)值。不過(guò)以現(xiàn)在的計(jì)算機(jī)算力狞悲,這個(gè)數(shù)字用不了一秒就把全部的變化可能計(jì)算完了撮抓,所以還需要改變區(qū)塊內(nèi)部的創(chuàng)幣交易中的附帶消息,這樣就讓merkle root也發(fā)生了變化摇锋,從而有更多的可能去找到符合要求的nonce丹拯。

我們以區(qū)塊277316為例,其信息來(lái)自網(wǎng)站http://blockchain.info

Bitcoin Block #277316blockchain.info

選擇這個(gè)區(qū)塊的原因是在《Mastering Bitcoin》一書(shū)中荸恕,中文社區(qū)譯本和英文原版在介紹這部分內(nèi)容時(shí)有出入乖酬,而且作者Antonopoulos并沒(méi)有提到一個(gè)關(guān)鍵點(diǎn),就是字節(jié)順序的問(wèn)題融求,相信很多人可能會(huì)踩這個(gè)坑咬像。這里還原的細(xì)節(jié)可以幫助讀者與書(shū)籍做相互參考。

比特幣區(qū)塊277316的信息
比特幣區(qū)塊277316的hash值

請(qǐng)大家注意下面的每個(gè)步驟生宛,注意每一個(gè)變化县昂,這是比特幣最核心的算法。


第一步陷舅,準(zhǔn)備數(shù)據(jù)倒彰,轉(zhuǎn)換時(shí)間

2 (版本號(hào)的十進(jìn)制)
0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569 (前一區(qū)塊hash值的16進(jìn)制)
c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e  (merkle root的16進(jìn)制)
2013-12-27 23:11:54 (utc時(shí)間)
419668748  (難度目標(biāo)的十進(jìn)制)
924591752  (隨機(jī)數(shù)的十進(jìn)制)

轉(zhuǎn)換時(shí)間,記住莱睁,一定要轉(zhuǎn)為utc的時(shí)間戳待讳,此處遇到過(guò)坑,小心缩赛。

>>> import datetime
>>> from datetime import timezone
>>> datetime.datetime.strptime('2013-12-27 23:11:54', '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone.utc).timestamp()
1388185914.0

第二步耙箍,全部轉(zhuǎn)換為16進(jìn)制

00000002
0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569
c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e
52be093a
1903a30c
371c2688

第三步,從big-endian轉(zhuǎn)化為little-endian

這一步的發(fā)現(xiàn)異常艱辛酥馍,耗費(fèi)了大量的查詢(xún)辩昆,大坑,大坑旨袒,謹(jǐn)記汁针。發(fā)明人中本聰可能為了讓機(jī)器計(jì)算更快,而變?yōu)榱烁咏鼨C(jī)器的編碼方式little-endian.

02000000
69054f28012b4474caa9e821102655cc74037c415ad2bba70200000000000000
2ecfc74ceb512c5055bcff7e57735f7323c32f8bbb48f5e96307e5268c001cc9
3a09be52
0ca30319
88261c37

第四步砚尽,拼接字符串施无,開(kāi)始驗(yàn)證

import binascii
from hashlib import sha256 as s
k = '0200000069054f28012b4474caa9e821102655cc74037c415ad2bba702000000000000002ecfc74ceb512c5055bcff7e57735f7323c32f8bbb48f5e96307e5268c001cc93a09be520ca3031988261c37'
hk = binascii.unhexlify(k)
res = binascii.hexlify(s(s(hk).digest()).digest()[::-1])

最終得到的結(jié)果就是

0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4

16進(jìn)制下前面15個(gè)0,然后是1必孤; 而難度目標(biāo)對(duì)應(yīng)的數(shù)字是

0000000000000003a30c00000000000000000000000000000000000000000000

16進(jìn)制下前面15個(gè)0猾骡,然后是3. 計(jì)算結(jié)果小于難度目標(biāo)瑞躺,符合要求。這個(gè)結(jié)果與網(wǎng)站上公布的數(shù)字一致兴想。

正確的hash值

在挖礦時(shí)幢哨,nonce隨機(jī)數(shù)是未知的,要從0試到2^32嫂便,但是這個(gè)數(shù)字其實(shí)不大捞镰,只有4294967296,以現(xiàn)在的礦機(jī)動(dòng)輒14T每秒的算力毙替,全部算完到上限也不需要一秒岸售。剛才提到在這種情況下,需要使用創(chuàng)幣交易中的附帶信息厂画,額外的字符串成為extra nonce凸丸。

另外,創(chuàng)世區(qū)塊也可以通過(guò)上面的方法來(lái)驗(yàn)證袱院,有好奇的朋友可以嘗試下甲雅。

提示:

  • 對(duì)于創(chuàng)始區(qū)塊,版本號(hào)是1坑填;
  • 前一區(qū)塊的hash摘要,猜想會(huì)是什么呢弛姜?
  • 難度目標(biāo)是1脐瑰,這是定義為一個(gè)sha256結(jié)果的前32位是0,也就是對(duì)應(yīng)的16進(jìn)制字符串要有8個(gè)0廷臼,那么難度bits此時(shí)是0x1d00ffff苍在。
  • 然后再用上面的問(wèn)題的解法去求解隨機(jī)數(shù)就可以了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荠商,一起剝皮案震驚了整個(gè)濱河市寂恬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莱没,老刑警劉巖初肉,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饰躲,居然都是意外死亡牙咏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)嘹裂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妄壶,“玉大人,你說(shuō)我怎么就攤上這事寄狼《〖模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)伊磺。 經(jīng)常有香客問(wèn)我盛正,道長(zhǎng),這世上最難降的妖魔是什么奢浑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任蛮艰,我火速辦了婚禮,結(jié)果婚禮上雀彼,老公的妹妹穿的比我還像新娘壤蚜。我一直安慰自己,他們只是感情好徊哑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布袜刷。 她就那樣靜靜地躺著,像睡著了一般莺丑。 火紅的嫁衣襯著肌膚如雪著蟹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天梢莽,我揣著相機(jī)與錄音萧豆,去河邊找鬼。 笑死昏名,一個(gè)胖子當(dāng)著我的面吹牛涮雷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轻局,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洪鸭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仑扑?” 一聲冷哼從身側(cè)響起览爵,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镇饮,沒(méi)想到半個(gè)月后蜓竹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盒让,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年梅肤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑茄。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姨蝴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肺缕,到底是詐尸還是另有隱情左医,我是刑警寧澤授帕,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站浮梢,受9級(jí)特大地震影響跛十,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秕硝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一芥映、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧远豺,春花似錦奈偏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至棺滞,卻和暖如春裁蚁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背继准。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工枉证, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人移必。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓刽严,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親避凝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一眨补、快速術(shù)語(yǔ)檢索 比特幣地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如閱讀 15,973評(píng)論 4 87
  • 以下為金馬老師《精通比特幣》解讀的文稿整理管削。 第一章 介紹 1.1 什么是比特幣 (1)比特幣是一個(gè)區(qū)塊鏈實(shí)現(xiàn) (...
    夢(mèng)之郎閱讀 13,257評(píng)論 6 61
  • 早上在家休息了一早上,好好的睡了一覺(jué)撑螺,下午去和海爾的兄弟們一起運(yùn)動(dòng)含思,還是很好的,以后這樣的活動(dòng)可以多組織一下甘晤,身體...
    李代唐閱讀 113評(píng)論 0 0
  • 夏天就快要過(guò)去了 秋天一到 冬天也會(huì)隨著而來(lái) 發(fā)現(xiàn)時(shí)間真的過(guò)得太快 來(lái)不及好好欣賞 來(lái)不及慢慢品味 過(guò)不去的過(guò)去...
    Butterfly7閱讀 117評(píng)論 0 0
  • 我一向都性子急含潘,什么都要快,但又什么都想要线婚,看書(shū)恨不得一天就能看完還能干別的事遏弱,工作第一天就有客戶(hù)還能做好其他項(xiàng)目...
    追夢(mèng)哥哥閱讀 198評(píng)論 0 0