¿Cómo obtener todas las transacciones de un contrato?

Estoy tratando de obtener todas las transacciones de un contrato, pero en todos los casos solo obtuve []o undefined.

Estoy siguiendo estas publicaciones:

Y también leo otras publicaciones, pero no puedo resolver mi problema.

Intento usar esto:

var filter=web3.eth.filter({fromBlock: 866705, toBlock: 909023, address: contractAddress});
filter.get(function(error, log) {
  console.log(JSON.stringify(log));
});
filter.stopWatching(); 

Con diferentes valores de fromblock, to block y las demás opciones ('latest',fromblock: 0 , ...). Pero no obtengo ningún resultado.

Estoy tratando de hacer esto:

var filter = web3.eth.filter({fromBlock:9000, toBlock: 'latest', address: contractAddress});
filter.get(function(error, result) {
  if(!error){
    var info = web3.eth.getBlock(result , function(error, result){
       if(!error){
         var trans = web3.eth.getTransaction(result.transactions[1], function(error,result){
           if(!error){
             var str = web3.toAscii(result.input,);
             console.log(str);
           }else{
              console.log(error);
           }
         });
       }else{
          console.log(error);
       }
     });
 }else{
    console.log(error);
  }
})

(Si olvido alguna ficha lo siento)

Todo esto solo para obtener los datos de una transacción como "desde", "hasta" y "entrada". ¿Dónde está el problema?

Más información:

  • estoy usando metamask y meteor.js
  • Estoy ejecutando esto en Ropsten test-net
  • Si uso la función web3.eth.getBlockcon un número de bloque correcto puedo obtener todos los datos, el problema es el filtro y cómo lo uso.
En el primer fragmento, sospecho que filter.stopWatchingse ejecuta antes de que la devolución de llamada tenga la oportunidad de funcionar. La forma en que está diseñado sugiere la expectativa de que esos comandos se ejecutarán en orden, pero no es el caso con JavaScript. Consideraría comentar filter.stopWatchingy comenzar desde el bloque 0, luego aumentar la complejidad después de ver que funciona. Espero eso ayude.
@Rob Hitchens sí hombre, creo que el problema radica en el orden y la velocidad de ejecución de javascript, pero no encontré cómo solucionarlo.

Respuestas (3)

Otra forma (quizás mucho más simple) de obtener una lista de transacciones en una cuenta es usar una API de un extractor de bloques como http://etherscan.io . El problema con esto es que es totalmente centralized.

Una forma totalmente descentralizada es ir contra el nodo (como lo está haciendo). El problema aquí es que, aunque está descentralizado, es lento. Especialmente si su contrato inteligente tiene un historial de transacciones muy largo.

Un problema aún más profundo de ir en contra del nodo es que simplemente obtener las transacciones no es suficiente. También deberá obtener los recibos de la transacción. Los necesita para determinar si las transacciones se completaron con un error o no.

Peor aún que eso son las llamadas de mensajes entrantes (lo que solía llamarse transacciones internas). Estas son "transacciones" iniciadas por un contrato inteligente externo directamente en su dirección. Estas "transacciones" no aparecen directamente en la cadena de bloques, sino que están enterradas en un rastro interno de la transacción inicial. Si solo está mirando su dirección, estos se perderán.

Mi contrato inteligente no tiene una transacción muy larga, pero también es lento. Leí sobre transacciones internas, pero lo pruebo y mi transacción no es interna porque en etherescan.io no colocan estas transacciones como transacciones internas en sus bloques escaneados. Probaré la API de etehrscan.io, pero esta es una revisión, no una solución real para este problema:/
La API pública de Etherscan para este caso de uso parece estar obsoleta...
@CQM No veo eso, pero tal vez me lo perdí. Tienes enlace s?
etherscan.io/apis#tokens ver los obsoletos, ¿hay un punto final más aplicable?
Supongo, pero apostaría a que lo depreciaron porque era un problema de mantenimiento. No tiene etherscan, podría usar el RPC directamente contra un nodo.
Estoy usando etherscan api para crear una base de datos de todas las transacciones en mi contrato. Luego mostrar a los usuarios. Actualización de la base de datos cada 30 segundos.
¿Cómo obtengo la lista de transacciones internas?

Las matrices se indexan a partir de '0'. Estás indexando desde '1'. Prueba transacciones[0].

La respuesta es bastante simple. También traté de resolver esto codificando mi camino a través de él. Etherscan tiene una función que le permite descargar todas las transacciones como un archivo csv. En la parte inferior de la página: Descargar CSV Export

ingrese la descripción de la imagen aquí