Mining-Theory

如何計算版本(例如在 Python 中)?

  • March 17, 2022

我正在閱讀這篇描述塊的所有標頭欄位的中型文章。版本欄位的解釋對我來說有點不清楚。

對於初學者,我試圖考慮版本 = 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 根。理想情況下,除了0x02ASIC-BOOST 或任何版本位的瘋狂變化之外的一切。此外,一些軟分叉方法如 BIP-008 和 BIP-009 使用版本作為位欄位。Taproot 使用該位2,因此每個 Taproot 信號塊都以0x04.

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