Events

來自 ethereumj 的事件跟踪和解碼

  • July 7, 2019

我在契約中有一個事件,在事件觸發時,我可以通過 java 監聽器看到如下

public void onTransactionExecuted(TransactionExecutionSummary summary) {
 List<LogInfo> listLogs= summary.getLogs();// This gives you list of log info
// now Iterate and print the details
}

在列印 loginfo 對象時,我得到類似LogInfo{address=cd5805d60bbf9afe69a394c2bda10f6dae2c39af, topics=[37637aa70af5cd14eda4054cc4323408c237c26de60d49064db916e476c29e2e 67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160 ], data=000000000000000000000000cd2a3d9f938e13cd947ec05abc7fe734df8dd826}.

我知道它是某種 abi 編碼或序列化的,但我想解碼日誌中的資訊。

為了解析 LogInfo 中的資訊,您將需要合約 ABI。一旦你有了 ABI,就很容易解析:

@Override
public void onTransactionExecuted(TransactionExecutionSummary summary) {
 String abi = "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint128\"}],\"name\":\"Transfer\",\"type\":\"event\"}]\n";
 for (LogInfo logInfo : summary.getLogs()) {
   CallTransaction.Contract contract = new CallTransaction.Contract(abi);
   CallTransaction.Invocation invocation = contract.parseEvent(logInfo);
   System.out.println(invocation);
 }
}

此處使用的測試範例在 DecodeLogTest 單元測試中

我正在處理與乙太坊交易的“輸入”欄位完全相同的問題。我最接近解決這個問題的方法是在附錄 2 下的 Gavin Wood 的黃皮書 ( http://gavwood.com/paper.pdf );遞歸長度前綴。我認為這是使用的格式,在某些情況下它確實適用於鏈上交易的“輸入”欄位,但我不確定事件。我“看起來”相似。

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