So greifen Sie auf Ereignisprotokolle in EthereumJ (Java) zu

Der Zugriff auf Ereignisprotokolle über Javascript ist einfach und unkompliziert, ich versuche jedoch, über den Java-Client auf die Protokolle zuzugreifen. Jeder Beispielcode würde helfen

Antworten (2)

Sie können die JsonRpc-Klasse verwenden, um die Protokolle eines Blocks zu filtern. Sie können es von einer Instanz von EthereumImpl wie folgt erhalten:

JsonRpc jsonrpc = ethereum.getApplicationContext().getBean(JsonRpc.class);

Sie können ihm dann ein FilterRequest-Objekt übergeben, um ihm mitzuteilen, wonach gesucht werden soll:

FilterRequest fr = new FilterRequest();
fr.fromBlock = "latest";
fr.toBlock = "latest";
fr.address = ""; //String or String[] - addresses to match
fr.topics = ...//String or String[] of topics to match
               //Hash of event signature is first, then indexed parameters
               //I believe you can give it a String[][] also, so for each param in the event you can filter for multiple options
Object[] logs = jsonrpc.eth_getLogs(fr);
for(Object logObject : logs) {
    LogFilterElement log = (LogFilterElement)logObject;
    //do stuff with the log of the event
}

Das LogFilterElement enthält die Adresse, Themen und Daten des Ereignisses, aber es ist immer noch im Hexadezimalformat, sodass Sie es entschlüsseln müssen. Indizierte Werte aus dem Ereignis werden nur in Themen gefunden, und indizierte Daten variabler Länge (wie Zeichenfolgen oder Bytes) werden nur als Hash in den Themen gespeichert.

Ich habe eine EthereumEventManager-Klasse geschrieben, um diese Dinge für mich selbst zu handhaben. Sie können es sich hier ansehen . Sie können Listener für Filteranforderungen hinzufügen, dann wartet es auf neue Blöcke und benachrichtigt, wenn diese Filteranforderungen gefunden wurden. Fühlen Sie sich frei, es zu verwenden, zu ändern oder daraus zu lernen, wie Sie es für richtig halten. Es ist nicht gut dokumentiert, aber wenn Sie Fragen haben, beantworte ich sie gerne.

Wie können wir die Instanz von EthereumImpl erhalten?

Sie können die Schnittstelle onTransactionExecuted() von EthereumListner abhören und das Objekt TransactionExecutionSummary verwenden, um die Protokollinformationen abzurufen, siehe Ereignisverfolgung und -dekodierung von ethereumj .

Weitere Einzelheiten finden Sie in der bereitgestellten Antwort.