Bitcoin-Core

比特幣中的 blkxxxx.dat 文件中的數據是如何實現的

  • April 5, 2019

我正在用 C++ 為比特幣核心編寫區塊鏈解析器,現在我想用原始交易以及前一個和下一個塊雜湊來豐富我讀取的數據。

我使用這個庫將十六進制轉換為雙 sha256,但現在我的問題是將讀取的數據轉換為正確的格式,例如,VarInt 被序列化為相應的十六進制(例如 77 -> 4d)。但是在某些事情上,我沒有發現自己,例如在 uint32 和 int32 類型的整數的轉換中。

我給你舉個例子創世塊的版本號是1序列化到正確的雜湊是01000000

或創世區塊的nonce轉換為2083236893但序列化的正確形式7c2bac1d

同樣對於

NBits = 486604799 ->序列化= 1d00ffff 時間戳= 1231469665 ->序列化= 495fab29

對不起我糟糕的英語,但我正在學習。

______ 解決方案 ______

比特幣核心使用序列化塊的方法,進入文件 blk 並將數據發送到網路,創建雜湊。

然後,雜湊塊將所有數據創建為小端形式。

你在三個方面感到困惑。

首先,你需要注意你的一些數字是十進制的,其他的是十六進制的:77 decimal -> 4d hexadecimal (so: 77 d -> 0x 4d)

其次,您需要注意大多數數字都以小端表示法儲存,因此 0x00000001 -> 0x01000000。他們的討論為什麼使用小端。

第三,您混淆了創世區塊區塊 125552 中的數字:

創世區塊隨機數 2083236893d 轉換為 0x7c2bac1d 作為十六進製而不是0x42a14695。

0x42a14695 是<https://en.bitcoin.it/wiki/Block_hashing_algorithm>中提到的塊 125552 的隨機數,而不是創世塊。

同樣,Nbits 486604799d 用於創世塊,0xf2b9441a 用於塊 125552。時間戳 1231469665d 用於創世塊,0xc7f5d74d 用於塊 125552。

引用自:https://bitcoin.stackexchange.com/questions/85729