Alternativen zum Listen-Events-Vertrag mit web3.py?

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 !

Ich habe Ihre Frage nicht ganz verstanden, aber ich kann Ihnen sagen, wie Sie ein Ereignis mit web3.py decodieren, wenn Sie interessiert sind.
Entschuldigung, wenn ich nicht ganz klar bin, was ich frage, ich möchte nur wissen, ob es eine andere Möglichkeit gibt, Ereignisse zu hören, als die drei hier, denn eigentlich funktioniert es bei mir nicht. Aber ich bin auch daran interessiert zu wissen, wie man ein Ereignis mit web3.py dekodiert!

Antworten (1)

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 ethist Ihre Web3.ethInstanz.

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 indexSie , um den Index des spezifischen Ereignisses anzugeben, das Sie decodieren möchten (ich habe es 0im obigen Beispiel verwendet, vorausgesetzt, es gibt nur ein Ereignis).

Sind Sie sicher , dass es in Ihrer Dekodierungsfunktion ist ['data']und nicht ? ['topics']Meine ['data']ist gleich '0x0'.
@Lbrth_BoC: Natürlich ist es das. Alle Variablen in Ihrem Ereignis werden indiziert. Schauen Sie sich die decodeFunktion an - sie überspringt aus gutem Grund indizierte Variablen - sie sind nicht im dataFeld enthalten.
@Lbrth_BoC: Aber Sie haben mir gerade klar gemacht, dass die Funktion vielleicht unvollständig ist und dass sie diese Variablen möglicherweise aus einem anderen Feld im Protokoll abrufen muss, anstatt sie zu überspringen ... Ich werde es untersuchen ...
Danke für deine schnelle Antwort ! ['topics']Aber meiner Meinung nach werden alle indizierten Variablen in Feldern des Protokolls gespeichert .
@Lbrth_BoC: Sie können das obige Skript entsprechend ändern und sehen, ob es für Sie funktioniert. Ich werde das gleiche auf meiner Seite versuchen ...
@Lbrth_BoC: Es scheint, dass die indizierten Werte tatsächlich unter gespeichert werden "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).
Ja du hast Recht, ich habe den Weg gefunden! Danke ! Alles, was ich brauche, ist in topics, aber ich kann vergangene Ereignisse (historisch) nicht abrufen. Ich arbeite nicht mit einem Transaktionshash, sondern mit einem benutzerdefinierten Filter mit Vertragsadresse.
Ich habe speziell für diese Aufgabe eine Python-Bibliothek erstellt, die für Sie nützlich sein kann - github.com/iamdefinitelyahuman/eth-event