Seguimiento y decodificación de eventos desde ethereumj

Tengo un evento en el contrato, y en caso de que se produzca un evento, pude verlo mediante un oyente de Java como se muestra a continuación.

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

al imprimir el objeto loginfo obtengo algo como LogInfo{address=cd5805d60bbf9afe69a394c2bda10f6dae2c39af, topics=[37637aa70af5cd14eda4054cc4323408c237c26de60d49064db916e476c29e2e 67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160 ], data=000000000000000000000000cd2a3d9f938e13cd947ec05abc7fe734df8dd826}.

Sé que es una especie de abi codificado o serializado, pero quiero decodificar cuál es la información que tengo en los registros.

Respuestas (3)

Para analizar la información en LogInfo, necesitará el contrato ABI. Una vez que tenga el ABI, es fácil de analizar:

@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);
  }
}

Un ejemplo de las pruebas que se utilizan aquí es la prueba unitaria DecodeLogTest

Estoy trabajando exactamente en este mismo problema con el campo de "entrada" de las transacciones de Ethereum. Lo más cerca que he llegado a descifrar esto es en el Libro amarillo de Gavin Wood ( http://gavwood.com/paper.pdf ) en el Apéndice 2; Prefijo de longitud recursivo. Creo que este es el formato utilizado y, en algunos casos, funciona para el campo de "entrada" de transacciones en la cadena, pero no estoy seguro acerca de los eventos. Me "parezco" similar.

Thomas, en realidad pude ver los datos en la sección de temas, que están codificados en Keccak. Usé emn178.github.io/online-tools/keccak_256.html para ver si mis datos están indexados y el hash coincide. Pero aparentemente esta es una forma. Dado el hash, no puedo encontrar la cadena.
Definitivamente es una forma.

Puede ser que los chicos de desarrollo se dieron cuenta de esto y comenzaron un problema , una característica que lo resolvería.

Sin embargo, encontré lo siguiente.

Si se utilizan matrices (incluidas cadenas y bytes) como argumentos indexados, el hash sha3 se almacena como tema en su lugar.

Sin embargo, hay Prueba de hash: cómo producir una salida de hash que menciona que usa Keccak y no el SHA3 final. Entonces, el valor en los temas anteriores explica lo que se registró.