¿Cómo acceder al registro de eventos conociendo la dirección del contrato (web3)?

¿Cómo puedo acceder a un registro almacenado en uno de los tx del contrato a través de web3?

Ejemplo de código:

event newtest(string indexed name, uint indexed idlevel,string indexed multib, string objmulti, uint objnm);

y

newtest('test',5,'testj','obj2',30);

Digamos que la dirección del contrato es 0x00. ¿Cómo obtengo todos los registros que se almacenan en esta dirección de contrato con web3?

PD: no necesito escuchar eventos en tiempo real. Solo necesito obtener todos los registros de un contrato, en función de los filtros cuando lo necesito.

Creo que esto es un duplicado de ethereum.stackexchange.com/questions/1381/…
esa pregunta solicita el análisis de registros y asume que ya tiene el recibo del tx, en cambio, estoy buscando cómo puedo obtener los registros sabiendo solo la dirección del contrato, gracias de todos modos
Lo siento, se malinterpretó un poco. Necesitará esa respuesta una vez que encuentre la transacción que busca. Bueno, no sé cómo codificar esto, pero sé dónde encontrar la respuesta. Los exploradores de blockchain tienen esta capacidad, y hay algunos ejemplos de código abierto aquí: ethereum.stackexchange.com/questions/404/…
¿Cómo hacemos esto en 1.0 ahora que el filtro ya no está?

Respuestas (5)

Eche un vistazo a web3.eth.filter y watch.

Algo como esto:

const filter = web3.eth.filter({
  fromBlock: 0,
  toBlock: 'latest',
  address: contractAddress,
  topics: [web3.sha3('newtest(string,uint256,string,string,uint256)')]
})

filter.watch((error, result) => {
   //
})

Tenga en cuenta la parte que dice "En solidez: el primer tema es el hash de la firma del evento". Tipos canónicos, como los que uint256se tienen que utilizar en firmas.

EDITAR: Según el comentario de @plingamp web3.sha3ahora incluye el '0x'.

gracias por la respuesta, no sabía sobre la firma en el primer tema, ¡esto resolvió el problema! sin embargo, descubrí que debe colocar "0x" antes de la firma, por lo que "0x"+web3.sha3('newtest(string,uint256,string,string,uint256)')
Lo último, estaba buscando cómo analizar los datos de registros y encontré útil la pregunta vinculada anterior ( ethereum.stackexchange.com/questions/1381/… ) pero no puedo importar el script coder.js a través de require() porque estoy haciendo una página estática, ¿sabes cómo usar la función decodeParams con web3?
Me alegro de que tu problema se haya resuelto y actualizaré para incluir el 0x. No he mirado mucho decodeParams, pero generalmente hay pruebas en web3.js y pueden ayudar a descubrir cómo se pueden usar las API.
No tengo suficiente reputación para dejar un comentario, pero la respuesta de @eth está un poco desactualizada ahora. El '0x' está incluido web3.sha3()ahora. var filter = web3.eth.filter({fromBlock:0, toBlock: 'latest', address: contractAddress, 'topics':[web3.sha3('newtest(string,uint256,string,string,uint256)')]} ); filter.watch(function(error, result) { ... }) Espero que esto ayude.
@plingamp ¡Gracias! Actualicé la respuesta. (No estoy seguro si los permisos le permiten hacer clic en "editar" y podría ser otra opción para probar).

Utilizar .geten lugar de .watchcon web3.eth.filter:

contractAddress = "0x00.."
web3.eth.filter({
  address: contractAddress,
  from: 1,
  to: 'latest'
}).get(function (err, result) {
  // callback code here
})
Creo que esta respuesta responde a la pregunta real sobre cómo obtener los eventos después de ese hecho sin escuchar en tiempo real. .get hace esto mientras que .watch es para escuchar en tiempo real.

En web3 1.0 puede usar getPastEvents de la siguiente manera

 var contractInstance = new web3.eth.Contract(contractAbi, contractAddress);

  contractInstance.getPastEvents('EventName', {
      filter: {id: id},  
      fromBlock: 0,
      toBlock: 'latest'
  }, (error, events) => { 

      if (!error){
        var obj=JSON.parse(JSON.stringify(events));
        var array = Object.keys(obj)

        console.log("returned values",obj[array[0]].returnValues);

      }
      else {
        console.log(error)
      }})
¿Puedes editar tu respuesta y explicar más por favor? (No veo cómo esto responde a la pregunta).
esto está en web3.js 1.0 - para tu información. esa es la eth.subscribefuncion
Sí, esto está en desuso.
Para eventos pasados:contractInstance.getPastEvents('allEvents', {fromBlock: 0, toBlock: 'latest'}, function(e,l){console.log(l)})

Sí, una forma de hacerlo es escribir todas sus condiciones en un .jsarchivo y cargar este script en la consola cuando lo necesite.

loadScript-> Carga un archivo JavaScript y lo ejecuta.

ejemplo de carga de script

Gracias por la respuesta, sin embargo, esto no es lo que estaba buscando, tengo problemas para obtener registros de una dirección de contrato a través de web3
web3se supone que funciona. publique el fragmento de código para que la comunidad lo ayude más en esto.

Si desea filtrar varios eventos, debe pasar una lista dentro de una lista. Para los siguientes dos eventos emitidos en un contrato Solidity:

event event1(uint256 indexed anumb)
event event2(uint256 indexed anothernumb)
event event3(uint256 indexed yetanothernumb)

Use lo siguiente para filtrar solo por eventos1 y evento2:

const filter = web3.eth.filter({
  fromBlock: 0,
  toBlock: 'latest',
  address: contractAddress,
  topics: [[web3.sha3('event1(uint256)'),web3.sha3('event2(uint256)')]]
})

filter.get((error, result) => {
   // gets all prior results
})

De los documentos :

temas: Matriz de cadenas: una matriz de valores que deben aparecer en las entradas del registro. El orden es importante, si desea omitir temas, use nulo, por ejemplo, [null, '0x00...']. También puede pasar otra matriz para cada tema con opciones para ese tema, por ejemplo, [null, ['option1', 'option2']]