计算比特币挖矿难度

Calculating Bitcoin mining difficulty

我正在做一个项目,需要我获得比特币的实时挖掘难度。 所以我在这个页面上读到解释了如何从一个块的散列中获取挖掘难度: https://en.bitcoin.it/wiki/Difficulty

所以我制作了这个 python 脚本,它在两个日期之间从区块链 api 收集所有哈希值。(https://www.blockchain.com/api) 并根据哈希值计算挖掘难度。

但是当我绘制结果时,我发现与我在网上看到的所有其他挖矿难度完全不同。正如你在这里看到的那样,挖矿难度真的很混乱:

x=时间,y=难度

这是我对难度应用 np.log 时的情况: x= 时间 , y = np.log(难度)

如你所见,结果真的很乱。 所以我想知道是否有一位加密专家能够告诉我我的公式代码有什么问题(或者也许我是对的):)

这是我的代码:

import requests, json
from datetime import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

start = "2021-01-01"#The script start to collect hashes from this date
end= "2021-12-01"#And end at this one

timestamp_start = datetime.strptime(start, "%Y-%m-%d").timestamp()
timestamp_end = datetime.strptime(end, "%Y-%m-%d").timestamp()
new_start = timestamp_start

datas = pd.DataFrame([], columns = ["time", "difficulty"])

dec_max_diff = int("00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 16)#maximum target that is used to calculate mining difficulty

while True:

    if new_start > timestamp_end:
        break

    
    url = f"https://blockchain.info/blocks/{int(new_start*1000)}?format=json"
    response = requests.get(url)#Make a request to the API
    list_block_adress = json.loads(response.text)#Get a json containing the hash and a timestamp
    

    for block_adress in list_block_adress:

        dec_hash = int(block_adress["hash"], 16)

        difficulty = dec_max_diff / dec_hash #Formula to calculate mining difficulty

        data = pd.DataFrame([[block_adress["time"], difficulty]], columns = ["time", "difficulty"])

        datas = pd.concat([datas, data])

    new_start += 60*60*24 #For the loop to continue


#Sorting and cleaning up the datas
datas.sort_values(by='time', inplace= True)
datas.drop_duplicates(subset='time', keep="first")

#Ploting the datas
times = pd.to_datetime(datas["time"], unit= "ms").to_numpy()
difficulties= datas["difficulty"].apply(lambda x: np.log(x)).to_numpy()
plt.plot(times, difficulties)
plt.show()

由于哈希实际上是随机的,每个位都是独立的,因此除了 n 工作证明所需的 0 之外,还有一些 以下位也是0。 (即使当时 n 更高,这些散列也是有效的,但这无关紧要。)这里的“动态范围”,相对于噪声的底限可能是作为所需的难度,似乎涵盖了大约 e10=22000,这很容易适合开采的块数。

(实际的 n 不是整数,因为目标不是 2 的幂,但这给出了正确的想法。)

我不是加密专家,但难度是使用区块头中的 bits 字段计算的,而不是区块地址哈希。所以你必须得到块头查询https://blockchain.info/rawblock/<block_hash>(见https://www.blockchain.com/api/blockchain_api),解包bits的内容并计算current_target和当前难度

块难度仅在具有 height // 2016 == 0 的块处重新计算。 因此不需要查询两个日期之间生成的每个块,而只需查询每个 2016th + 2.

此外,请注意 list_block_adress 包含 time 降序 顺序。