Encontré este repositorio, que recupera los precios recientes de la gasolina usando web3:
https://github.com/ethgasstation/gasstation-express-oracle/blob/master/gasExpress.py
Me gustaría escribir una secuencia de comandos similar que se mantuviera en ejecución y recibiera una devolución de llamada cada vez que ocurriera un nuevo bloque con todas las transacciones en el bloque, y mantuviera un promedio móvil de los precios de la gasolina en lugar de invocar todas estas llamadas cada vez que necesitamos controlar.
Parece que hay una opción de servidor websockets en la biblioteca web3. Estoy luchando con la forma de probar esto. ¿Me permite testrpc observar los cambios de bloque automáticamente? ¿Si es así, cómo?
El sondeo de cambios con un filtro es el único estándar admitido universalmente en todos los nodos. En este caso, crearía un nuevo filtro de bloque y sondearía su nodo de vez en cuando. Cada vez que ingresen nuevos bloques, obtendrá la lista de nuevos bloques en respuesta. En web3.py, podría verse así:
block_filter = web3.eth.filter('latest')
# get list of new blocks:
latest_blocks = web3.eth.getFilterChanges(block_filter.filter_id)
# wait a few seconds, and then again:
latest_blocks = web3.eth.getFilterChanges(block_filter.filter_id)
Hay implementaciones específicas de nodo que tienen un modelo de estilo pub/sub, como el de parity parity_subscription
. Con eso, puede "suscribirse" a los cambios en el último bloque y recibir nuevos datos cuando aparezcan. Pero no es estándar, por lo que el soporte en los tipos web3* es débil o inexistente. Tendría que administrar la interacción de bajo nivel con la interfaz json-rpc.
En mi opinión, no vale la pena personalizarlo, ya que el sondeo no le hace perder mucho tiempo frente a los tiempos de bloqueo de 15 s.
usuario19510
web3.eth.getBlockNumber()
le dice el último número de bloque, y si es uno que no ha visto antes, puede procesar el bloque. Recomiendo esto solo porque el soporte de websocket aún no es excelente. Por ejemplo, niganache-cli
(anteriormentetestrpc
) ni Infura lo admiten hasta ahora.