¿Cómo puedo leer registros/eventos que se han activado en el pasado?

Tengo un contrato inteligente con un evento.

    event NewContractCreated(address _callerAddress, address _newContractAddress);

Sé cómo escuchar activamente nuevos eventos:

var newContractEvent = myContract.NewContractCreated();
newContractEvent.watch(function(error, result){
      if (!error){
        console.log("Success");
        console.log("New Contract Address: " + result.args._newContractAddress);
        console.log("Creator: " + result.args._callerAddress);
      }
  });

Eso funciona bien para mí. Pero mi pregunta es: ¿cómo escucho y extraigo exactamente los mismos datos de los eventos que ocurrieron antes de comenzar a mirar?

Intenté exactamente lo mismo pero usando geten lugar de watch... funcionó a medias. Imprimió la línea superior "Éxito" pero no imprimió el resto de las líneas de registro.

Respuestas (3)

Debería poder especificar el período (en el bloque no) para mirar. Según la documentación aquí

fromBlock: Number|String: el número del bloque más antiguo (el más reciente se puede dar para indicar el bloque más reciente y pendiente de extracción actual). Por defecto más reciente.

toBlock: Number|String: el número del bloque más reciente (más reciente se puede dar para indicar el bloque más reciente y pendiente de extracción actual). Por defecto más reciente.

En tu caso, eso debería funcionar:

var newContractEvent = myContract.NewContractCreated();
newContractEvent.watch({fromBlock: 0, toBlock: 'latest'}, function(error, result){
      if (!error){
        console.log("Success");
        console.log("New Contract Address: " + result.args._newContractAddress);
        console.log("Creator: " + result.args._callerAddress);
      }
  });

Probar

var newContractEvent = myContract.NewContractCreated({}, {fromBlock: 12345, toBlock: 'latest'});
newContractEvent.watch(function(error, result) {
    if (!error){
        console.log("Success");
        console.log("New Contract Address: " + result.args._newContractAddress);
        console.log("Creator: " + result.args._callerAddress);
        JSON.stringify(result);
    }
});

Consulte Cómo recupero los eventos votados de The DAO para obtener más información sobre el uso de los parámetros indexados de su evento como elementos de filtro.

mi sugerencia seria

  • Crea un filtro con opciones {fromBlock:.., toBlock:.., address:.Contract_addr.}
  • Luego use filter.get() para recibir eventos del pasado
  • Considere el almacenamiento en caché de eventos pasados ​​si está utilizando MetaMask o un nodo remoto