¿Cómo obtener el historial de transacciones de la cuenta rápidamente usando Web3j?

Introducción

Usamos la biblioteca java de Web3j para trabajar con la red Ethereum. Uso la red de prueba Rinkeby con el cliente Geth en este momento. Me familiaricé con las cadenas de bloques hace solo una semana, por lo que los términos que uso pueden ser incorrectos.

Breve

Casi todas las características requeridas están claras para mí, excepto el historial de transacciones. Me he quedado atascado en este punto. Lo que tengo ahora son dos métodos de prueba.

Ejemplos

  • La primera pieza busca en todo el historial mediante el filtrado posterior, por lo que requiere mucho tiempo para obtener resultados.

    @Test
    public void testReplayTransactions() throws Exception {
        EthBlock earliestBlockResponse = web3j.ethGetBlockByNumber(DefaultBlockParameterName.EARLIEST, false).send();
        EthBlock.Block earliestBlock = earliestBlockResponse.getBlock();
        LOGGER.info("EARLIEST block number: {}", earliestBlock.getNumber());
    
        EthBlock latestBlockResponse  = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, false).send();
        EthBlock.Block latestBlock = latestBlockResponse.getBlock();
        LOGGER.info("LATEST block number: {}", latestBlock.getNumber());
    
        DefaultBlockParameter startBlock = DefaultBlockParameter.valueOf(latestBlock.getNumber().subtract(BigInteger.valueOf(1000)));
        DefaultBlockParameter endBlock = DefaultBlockParameter.valueOf(latestBlock.getNumber());
        //DefaultBlockParameter startBlock = DefaultBlockParameter.valueOf(earliestBlock.getNumber());
        //DefaultBlockParameter endBlock = DefaultBlockParameter.valueOf(earliestBlock.getNumber().add(BigInteger.valueOf(100000)));
    
        Subscription subscription = web3j
            .catchUpToLatestTransactionObservable(DefaultBlockParameterName.EARLIEST)
        //.replayTransactionsObservable(startBlock, endBlock)
            .filter(transaction -> {
                return KnownPeers.initialPeer.getAddress().equals(transaction.getFrom())
                    || KnownPeers.initialPeer.getAddress().equals(transaction.getTo());
            })
            .doOnError(throwable -> LOGGER.error("Error occurred", throwable))
            .doOnCompleted(() -> LOGGER.info("Completed"))
            .doOnEach(notification -> LOGGER.info("OnEach"))
            .subscribe(transaction -> {
                LOGGER.info("Transaction {} of block {}. From {} to {}",
                    transaction.getHash(),
                    transaction.getBlockNumber(),
                    transaction.getFrom(),
                    transaction.getTo());
            });
    
        Thread.sleep(10000);
        subscription.unsubscribe();
    }
    
  • El siguiente consulta los registros, pero no devolvió nada en los primeros segundos. Así que supongo que también mira todas las transacciones o los registros son otra cosa.

    @Test
    public void getLogs() throws Exception {
        PeerInfo peerInfo = KnownPeers.initialPeer;
        EthFilter filter = new EthFilter(
            DefaultBlockParameterName.EARLIEST,
            DefaultBlockParameterName.LATEST,
            Arrays.asList(peerInfo.getAddress())
        );
    
        LOGGER.info("Start fetching logs");
        Subscription subscription = web3j
            .ethLogObservable(filter)
            .doOnError(throwable -> LOGGER.error("Error occurred", throwable))
            .subscribe(log -> {
                LOGGER.info("Transaction {} of block {}. From {} to {}",
                    log.getTransactionHash(),
                    log.getBlockNumber(),
                    log.getAddress(),
                    log.getType());
            });
    
        Thread.sleep(100000);
        subscription.unsubscribe();
    }
    

Enlaces encontrados

Pregunta

Cómo obtener todas las transacciones de una cuenta rápidamente. Tal vez no todos, pero 10-20 a la vez. Tiempo de espera máximo: menos de 1-2 segundos. Este recurso puede hacerlo.

Actualización 1

Como veo, la transacción de la cuenta de lista es un problema abierto para web3j con una historia bastante larga. También encontré un tema relacionado en stackexchange. Hay algunas API de Etherchain donde tienen el método REST GetAccountTransactions , pero aún no han comprendido cómo se relaciona con mi tarea. Veo Powered by Parity v1.7.8en el pie de página

Hola @invenit. ¿Encontró alguna solución para obtener su historial de transacciones? También estoy en stock y necesito ayuda con ese tema.

Respuestas (1)

No hay otra solución además de los enlaces que has publicado. Dependerá de la potencia de su CPU, red y base de datos. Creo que ellos (el equipo de etherscan) obtienen datos de la cadena de bloques y los almacenan en una base de datos indexada y utilizan algunas herramientas de análisis para mostrar los datos a los usuarios.