Diese Frage bezieht sich auf diese oder jene . Es gibt hier ein Tutorial , das einige Filterbeispiele zeigt, aber nicht auf die Granularität auf Transaktionsebene eingeht. Können wir die Blockchain nach Transaktionen abfragen und bestimmte Transaktionen asynchron verarbeiten?
Dieser Code durchläuft beispielsweise Blöcke, die mit einer bestimmten Blocknummer beginnen und enden, und zeigt jede Transaktion zu oder von einer bestimmten Adresse an:
function getTransactionsByAccounts(myaccount, startBlockNumber, endBlockNumber) {
console.log("Searching for transactions to/from account \"" + myaccount + "\" within blocks " + startBlockNumber + " and " + endBlockNumber + "\"");
for (var i = startBlockNumber; i <= endBlockNumber; i++) {
var block = eth.getBlock(i, true);
if (block != null && block.transactions != null) {
block.transactions.forEach( function(e) {
if (myaccount == "*" || myaccount == e.from || myaccount == e.to) {
console.log(" tx hash : " + e.hash + "\n"
+ " nonce : " + e.nonce + "\n"
+ " blockHash : " + e.blockHash + "\n"
+ " blockNumber : " + e.blockNumber + "\n"
+ " transactionIndex: " + e.transactionIndex + "\n"
+ " from : " + e.from + "\n"
+ " to : " + e.to + "\n"
+ " value : " + e.value + "\n"
+ " gasPrice : " + e.gasPrice + "\n"
+ " gas : " + e.gas + "\n"
+ " input : " + e.input);
// Do something asynchronously with the transaction:
call_async_method(e); // <== HOW CAN WE ADD THIS AS A PROMISE?
}
})
}
}
}
Wie können wir eine Transaktion asynchron verarbeiten (wie im Code gezeigt)? möglicherweise mit Promises und den in web3.js definierten Filtern .
Leider wird kein Filter bereitgestellt, um die bestätigten Transaktionen zu parsen, ohne zuerst einen Block zu durchlaufen, dh Sie können einen Filter auslösen (und call_async_method() ausführen ), wenn ein letzter Block vorhanden ist: eth.getBlock("latest")
, aber es gibt keine solche Funktion für eine Transaktion.
Wenn Sie jedoch auf einer privaten Blockchain arbeiten (Sie vertrauen allen Knoten) und glauben, dass alle initiierten Transaktionen erfolgreich zur Blockchain hinzugefügt werden, können Sie Filter erstellen, auf die Sie reagieren können, eth.pendingTransactions
damit Aktionen wie call_async_method() ausgeführt werden sofort ausgeführt werden, ohne darauf warten zu müssen, dass die Transaktionen bestätigt und der Blockchain hinzugefügt werden. Zu einem späteren Zeitpunkt sollten Sie jedoch immer überprüfen, ob diese Transaktionen tatsächlich bestätigt sind.
Dies ist keine ideale oder empfohlene Lösung und widerspricht den Grundprinzipien der Blockchain, aber Sie können testen und prüfen, ob sie für Ihren Anwendungsfall geeignet ist.
Bearbeiten: Schneller Weg, um Blöcke nach Transaktionen auf einem Konto zu scannen. Dies ist ein asynchroner Scanner mit 200 Threads: https://ethereum.stackexchange.com/a/7184/2460
Quellcode hier .
Date().getTime()
Funktion zu verwenden, um festzustellen, wie lange der Anruf dauert.
Sergeon
Sebi