Ich habe ein Problem/einen Fehler in web3.py, ich muss meinen Ereignisvertrag abhören, aber Ereignisprotokolle sind immer leer. Ich kenne das folgende Problem auf Ganach-CLI , aber möglicherweise gibt es eine andere Alternative. Ich habe bereits die drei folgenden Lösungen ausprobiert und keine funktioniert, habe []
als Ausgabe ...
Die neue Methode mit web3.py v4 :
my_filter = mycontract.events.<event_name>.createFilter({'fromBlock':0,'to':'latest'})
my_filter.get_all_entries()
Die alte Methode:
my_filter = mycontract.eventFilter('EventName',{'fromBlock':0,'toBlock':'latest'})
my_filter.get_all_entries()
Und schließlich versucht, meinen eigenen Filter zu bauen:
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()
Also würde ich gerne wissen, ob es andere Möglichkeiten gibt, Ereignisse zu hören? Kann sein, dass ich etwas verpasst habe.
Oder gibt es möglicherweise einen anderen Testnetzanbieter als Ganach, bei dem die Funktion zum Abhören von Ereignissen funktioniert?
Danke für die Hilfe !
So können Sie ein Ereignis in web3.py decodieren:
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
Wo eth
ist Ihre Web3.eth
Instanz.
Anwendungsbeispiel:
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']
Wenn während der Ausführung der Vertragsfunktion mehr als ein Ereignis ausgegeben wird, verwenden index
Sie , um den Index des spezifischen Ereignisses anzugeben, das Sie decodieren möchten (ich habe es 0
im obigen Beispiel verwendet, vorausgesetzt, es gibt nur ein Ereignis).
['data']
und nicht ? ['topics']
Meine ['data']
ist gleich '0x0'
.decode
Funktion an - sie überspringt aus gutem Grund indizierte Variablen - sie sind nicht im data
Feld enthalten.['topics']
Aber meiner Meinung nach werden alle indizierten Variablen in Feldern des Protokolls
gespeichert ."topics"
. Darüber hinaus wird jeder von ihnen separat gespeichert, sodass Sie sie im Gegensatz zu den nicht indizierten Werten, die unter gespeichert "data"
sind, nicht einmal entschlüsseln müssen. Beachten Sie nur, dass sie an der zweiten Stelle beginnen (dh ['logs'][logIndex]['topics'][0]
etwas anderes enthält, ich bin mir nicht ganz sicher, was).topics
, aber ich kann vergangene Ereignisse (historisch) nicht abrufen. Ich arbeite nicht mit einem Transaktionshash, sondern mit einem benutzerdefinierten Filter mit Vertragsadresse.
gute Stimmung
Lbrth_BoC