Solidity

如何訪問 ethereumJ ( java ) 中的事件日誌

  • July 13, 2016

從 javascript 訪問事件日誌既簡單又直接,但是我正在嘗試從 Java 客戶端訪問日誌。任何範常式式碼都會有所幫助

您可以使用 JsonRpc 類對塊的日誌進行過濾。您可以從 EthereumImpl 的實例中獲取它,如下所示:

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

然後,您可以向它傳遞一個 FilterRequest 對象來告訴它要搜尋的內容:

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
}

LogFilterElement 包含來自事件的地址、主題和數據,但它仍然是十六進制格式,因此您必須對其進行解碼。事件的索引值僅在主題中找到,並且被索引的可變長度數據(如字元串或字節)僅作為雜湊儲存在主題中。

我寫了一個 EthereumEventManager 類來為自己處理這些東西。你可以看看這裡。您可以為過​​濾器請求添加偵聽器,然後它會偵聽新塊並在找到這些過濾器請求時發出通知。隨意使用它,修改它,或者在你認為合適的時候學習它。它沒有很好的記錄,但是如果您有任何問題,我很樂意回答。

引用自:https://ethereum.stackexchange.com/questions/6315