Wie kann ich die Höhe der Mining-Belohnung von einem bestimmten Block abfragen?

Ich möchte ein Skript schreiben, um Mining-Belohnungen zu analysieren. Was ist der beste Weg, um die Menge der Mining-Belohnungen eines bestimmten Blocks abzufragen? Es scheint möglich, die Adresse des glücklichen Bergmanns abzufragen:

web3.eth.getBlock(200).miner
"0xbb7b8287f3f0a933474a79eae42cbca977791171"

Dann kann ich irgendwie in das Konto eintauchen und die Transaktion in einem bestimmten Block auswählen. Ist dies der beste Weg? Oder kennen Sie Abkürzungen? Und wie geht das?

Antworten (2)

"Dann kann ich irgendwie in das Konto eintauchen und die Transaktion in einem bestimmten Block auswählen."

Mining-Belohnungen sind keine Transaktionen, daher können Sie sie nicht auf die übliche Weise abfragen. Gemäß dieser vorherigen Antwort:

Es gibt keine Inputs und Outputs in Ethereum, nur Zustandsänderungen und Salden. Daher haben Mining-Belohnungen keinen Transaktionshash, da es sich nicht um eine Transaktion handelt.

Sie müssen die Belohnung entweder selbst berechnen oder die API eines anderen verwenden.

Prämie selbst berechnen

Der Algorithmus zur Berechnung der Belohnung – wie auf der Mining-Wiki-Seite angegeben – lautet wie folgt:

Der erfolgreiche PoW-Miner des Gewinnerblocks erhält:

  • Eine statische Blockbelohnung für den „gewinnenden“ Block, bestehend aus genau 5,0 Ether
  • Das gesamte Gas, das innerhalb des Blocks ausgegeben wird, d. h. das gesamte Gas, das durch die Ausführung aller Transaktionen in dem vom gewinnenden Miner eingereichten Block verbraucht wird, wird von den Absendern kompensiert. Die anfallenden Gaskosten werden im Rahmen des Konsensprotokolls dem Minerkonto gutgeschrieben. Es wird erwartet, dass diese im Laufe der Zeit die statische Blockbelohnung in den Schatten stellen werden.
  • Eine zusätzliche Belohnung für die Aufnahme von Onkeln als Teil des Blocks in Form von 1/32 extra pro Onkel

Die für den zweiten und dritten Teil benötigten Daten können aus dem Baustein abgefragt werden mit:

  • web3.eth.getBlock(<block>).gasUsed
  • web3.eth.getBlock(<block>).uncles(Hinweis: Die Belohnung pro Onkel beträgt /32 der statischen Belohnung, dh 5 / 32.)

Verwenden der API einer anderen Person

Etherscan ist einer der Block-Explorer, der Details zur Belohnung für einen bestimmten Block enthält (siehe hier für ein Beispiel). Einzelheiten zu ihren APIs finden Sie entweder auf ihrer Website oder, für Python-Bindungen, auf dieser GitHub-Seite. (Ich habe nicht überprüft, ob diese die Belohnungsdetails zurückgeben, also YMMV.)

BEARBEITEN : Die statische Belohnung beträgt jetzt 3,0 Ether

Es wäre web3.eth.getBlock(<block>).gasUsedoder web3.eth.getBlock(<block>).cumulativeGasUsed?
Nur .gasUsed. Schauen Sie sich die Rückgabewerte für an eth_getBlockByHash- Sie werden sehen, dass .gasUseddies die Summe für diesen Block ist. .cumulativeGasUsedDies ist der Fall, wenn Sie eine der Transaktions-APIs (keine APIs auf Blockebene) verwenden und die Gesamtsumme für den Block abrufen möchten, in dem sich die Transaktion befindet.
Danke, du hast recht. Ich habe die getBlock()Funktion getTransactionReceipt()aus irgendeinem Grund mit gemischt. Und für die Belohnung von Onkeln wäre es dann genug zu tun numberOfUncles*5/32? Auf der Wiki-Seite heißt es auch: „Onkel, die in einem Block enthalten sind, der vom erfolgreichen PoW-Miner gebildet wurde, erhalten 7/8 der statischen Blockbelohnung = 4,375 Ether. Pro Block sind maximal 2 Onkel erlaubt.“

Zusätzlich zu Richards Antwort kann in Bezug auf die API die Belohnung für den Block auch von der trace_blockJSON-RPC-API-Methode direkt vom OpenEthereum/NethmindETH/Erigon-RPC-Knoten abgerufen werden, wenn eine solche API aktiviert ist.

Es sollte im "result[i]" => "action" => "value"i - Element der Antwort enthalten sein, die "type": "reward". Es sollte beachtet werden, dass es mehrere Elemente mit rewardTyp geben kann, beispielsweise wenn der Block-Belohnungsvertrag konfiguriert ist.

Ein Beispiel für eine Antwort von der trace_blockAPI.

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": [
        ...
        {
        "action": {
            "author": "0x646db8ffc21e7ddc2b6327448dd9fa560df41087",
            "rewardType": "block",
            "value": "0x1bc16d674ec80000"
        },
        "blockHash": "0xdcd887d9301d279c4754df78c6b69f26d2839b12201b0b337bc2512d015682b5",
        "blockNumber": 14621621,
        "result": null,
        "subtraces": 0,
        "traceAddress": [],
        "type": "reward"
    }]
}