La mejor manera de rastrear las transacciones en bloque a medida que ocurren

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?

Debido a que los bloques se crean con relativa poca frecuencia (aproximadamente cada 15 segundos), el sondeo simple es una buena forma de hacerlo. 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, ni ganache-cli(anteriormente testrpc) ni Infura lo admiten hasta ahora.

Respuestas (1)

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.