¿Cómo explorar todas las transacciones de una cuenta dada?

Después de poder verificar los saldos de las cuentas, estoy buscando un método para enumerar todas las transacciones de una cuenta de Ethereum determinada a través del protocolo json-rpc. No he encontrado ningún método adecuado para eso en https://github.com/ethereum/wiki/wiki/JSON-RPC .

Similar a https://etherscan.io/txs?a=0xbb9bc244d798123fde783fcc1c72d3bb8c189413 Estoy tratando de construir un explorador que muestre todas las transacciones de una cuenta determinada.

En ¿Cómo se pueden encontrar todas las transacciones enviadas a una dirección? se hace una pregunta similar pero no estoy buscando una solución a través de un tercero, sino consultando directamente a mi nodo ethereum a través del protocolo json-rpc.

¿Me estoy perdiendo de algo? ¿Es posible hacerlo a través de la interfaz json-rpc?

Mi corazonada es que indexan externamente las transacciones a lo largo de esta frompropiedad. Hay un montón de otros índices para construir en realidad. ¿Puedes agregar un enlace a tu código? Suena como un proyecto interesante.

Respuestas (3)

Si desea crear una exploración como etherscan.io, debe rastrear todos los datos en la red ethereum y guardar todos los txs en la base de datos.

No existe un método rpc directo para obtener todas las transacciones relacionadas con la cuenta.

¿Por qué rastrear y guardar en db nuevamente? Los clientes de ethereum ya mantienen su db. Solo necesitamos tener una API para obtener esos datos. Por lo tanto, sería mejor elegir el cliente ethereum de su elección y agregar la API deseada.

La respuesta aceptada a ¿Cómo se pueden encontrar todas las transacciones enviadas a una dirección? no involucra a un tercero.

El script en la respuesta usa la API Web3 Javascript que:

Bajo el capó, se comunica con un nodo local a través de llamadas RPC. web3.js funciona con cualquier nodo Ethereum, que expone una capa RPC.

Por ejemplo, donde el script hace:

var block = eth.getBlock(i, true);

puedes usar JSON-RPCeth_getBlockByNumber

Devuelve información sobre un bloque por número de bloque.

Parámetros

  1. CANTIDAD|ETIQUETA: número entero de un número de bloque, o la cadena "más antigua", "más reciente" o "pendiente", como en el parámetro de bloque predeterminado.
  2. Booleano: si es verdadero, devuelve los objetos de transacción completos, si es falso, solo los valores hash de las transacciones.

La API de Javascript lo hace más fácil que emitir solicitudes JSON-RPC, pero puede transferir el script a otro idioma y emitir solicitudes JSON-RPC. Además, tome nota del comentario sobre la respuesta aceptada de que necesitará más que un script para obtener "transacciones internas" .

Entonces, ¿quiere decir que para encontrar transacciones coincidentes (desde o hacia una dirección determinada) necesitaría un script que escanee por completo toda la cadena de bloques? ¿No es el nodo geth capaz de filtrar las transacciones coincidentes que estoy buscando? ¿No están indexados de alguna manera en blockchain o en el mismo nodo? ¡Gracias!
@JuanIgnacioPérezSacristán Nop, Ethereum no pensó tan lejos ;)
@JuanIgnacioPérezSacristán, Ethereum utiliza base de datos NoSQL (LevelDB). No almacena relaciones de tabla como una base de datos relacional. El uso de una base de datos relacional afectaría el rendimiento porque la cantidad de datos es grande. Entonces, escanea toda la base de datos o crea una base de datos relacional a partir de la cadena de bloques y la consulta con SQL.
La cantidad de tiempo requerida para analizar todos los bloques de una dirección dada es bastante grande.
¿Está diciendo en serio que es necesario descargar todo el bloque antes de poder verificar las transacciones? ¿Qué pasa si las transacciones están en bloques separados?
@MelbourneDeveloper una transacción está completamente dentro de un bloque. Si tiene un cliente móvil o liviano, puede verificar sus transacciones sin necesitar el bloque completo (puede usar encabezados de bloque).
Sí, pero necesito obtener todas las transacciones. No solo el uno.

Los nodos Ethereum conocidos carecen de funcionalidad para obtener la lista de transacciones para la dirección ETH (cuenta).

Para resolver el problema, existe una solución de terceros gratuita y de código abierto: el indexador de transacciones de Ethereum: https://github.com/Adamant-im/ETH-transactions-storage

El Indexer permite explorar transacciones por dirección de Ethereum y obtener un historial de cualquier billetera de usuario con solo un movimiento, como lo hace Etherscan. El indexador está escrito en Python. Funciona como un servicio en segundo plano:

  • se conecta al nodo Ethereum (funciona bien con geth o paridad, otros no se prueban)
  • almacena todas las transacciones en la base de datos de Postgres (incluidas las transacciones de contratos inteligentes)
  • proporciona datos para API para obtener transacciones por dirección

Indexer se conecta al nodo Ethereum y obtiene transacciones utilizando JSON RPC, creando índices de transacciones en la base de datos de Postgres. First Indexer almacenará las transacciones a partir del bloque que indique. Después de eso, buscará nuevos bloques cada 20 segundos y actualizará el índice. Puede cambiar el intervalo.

La herramienta Postgrest publica la API para el indexador de transacciones de Ethereum. Si necesita proporcionar una API pública, use cualquier servidor web como nginx y configure el proxy para el puerto de Postgrest en la configuración.

Después de crear el índice, puede usar solicitudes como

curl -k -X GET "http://localhost:3000/?and=(contract_to.eq.,or(txfrom.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094,txto.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094))&order=time.desc&limit=25"

o

https://yourserver.com/ethtxs?and=(contract_to.eq.,or(txfrom.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094,txto.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094))&order=time.desc&limit=25

La solicitud mostrará las últimas 25 transacciones para la dirección de Ethereum 0x6b924750e56a674a2ad01fbf09c7c9012f16f094, ordenadas por marca de tiempo.