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?
"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.
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).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
Además de la respuesta de Richard, en términos de API, la recompensa por el bloque también se puede obtener del trace_block
mé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 reward
tipo, por ejemplo, si está configurado el contrato de recompensa de bloque .
Un ejemplo de respuesta de trace_block
API.
{
"jsonrpc": "2.0",
"id": 1,
"result": [
...
{
"action": {
"author": "0x646db8ffc21e7ddc2b6327448dd9fa560df41087",
"rewardType": "block",
"value": "0x1bc16d674ec80000"
},
"blockHash": "0xdcd887d9301d279c4754df78c6b69f26d2839b12201b0b337bc2512d015682b5",
"blockNumber": 14621621,
"result": null,
"subtraces": 0,
"traceAddress": [],
"type": "reward"
}]
}
adrianclv
web3.eth.getBlock(<block>).gasUsed
oweb3.eth.getBlock(<block>).cumulativeGasUsed
?Richard Horrocks
.gasUsed
_ Eche un vistazo a los valores devueltos paraeth_getBlockByHash
: verá que.gasUsed
es el total de ese bloque..cumulativeGasUsed
es 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.adrianclv
getBlock()
función congetTransactionReceipt()
por alguna razón. Y para la recompensa de los tíos, ¿entonces sería suficiente para hacernumberOfUncles*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".