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.
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.
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();
}
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.
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.8
in der Fußzeile
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.
Maximilian Belinga