如何計算版本(例如在 Python 中)?
我正在閱讀這篇描述塊的所有標頭欄位的中型文章。版本欄位的解釋對我來說有點不清楚。
對於初學者,我試圖考慮版本 = 1,就像在鏈的最開始:
version_int = 1 version_hex = hex(version_int) # from my understanding I need to add value 0x100000000 to the version # though I do not understand why, currently I'm just taking this as a given fact version_hex_min = hex(int(0x100000000) + version_int)[-8:] # of course I need the little endian notation: version_hex_min_le = binascii.hexlify(binascii.unhexlify(version_hex)[::-1])
這給了我基於小端的十六進制值:
0x01000000
我顯然可以用它來計算版本 1 的標頭雜湊。
當我檢查最新的塊頭時,我看到了這樣的版本:
0x20002000
這將導致大端十六進製表示:
0x00200020
並轉換為十進制整數:
2097184
該數字如何指代實際和目前版本,我如何提取礦工用於此所謂的“公開 ASIC 提升”的額外資訊?
雖然@Davidson Souza 的回答將我引向了正確的方向,但他可能不小心證實了一個錯誤的假設。我仍然發現很難將其應用到現實中。所以我想回答我的問題,認為這更具描述性:
首先,您應該開始將版本欄位視為 32 位整數。協議說,最後(最左邊的)4 位必須是
0010
. 所以版本欄位至少應該是這樣的:現在,礦工可以通過翻轉特定位來表示準備好接受軟分叉提議。該協議允許使用第一個(最右邊的)13 位。例如,有一個軟分叉 BIPn0 表示,第一個(0 -> 二進制中的第一個是最正確的,記得嗎?;))可以翻轉以顯示準備就緒。實際上看起來像這樣:
這很聰明。為什麼?礦工可以單獨發出信號准備獨立的軟分叉提議。圖片有 12 個軟分叉,但礦工只支持其中的 4 個 - 我只是在這裡隨機挑選 - 這就是它的樣子:
最終,這留下了 16 位開放。這是礦工可以用作額外搜尋空間的空間,以在目標下方查找標頭雜湊。所以這會給你 2^16 個額外的值(不是我假設的 2^24):
BIP-034 定義了塊版本 2,因此塊應該具有大於或等於 2 的版本,因為它是小端序,我們期望類似
0x02000000
. 但是,礦工可以幾乎沒有限制地更改以下值,因此他們可以將其用作新隨機數週期的熵源,而無需重新計算 Merkle 根。理想情況下,除了0x02
ASIC-BOOST 或任何版本位的瘋狂變化之外的一切。此外,一些軟分叉方法如 BIP-008 和 BIP-009 使用版本作為位欄位。Taproot 使用該位2
,因此每個 Taproot 信號塊都以0x04
.