¿Cómo consultar la cantidad de recompensa minera de un determinado bloque?

Quiero escribir un script para analizar las recompensas mineras. ¿Cuál es la mejor manera de consultar la cantidad de recompensas mineras de un determinado bloque? Parece posible consultar la dirección del afortunado minero:

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

Luego, de alguna manera puedo profundizar en la cuenta y seleccionar la transacción en cierto bloque. Es esta la mejor manera? ¿O conoces atajos? ¿Y, cómo hacerlo?

Respuestas (2)

"Entonces, de alguna manera, puedo profundizar en la cuenta y seleccionar la transacción en cierto bloque".

Las recompensas mineras no son transacciones, por lo que no puede consultarlas de la forma habitual. Según esta respuesta anterior:

No hay entradas y salidas en Ethereum, solo cambios de estado y saldos. Por lo tanto, las recompensas mineras no tienen un hash de transacción ya que no son una transacción.

Deberá calcular la recompensa usted mismo o usar la API de otra persona.

Calculando la recompensa usted mismo

El algoritmo para calcular la recompensa, como se indica en la página wiki de minería , es el siguiente:

El minero PoW exitoso del bloque ganador recibe:

  • Una recompensa de bloque estático para el bloque 'ganador', que consiste en exactamente 5.0 Ether
  • Todo el gas gastado dentro del bloque, es decir, todo el gas consumido por la ejecución de todas las transacciones en el bloque presentado por el minero ganador es compensado por los remitentes. El costo del gas incurrido se acredita a la cuenta del minero como parte del protocolo de consenso. Con el tiempo, se espera que estos empequeñezcan la recompensa del bloque estático.
  • Una recompensa extra por incluir Tíos como parte del bloque, en forma de 1/32 extra por Tío incluido

Los datos necesarios para la segunda y tercera parte se pueden consultar desde el bloque mediante:

  • web3.eth.getBlock(<block>).gasUsed
  • web3.eth.getBlock(<block>).uncles(Nota: la recompensa por tío es /32 de la recompensa estática, es decir, 5/32).

Usar la API de otra persona

Etherscan es uno de los exploradores de bloques que incluye detalles de la recompensa por un bloque determinado (ver aquí un ejemplo). Los detalles de sus API se pueden encontrar en su sitio o, para los enlaces de Python, en esta página de GitHub. (No he comprobado que devuelvan los detalles de la recompensa, así que YMMV).

EDITAR : la recompensa estática ahora es 3.0 Ether

seria web3.eth.getBlock(<block>).gasUsedo web3.eth.getBlock(<block>).cumulativeGasUsed?
solo .gasUsed_ Eche un vistazo a los valores devueltos para eth_getBlockByHash: verá que .gasUsedes el total de ese bloque. .cumulativeGasUsedes cuando usa una de las API de transacción (no API de nivel de bloque) y desea el total para el bloque en el que reside la transacción.
Gracias, tienes razón. Estaba mezclando la getBlock()función con getTransactionReceipt()por alguna razón. Y para la recompensa de los tíos, ¿entonces sería suficiente para hacer numberOfUncles*5/32? Al leer la página wiki, también dice: "Los tíos incluidos en un bloque formado por el minero PoW exitoso reciben 7/8 de la recompensa del bloque estático = 4.375 ether Se permite un máximo de 2 tíos por bloque".

Además de la respuesta de Richard, en términos de API, la recompensa por el bloque también se puede obtener del trace_blockmétodo JSON RPC API directamente desde el nodo OpenEthereum/NethmindETH/Erigon RPC, si dicha API está habilitada.

Debe estar en "result[i]" => "action" => "value"el elemento i de la respuesta que tiene "type": "reward". Cabe señalar que podría haber varios elementos con rewardtipo, por ejemplo, si está configurado el contrato de recompensa de bloque .

Un ejemplo de respuesta de 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"
    }]
}