So erhalten Sie die Netzwerk-Hash-Rate der Ethereum-Blockchain über die Geth-Konsole oder Web3

Ich möchte wissen, wie ich die Hash-Rate des Ethereum-Blockchain-Netzwerks über die Geth-Konsole oder Web3 abrufen kann.
Wie das Ergebnis dieser API - https://www.etherchain.org/api/miningEstimator

{
 "blocktime":"14.4444282592862345",
 "difficulty":"1846255676466184.9397",
 "hashrate":"137494795284766.6526554599708515"
}

Antworten (2)

Die Art und Weise der Ableitung der Informationen finden Sie hier . Also über die Konsole

function getNetworkStats(
        sampleSize //!< [in] Larger n give more accurate numbers but with longer latency.
    ) {
    blockNum = eth.blockNumber; // Save this value to atomically get a block number.
    blockTime = (eth.getBlock(blockNum).timestamp - eth.getBlock(blockNum - sampleSize).timestamp) / sampleSize;
    difficulty = eth.getBlock(blockNum).difficulty; // You can sum up the last n-blocks and average; this is mathematically sound.

    return {
      "blocktime": blockTime,
      "difficulty": difficulty,
      "hashrate": difficulty / blockTime,
    };
}

Die Werte sind jeweils in Sekunden, Hashes und Hashes pro Sekunde.

Ich habe die obige Methode mit Python implementiert, und es fühlt sich ungefähr genauso an wie die Rechenleistung der gesamten Netzwerk-Hashrate!

eth = create_rpc("ETH")
current_height = int(eth.eth_blockNumber(), 16)
sampleSize = 200
current_block = eth.eth_getBlockByNumber(hex(current_height), False)
pre_height = eth.eth_getBlockByNumber(hex(current_height - sampleSize), False)
current_height_time = int(current_block.get("timestamp"), 16)
pre_height_time = int(pre_height.get("timestamp"), 16)

avg_block_time = (current_height_time - pre_height_time) / sampleSize
print(int(current_block.get("difficulty"), 16) / avg_block_time / 1000000000000)


result: 
177.7550919625694