Asynchrones Abfragen der Blockchain

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 .

was genau meinst du mit 'als versprechen'? Wenn Ihre Methode darin besteht, die Transaktion in einer Datenbank zu speichern oder einen Webdienst mit Transaktionsdaten aufzurufen, sehe ich keine Notwendigkeit, dies zu versprechen, soweit ich Versprechungen gut verstehe - aber ich bezweifle das etwa 10 Mal am Tag: - ) -.
Aufrufen einer Funktion, die bestätigt, dass eine Transaktion vom Filter gefunden wurde (ich plane, die Blockchain zu durchlaufen und eine Reihe von Transaktionen gleichzeitig zu verarbeiten. Der obige Code funktioniert seriell, aber ich brauche eine Form der Parallelität, da jede Transaktion eine möglicherweise längere Zeit in Anspruch nehmen kann von Zeit).

Antworten (1)

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.pendingTransactionsdamit 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 .

Ich habe node js nicht verwendet. Soweit ich weiß, handelt es sich um ein Back-End-Modul (ähnlich wie PHP), das Javascript ausführt. Dies eignet sich hervorragend für ereignisbasierte und asynchrone Programmierung, da es vom Umgang mit Multithreading abstrahiert. Ich weiß nicht, wie einfach es in eine Bibliothek gestellt und in einem Softwareprojekt verteilt werden kann. Und auch, was passiert, wenn ein bestimmter Aufruf (call_async_method()) "zu" lange dauert (nach meinem Verständnis ist der Knoten Single-Threaded: stackoverflow.com/questions/1884724/what-is-node-js )
Ich bin mir nicht sicher, aber laufen alle Funktionen in node js asynchron? Es scheint so von gist.github.com/ross-p/bd5d4258ac23319f363dc75c2b722dd9
Auch ich bin kein Experte für node.js. Vielleicht können Sie diese als separate Fragen zu Stackoverflow posten? Sie können versuchen, die Date().getTime()Funktion zu verwenden, um festzustellen, wie lange der Anruf dauert.
Die Sache ist, dass Javascript meines Wissens sequentiell im Browser ausgeführt wird, ich brauche eine serverähnliche Funktionalität von einem Knoten, der den Block parallel mit Javascript auf Transaktionen überprüft. Ich lese über nodejs, da es scheint, alles pseudoparallel auszuführen (mit deterministischer Planung).
Bitte posten Sie Ihre Erkenntnisse / Gedanken.
Ich verwende jetzt einen vertragsbasierten Ansatz zum Speichern von Daten in der Blockchain (unter Verwendung von Struct-Arrays ähnlich wie Tabellen in einer Datenbank). Das Problem beim transaktionsbasierten Ansatz besteht darin, dass Sie nicht mit den Daten im Eingabefeld der Transaktionen synchronisieren können ( Sie können Blöcke gleichzeitig lesen, aber nicht mit dem Transaktionsdatenfeld von ihnen synchronisieren).