¿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.
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 uint256
se tienen que utilizar en firmas.
EDITAR: Según el comentario de @plingamp web3.sha3
ahora incluye el '0x'.
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.Utilizar .get
en lugar de .watch
con web3.eth.filter
:
contractAddress = "0x00.."
web3.eth.filter({
address: contractAddress,
from: 1,
to: 'latest'
}).get(function (err, result) {
// callback code here
})
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)
}})
eth.subscribe
funcioncontractInstance.getPastEvents('allEvents', {fromBlock: 0, toBlock: 'latest'}, function(e,l){console.log(l)})
Sí, una forma de hacerlo es escribir todas sus condiciones en un .js
archivo y cargar este script en la consola cuando lo necesite.
loadScript
-> Carga un archivo JavaScript y lo ejecuta.
web3
se 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']]
pablo s
b1818762
pablo s
Andrés