如何計算給定範圍內難度變化的區塊的網路雜湊率?
不確定標題是否措辭不當,但這就是我想要做的。
如果我有一系列塊並且我想計算雜湊率,我可以做一些類似於在這裡找到的事情。
為了更進一步,我希望能夠從目前塊計算給定數量的塊的雜湊率。使用上面提供的範例,這是相當微不足道的。
但是,當難度在塊範圍內的某個地方發生變化時,我會遇到問題。
以昨晚為例。難度更改為大約〜390M。在此之前,它大約是~267M。
對於難度在該範圍內發生變化的給定範圍,我將如何計算平均網路雜湊率?
感謝您的幫助!
首先計算總工作量。工作被定義為特定塊所需的預期雜湊數。如果一個塊的目標是
Target
,那麼它的工作量是(根據雜湊值低於或等於Work = 2**256 / (Target + 1)
的事實)。由於難度被定義為,因此它遵循。Target + 1``2**256``Target``Diff``MaxTarget / Target``MaxTarget = 65535 * 2**208``Work = Diff * 2**48 / 65535 = Diff * 4295032833
因此,對於每個塊,查看其難度併計算
Diff * 4295032833
. 計算時間範圍內所有塊的所有這些值的總和。現在將該總和除以您的間隔持續的秒數。結果是您在該時間間隔內每秒的平均雜湊數。
對於非常短的時間間隔(少於幾個小時),塊時間戳不准確可能是相關的。避免這個問題的一種方法是不從一系列塊開始,而是從一系列時間戳開始,然後選擇該範圍內的所有塊,而不是從範圍塊中估計時間範圍。
您可以查看範圍的第一個和最後一個塊,如果它們完全匹配,您可以根據經過的時間、高度差(塊數)和難度計算平均雜湊率。
如果它們不匹配,您將必須在每個難度部分創建加權平均值。您計算每個部分的平均雜湊率,然後將其乘以持續時間,將所有結果相加,然後除以總時間。
您可以通過二進制搜尋在您的範圍的第一個塊和最後一個塊之間找到這些部分,但是只查看每個 2016 塊會更容易,因為重置會按計劃進行。;)
更好的是,通過查看第一個和最後一個塊的高度,您實際上可以立即知道在您的範圍記憶體在多少難度變化。
更新:
正如 Pieter 所指出的,區塊的時間戳可能不一致,這使得區塊的時間戳可能低於其前身。任何實現都應該檢查諸如此類的極端情況。一般來說,如果考慮更大的間隔,結果會更好,除非間隔太大以至於散列能力在其中顯著增加。