最初的難度係數究竟是如何確定的?
**我假設難度的“目標”為 10 分鐘,因為 satoshi 選擇的係數會乘以一個變數,以幫助網路保持成比例。**IE,如果網路雜湊率是之前網路雜湊率的 2 倍,
bnProofOfWorkLimit
則乘以之前的難度,也乘以 2,這是衡量網路產生雜湊的速度有多快。這很容易理解。但是,我一直想知道最初的難度是如何選擇的,所以目標是 10 分鐘。
- 它是基於計算的一些硬物理限制嗎?
我在
chainparams.h
網上遇到過這段程式碼113
:bnProofOfWorkLimit = CBigNum(~uint256(0) >> 32);
~uint256(0)
在 C++中是什麼意思?我知道這~uint256(0) >> 32
意味著1 / 2^24
用人類可讀的術語。- 為什麼使用
~uint256(0)
函式而不是簡單的256
?- 為什麼選擇將其表示為
256 >> 32
而不是1 >> 24
?這有充分的理由嗎?任何了解這方面的更多資訊的方向也將不勝感激。
注意:我不是在問為什麼選擇的時間量等於 10 分鐘,我是在問這個數字
1 / 2^24
是如何得出的,以計算 sha256 摘要需要多長時間來估計 10 分鐘。
我不確定是不是。當網路開始執行時(Satoshi 幾乎是唯一的一個挖礦),並不是每 10 分鐘就發現一個區塊。例如,前 2016 個區塊是在 24 天而不是 2 週內發現的。通常這會導致目標上升,但它不能超過硬編碼的最大目標,所以只有在 2009 年 12 月 30 日的塊32256中,我們才開始看到重新定位機制啟動,並且每 10 分鐘到達一次塊。
然而,看到它確實出現了接近 10 分鐘,Satoshi 可能算出了他自己機器的雜湊率,並選擇了一個接近於在他的硬體上每 10 分鐘找到一個塊所需的整數的參數。
我認為您沒有正確理解這行程式碼。雜湊值表示為 256 位無符號整數。uint256(0) 給出此數據類型中 0 的表示。~ 是邏輯非且 ~uint256(0) 反轉所有位,給出可能的最高整數 2^256-1。右移 32 位得到 2^224-1,因此每個散列有 1/2^32 的機會低於最大目標。
然後將該值轉換為更緊湊的“位”形式,這也導致它被舍入為 (2^16-1)*2^208。
執行 256>>32 或 1>>24 會導致 0 因為整數類型不能容納分數。
第一個困難只是硬編碼的最小值 1。這與最初的十分鐘不對應,實際上對於網路雜湊能力來說太高了。近一年後的 2009 年 12 月 30 日,難度首次增加。
有關難度調整的概述,您可以參考下表:比特幣難度調整