Usando web3.eth.filter

El siguiente enlace describe cómo funciona la función web3.eth.filter(...):

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter

Lo que me gustaría hacer es obtener una lista de los objetos de transacción de todas las transacciones que ocurren en una cuenta. Actualmente tengo el siguiente código:

var options = {
  fromBlock: "pending",
  toBlock: "latest",
  address: "0xab1323fe3234234234fa34324324234af3423432",
};
var filter = web3.eth.filter(options);

filter.watch(function(error, result){
  if (!error)
    console.log(result);
});

Pregunta:

¿El código anterior está haciendo lo que quiero? Esto es lo que quiero que haga:

  • Cada vez que la aplicación comienza a ejecutarse, también lo hace geth y todos los bloques que se agregan a la cadena de bloques comienzan a filtrarse, y cuando optionsse encuentra una coincidencia para la dirección en el objeto, guarda ese registro. aunque no estoy seguro de si es cuando se encuentra que la dirección se envía o si es cuando es el remitente .

  • No quiero que se salte ningún bloque. Pero el código javascript anterior debe aplicarse a geth, y para que eso suceda, geth debe estar ejecutándose antes de aplicar el filtro, ¿no significa eso que algunos de los bloques se omiten antes de aplicar el filtro?


EDITADO:

Fui al sitio web https://etherscan.io/txs?block=4067373

y con esa información elija la siguiente dirección (la tercera en la fila) para realizar la prueba:

0x25f000254108a104A7127B5a5697cb3C12643e62

Y se probó el siguiente código:

var options = {
  fromBlock: 4067373,
  toBlock: 4067373,
  address: "0x25f000254108a104A7127B5a5697cb3C12643e62",
};
var filter = web3.eth.filter(options);

filter.get(function(error, result){
  if (!error)
    console.log(JSON.stringify(result, null, 2));
});

También hice otra prueba con el objeto de opciones siendo:

var options = {
  fromBlock: 4067372,
  toBlock: 4067374,
  address: "0x25f000254108a104A7127B5a5697cb3C12643e62",
};

En ambos casos, el resultado fue una matriz vacía:

[]

Pregunta:

¿Se está haciendo algo mal arriba? Esperaba obtener algunos valores en la matriz de resultados y no sé por qué está vacío.

Respuestas (1)

Desde la documentación , el reloj solo buscará cambios de estado, es decir, solo se informarán los nuevos bloques agregados desde la última vez que se ejecutó geth.

Encontramos algo poco confiable, si hubo una reorganización de la cadena, algunos eventos no se dispararon aunque la transacción se incorporó en la cadena de bloques, o se dispararon pero la transacción se eliminó en la reorganización.

Otro problema es que esto no funcionará para "transacciones internas", es decir, si un contrato realiza una transferencia a la dirección que se está monitoreando, no generará ningún resultado.

Siempre puede recuperar los eventos en un rango dado con get

var previousBlock = 1000;
var options = {
  fromBlock: previousBlock,
  toBlock: previousBlock + 100,
  address: "0xab1323fe3234234234fa34324324234af3423432",
};

var filter = web3.eth.filter(options);

filter.get(function(error, result) {
    if (!error) {
        console.log(result);
    }
});
Hola Ismael gracias por la respuesta! Probé tu respuesta y edité mi pregunta para incluir el intento. Creo que las cosas se están acercando, aunque tuve un problema. Escribí la situación anterior, ¿sabrías qué salió mal?
No puedo probar en este momento, si tiene una nueva pregunta, es mejor que cree una nueva, porque la gente tiende a leer primero sin respuesta.
Entiendo. Estaba tratando de probar su solución, ya que parece muy buena :). Hice una nueva pregunta aquí como sugeriste: ethereum.stackexchange.com/questions/22954/…