¿Alternativas para escuchar eventos contratar con web3.py?

Estoy enfrentando un problema/error en web3.py, necesito escuchar mi contrato de eventos, pero los registros de eventos siempre están vacíos. Conozco el siguiente problema en Ganach-CLI, pero puede haber otra alternativa. Ya probé las tres siguientes soluciones y ninguna funciona, tengo []como resultado...

El nuevo método con web3.py v4:

my_filter = mycontract.events.<event_name>.createFilter({'fromBlock':0,'to':'latest'})
my_filter.get_all_entries()

El viejo método:

my_filter = mycontract.eventFilter('EventName',{'fromBlock':0,'toBlock':'latest'})
my_filter.get_all_entries()

Y finalmente traté de construir mi propio filtro:

event_hexa = w3.sha3(text='EventTest(address indexed _seller, string indexed)').hex()
    
event_filter = w3.eth.filter({
'fromBlock':0,
'toBlock':'latest',
'address': mycontract_address,
'topics':[str(event_hexa)]
})

event_filter.get_all_entries()

Entonces, me gustaría saber si hay otra forma de escuchar eventos. Puede ser que me perdí de algo.
¿O puede haber otro proveedor de red de prueba además de Ganach donde la función para escuchar el evento está funcionando?

Gracias por la ayuda !

No entendí muy bien tu pregunta, pero puedo decirte cómo decodificar un evento con web3.py si estás interesado.
Perdón si no tengo muy claro lo que pregunto, solo quiero saber si hay otra forma de escuchar eventos, además de las tres de aquí, porque en realidad no me está funcionando. ¡Pero también estoy interesado en saber cómo decodificar un evento con web3.py!

Respuestas (1)

Así es como puede decodificar un evento en web3.py:

def decode(hash,index,params):
    event = {}
    index1 = 1
    index2 = 2
    log = eth.getTransactionReceipt(hash)['logs'][index]
    for param in params:
        if param['indexed']:
            event[param['name']] = int(log['topics'][index1],16)
            index1 += 1
        else:
            size = param['size']//4
            event[param['name']] = int(log['data'][index2:index2+size],16)
            index2 += size
    return event

¿Dónde ethestá tu Web3.ethinstancia?

Ejemplo de uso:

hash = mycontract.func(x)

index = 0

params = [
    {'name': 'addr', 'size': 160, 'indexed': True},
    {'name': 'input', 'size': 256, 'indexed': False},
    {'name': 'output', 'size': 256, 'indexed': False},
]

event = decode(hash, index, params)

addr = event['addr']
input = event['input']
output = event['output']

Si se emite más de un evento durante la ejecución de la función del contrato, use indexpara indicar el índice del evento específico que desea decodificar (lo he usado 0en el ejemplo anterior, asumiendo que solo hay un evento).

¿Está seguro de que es ['data']y no ['topics']en cambio, en su función de decodificación? Mi ['data']es igual a '0x0'.
@Lbrth_BoC: Por supuesto que lo es. Todas las variables de su evento están indexadas. Eche un vistazo a la decodefunción: omite las variables indexadas por una buena razón: no están incluidas en el datacampo.
@Lbrth_BoC: Pero acabas de hacerme dar cuenta de que la función quizás esté incompleta y que, en lugar de omitir estas variables, es posible que deba obtenerlas de algún otro campo en el registro ... Lo investigaré ...
Gracias por su respuesta rápida ! pero en mi opinión, todas las variables indexadas se almacenan dentro ['topics']de los campos del registro.
@Lbrth_BoC: puede cambiar el script anterior en consecuencia y ver si funciona para usted. Intentaré lo mismo por mi parte...
@Lbrth_BoC: parece que los valores indexados están almacenados en "topics". Además, cada uno de ellos se almacena por separado, por lo que, a diferencia de los valores no indexados almacenados en "data", ni siquiera necesita decodificarlos. Solo tenga en cuenta que comienzan en el segundo lugar (es decir, ['logs'][logIndex]['topics'][0]tienen algo más, no estoy muy seguro de qué).
sí tienes razón, encontré el camino! Gracias ! Todo lo que necesito está en topics, pero no puedo recuperar el evento pasado (histórico). No estoy trabajando desde un hash de transacción sino desde un filtro personalizado con dirección de contrato.
He creado una biblioteca de python específicamente para esta tarea, que puede serle útil: github.com/iamdefinitelyahuman/eth-event