web3.py createFilter: filter => SyntaxError: el argumento posicional sigue al argumento de palabra clave

  • Web3.py versión 4.2.1
  • versión geth:1.8.0-unstable

He seguido la guía web3.py para filtrar.

A través de la API de la instancia del contrato:

event_filter = mycontract.events.myEvent.createFilter(fromBlock='latest', {'filter':{'arg1':10}})

Pero me sale un error para esta línea:

myContract.events.LogJob.createFilter(fromBlock='latest', {'filter': {'arg1':10}})

Mi objetivo principal es filtrar eventos en función de sus argumentos.

Error que estoy teniendo:

myContract.events.LogJob.createFilter(fromBlock='latest', {'filter': {'arg1':10}})
                                                                 ^
SyntaxError: positional argument follows keyword argument

[P] ¿Cómo podría solucionar este error?


Actualización: he seguido la respuesta de @Mikko Ohtamaa. Ahora no recibo ningún error, pero el filtro devuelve []incluso si proporciono la palabra clave correcta del evento (diccionario del nombre del argumento y su valor).

Por favor vea un ejemplo:

blockReadFrom = 1899201;
myFilter = eBlocBroker.events.LogJob.createFilter(fromBlock=blockReadFrom)
print(myFilter.get_all_entries())

Devoluciones, aquí puede ver que hay un evento emitido con 'storageID': 0debajo AttributeDict:

[AttributeDict({'address': '0x128c9F368F12C24Cc2a4f88dCDCf3daA13C9667e', 'transactionHash': HexBytes('0x8f7c50fe276057ea90985be6d14dc7abb79ee0430c66bd161861b582b7db0c97'), 'args': AttributeDict({'desc': 'Science', 'jobKey': 'QmRsaBEGcqxQcJbBxCi1LN9iz5bDAGDWR6Hx7ZvWqgqmdR', 'index': 21, 'storageID': 0, 'clusterAddress': '0x75A4c787c5c18C587B284a904165Ff06a269B48C'}), 'transactionIndex': 0, 'event': 'LogJob', 'blockHash': HexBytes('0x9782cb281aa72defe54e0f84055a03a0b1bf6c6f21bd3d276a1252098f83c15f'), 'logIndex': 0, 'blockNumber': 1899201})]

blockReadFrom = 1899201;
myFilter = eBlocBroker.events.LogJob.createFilter(fromBlock=blockReadFrom, argument_filters={'storageID':0})
print(myFilter.get_all_entries())

Devoluciones:

[]

Y el punto interesante de que la siguiente línea devuelve una salida válida aunque { 'arg1': 999or 'arg111': 999etc.} no existe.

myFilter = eBlocBroker.events.LogJob.createFilter(fromBlock=blockReadFrom, argument_filters={'arg1': 999})


Nota:

Para obtener más información, siga este número cerrado: https://github.com/ethereum/web3.py/issues/943#event-1723643072

Respuestas (1)

Creo que debería ser:

  myContract.events.LogJob.createFilter(fromBlock='latest', argument_filters={'arg1':10})

Puede ver la firma de la función real aquí:

https://web3py.readthedocs.io/en/latest/contracts.html?highlight=createfilter

Presente un problema relacionado con la página de documentación de web3.py, ya que no refleja el código base actual.

¿Debería arg1ser la palabra clave que se define en el evento? Ahora no da ningún error, pero regresa []incluso si proporciono la palabra clave correcta del evento (diccionario del nombre del argumento y su valor). Por favor vea mi respuesta actualizada @Mikko Ohtamaa
Para obtener más información, siga este número cerrado: github.com/ethereum/web3.py/issues/943#event-1723643072