Wie kann ich mit Web3j schnell den Transaktionsverlauf für das Konto abrufen?

Einleitung

Wir verwenden die Web3j- Java-Bibliothek, um mit dem Ethereum-Netzwerk zu arbeiten. Ich verwende im Moment das Rinkeby -Testnetzwerk mit dem Geth -Client. Ich habe mich erst vor einer Woche mit Blockchains vertraut gemacht, daher können die von mir verwendeten Begriffe falsch sein.

Knapp

Fast alle erforderlichen Funktionen sind für mich klar, außer der Transaktionshistorie. An diesem Punkt bin ich hängengeblieben. Was ich jetzt habe, sind zwei Testmethoden.

Beispiele

  • Das erste Stück durchsucht den gesamten Verlauf durch Nachfilterung, daher dauert es viel Zeit, um ein Ergebnis zu erhalten.

    @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();
    }
    
  • Der nächste fragt nach Protokollen, aber in den ersten Sekunden wird nichts zurückgegeben. Also denke ich, entweder es schaut sich auch alle Transaktionen an oder loggt sich etwas anderes ein.

    @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();
    }
    

Verknüpfungen gefunden

Frage

Wie schnell alle Transaktionen für ein Konto abrufen. Vielleicht nicht alle, aber 10-20 auf einmal. Maximale Zeitüberschreitung - weniger als 1-2 Sekunden. Diese Ressource kann es tun.

Aktualisierung 1

Wie ich sehe, ist die Listenkontotransaktion ein offenes Problem für web3j mit einer ziemlich langen Geschichte. Auch ein verwandtes Thema bei stackexchange gefunden. Es gibt eine Etherchain-API, in der sie die REST-Methode GetAccountTransactions haben , aber noch nicht verstanden haben, wie sie mit meiner Aufgabe zusammenhängt. Ich sehe Powered by Parity v1.7.8in der Fußzeile

Hallo @invenit. Haben Sie eine Lösung gefunden, um Ihren Transaktionsverlauf abzurufen? Ich bin auch auf Lager und brauche etwas Hilfe zu diesem Thema.

Antworten (1)

Außer den Links, die Sie gepostet haben, gibt es keine Problemumgehung. Dies hängt von Ihrer CPU-Leistung, Ihrem Netzwerk und Ihrer Datenbank ab. Ich glaube, dass sie (das Etherscan-Team) Daten aus der Blockchain abrufen und in einer indizierten Datenbank speichern und einige Analysetools verwenden, um den Benutzern Daten anzuzeigen.