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 !
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 eth
está tu Web3.eth
instancia?
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 index
para indicar el índice del evento específico que desea decodificar (lo he usado 0
en el ejemplo anterior, asumiendo que solo hay un evento).
['data']
y no ['topics']
en cambio, en su función de decodificación? Mi ['data']
es igual a '0x0'
.decode
función: omite las variables indexadas por una buena razón: no están incluidas en el data
campo.['topics']
de los campos del registro."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é).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.
buena vibración
Lbrth_BoC