¿Cuál es la forma más rápida de exportar todas las transacciones internas?

Sé que las "transacciones internas" no están incluidas en la cadena de bloques y solo se pueden recuperar reproduciendo las transacciones y escuchando CALL, CALLCODEy otros códigos de operación similares. Tanto Parity como Geth proporcionan los medios para hacerlo .

Sin embargo, tengo problemas para realizar una sincronización completa de Geth/Parity. Geth tardó más de un mes en sincronizarse, usa ~800 GB y, a partir de ayer, ya no quiere ejecutarse, fallando con Fatal: Error starting protocol stack: missing block number for head header hash. No pude encontrar una solución ya que la resincronización no es realmente una opción para mí. Por otro lado, comencé a sincronizar Parity hace aproximadamente una semana y el proceso, rápido al principio, se ralentizó a paso de tortuga alrededor del bloque #2393000.

Por lo que sé, no puedo usar warp/sincronización rápida si quiero obtener transacciones internas. Además, no puedo usar Infura porque no ofrece una interfaz JSON RPC adecuada. Podría usar Etherscan, pero eso parece hacer trampa: ¿cuál es el punto de tener un sistema descentralizado si obtiene sus datos desde un punto final central? Sin embargo, es posible que tenga que usarlo si todo lo demás falla, pero agradecería algunos consejos. Estoy seguro de que no soy el único que intenta hacer esto.

TL; DR: ¿cuál es la forma más rápida de sincronizar nodos para poder recuperar las transacciones internas de ellos? En su defecto, ¿cuáles son otras opciones para obtener estos datos?

obtener transacciones internas es muy difícil. Estoy escribiendo un explorador de blockchain completo para esto. Tienes que analizar ejecutar cada transacción y reproducir la pila de la máquina virtual, para averiguar el flujo correcto de fondos. No solo CALL/CALLCODE sino también SELFDESTRUCT afecta el equilibrio. Podrías usar Etherescan o podrías esperar a que salga mi explorador. Se va a exportar a Postgres. Saldrá en unas semanas más.
@Nulik ¡Gracias por el consejo SELFDESTRUCT! No estoy tan preocupado por el explorador en sí, estoy usando una aplicación de Python y Neo4j para eso. Sin embargo, obtener los txs internos de la cadena de bloques es... lento, al menos a través de JSON RPC. ¿Podrá su explorador obtener txs internos más rápido de alguna manera? Si es así, me gustaría mucho saber cómo...
Mi explorador está escrito en golang, es una versión modificada de geth, por lo que es rápido, aunque todavía no me concentré en la optimización del código. El bloque de génesis con 8893 cuentas tarda unos minutos en procesarse, principalmente porque cada INSERCIÓN está separada y las búsquedas se realizan desde que reemplacé las direcciones con uintID, para ahorrar espacio y aumentar el rendimiento. He trabajado con Neo4j, es rápido, pero no tiene sentido exportar datos de un formato NoSQL (LevelDB) a otro formato NoSQL como Neo4j. La clave es exportarlo a SQL porque es mucho más flexible que NoSQL.
Solo quiero decir que me encanta tu comentario sobre "¿cuál es el punto de tener un sistema descentralizado...". He estado hablando sobre este tema exacto durante meses, y no soy el primero en mencionarlo. Aquí hay un ejemplo: github.com/ethereum/go-ethereum/issues/2104 Desafortunadamente, parece que los desarrolladores de Ethereum quieren esconder la cabeza en la arena.
Definitivamente quieres mirar QuickBooks. Hemos resuelto completamente este problema. Incluyendo la acumulación de listas de transacciones por cuenta internas y externas, además de que podemos hacer contabilidad por bloque.
@ThomasJayRush Gracias, QuickBlocks parece un proyecto genial, pero probablemente me ciñaré a mi propio script: necesito modificar los datos a medida que se recuperan y es más fácil para mí y para mis compañeros de trabajo si está en Python, no en C++. Sin embargo, me interesaría mucho saber cómo ha resuelto el problema de la recuperación lenta de transacciones internas. (Veo por tu otro comentario que no estás usando rastreadores;))

Respuestas (2)

Resulta que Parity en el disco SSD se sincroniza mucho más rápido.

EDITAR : ... lo es, pero obtener transacciones internas es muy lento. Recientemente salió Geth 1.8.0 que parece estar sincronizando más rápido (aunque todavía muy lento en HDD) y que admite rastreadores . Veremos cómo va eso.

Buena pregunta,

Según el documento de ayuda de geth, hay 3 formas de sincronizar con la red:

  1. --syncmode full: el cliente Geth descargará Block header + Block data + full Validation [Se llama eth full node]

  2. --syncmode fast: el cliente Geth descargará Block header + Block data + validará las últimas 1k transacciones.

  3. --syncmode light: el cliente Geth descargará el estado actual + pregunta a los nodos según su necesidad. [Nodo ligero [Pedirá bloques faltantes de nodos completos]

Puede cambiar el modo de sincronización especificando --syncmode junto con el símbolo del sistema. rápido es bueno. Pero si no tienes tiempo ni espacio, intenta usar la luz.

Gracias por la respuesta, sin embargo, no veo cómo se aplica esto a mi pregunta. AFAIK, necesito syncmode fullobtener las transacciones internas y estoy buscando una forma más rápida de lograrlo, ya que syncmode fulles muy lento.