用Python模擬Bitcoin挖礦算法

最近因為課堂上的要求,研究了有關Bitcoin挖礦的模擬,想與大家分享心得。在過程中遇到了一些問題,像是格式不符合規需要進行轉換成真實計算SHA256的Hash Value所需要用到的格式,並進一步將所有需要的資料整合進去形成Block header。

一般的Block header通常包含了Version, Previous block, Merkle root, Time stamp, Threshold 以及Nonce。將Block header進行兩次的SHA256計算後得到的Hash value,再與Threshold value 去進行比較。

其中在形成Block header的過程中,我們需要將資料調整成可以匯入Hash function進行計算的格式。像是Version的部分,我們看到的樣子會是”0x20c00004”,我們會把前面的0x給拿掉,那僅代表他後面的字串是16進位制;Time Stamp我們需要把格式改成讓電腦了解的4 bytes 16進位數;而Threshold 的部分,一般來說得到的可能是256 bits的數字,而為了合規,我們也需要把格式改成讓電腦了解的4 bytes 16進位數。而Previous block和Merkle root,通常就是256 bits的數字,不太需要改。至於Threshold value的部分,大部分我們看到的資訊會是256 bits的數字,不過最大的問題在於表訂上我們需要使用4 bytes 類科學記號(16進位制)的方式來表示,因此我們需要多一個步驟去進行轉換。

最後,我們整個Block header會是Version (4 Bytes), Previous block (32 Bytes), Merkle root (32 Bytes), Time stamp (4 Bytes), Threshold (4 Bytes)和Nonce (4 Bytes),總共是80 Bytes的資料。

接下來就可以用Block header 去進行Hash value的計算了。但實際上在計算前,還需要進行Endian的動作,由於涉略不深大致上講個概念,在真實世界Bitcoin Systems裡,帶入Hash function前會將字串進行Endian,像是"12345678" → “78563412”,兩兩唯一組的前後顛倒調換。經過Endian-adjusted之後的Block header 就可以帶入Hash function去進行計算,求得我們要的Block ID了。
基本上透過這次的專案學習,以及參考了一些學術網站後,對於在Bitcoin systems裡面計算Block ID的方法有了進一步的了解,分享給大家也歡迎大家多多指教,小弟的觀念與方法不一定完全正確,有錯誤還請見諒並留言告訴我,謝謝!

參考資料:
Block hashing algorithm - Bitcoin Wiki
Difficulty - Bitcoin Wiki

*附上小弟我的Python Code Example: