簡單回顧下挖礦的流程。
首先先要對所有的交易做驗證,剔除有問題的,然後通過壹套自定義的標準來選擇哪些交易希望打包進區塊,比如說提供的交易費與交易占用的字節大小的比值超過某個門檻,這樣的交易才被認為有利可圖。當然,節點也可以特意選擇要加入某條交易,或者故意忽略某些交易。如果是通過礦池挖礦的話,礦池的服務器會去篩選交易,然後分配給每個參與的礦機壹個獨立的任務。
壹旦篩選好交易數據,層層約減,通過這些交易就可以計算出壹棵Merkle樹,可以確定壹個唯壹的摘要,這就是Merkl樹的根。
然後我們再依次獲取挖礦需要的其他信息,這些信息組成壹個區塊的頭。
區塊頭的字節分配
區塊頭只有80個字節,挖礦只需要對區塊頭進行運算即可。交易數據都通過merkle樹固定了下來,不需要再包含進來。
這些信息中大部分已經是固定下來的,或者是可計算的。
我們以區塊277316為例,其信息來自網站 http://blockchain.info
Bitcoin Block #277316blockchain.info
選擇這個區塊的原因是在《Mastering Bitcoin》壹書中,中文社區譯本和英文原版在介紹這部分內容時有出入,而且作者Antonopoulos並沒有提到壹個關鍵點,就是字節順序的問題,相信很多人可能會踩這個坑。這裏還原的細節可以幫助讀者與書籍做相互參考。
請大家註意下面的每個步驟,註意每壹個變化,這是比特幣最核心的算法。
轉換時間,記住,壹定要轉為utc的時間戳,此處遇到過坑,小心。
這壹步的發現異常艱辛,耗費了大量的查詢,大坑,大坑,謹記。發明人中本聰可能為了讓機器計算更快,而變為了更接近機器的編碼方式little-endian.
最終得到的結果就是
16進制下前面15個0,然後是1; 而難度目標對應的數字是
16進制下前面15個0,然後是3. 計算結果小於難度目標,符合要求。這個結果與網站上公布的數字壹致。
在挖礦時,nonce隨機數是未知的,要從0試到2^32,但是這個數字其實不大,只有4294967296,以現在的礦機動輒14T每秒的算力,全部算完到上限也不需要壹秒。剛才提到在這種情況下,需要使用創幣交易中的附帶信息,額外的字符串成為extra nonce。
另外,創世區塊也可以通過上面的方法來驗證,有好奇的朋友可以嘗試下。
提示: