Verwendung von web3.eth.filter

Der folgende Link beschreibt einige Funktionsweisen der Funktion web3.eth.filter(...):

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter

Was ich tun möchte, ist eine Liste der Transaktionsobjekte aller Transaktionen, die auf einem Konto stattfinden. Aktuell habe ich folgenden Code:

var options = {
  fromBlock: "pending",
  toBlock: "latest",
  address: "0xab1323fe3234234234fa34324324234af3423432",
};
var filter = web3.eth.filter(options);

filter.watch(function(error, result){
  if (!error)
    console.log(result);
});

Frage:

Tut der vorherige Code, was ich will? Das möchte ich tun:

  • Immer wenn die App zu laufen beginnt, werden auch Geth und alle Blöcke, die der Blockchain hinzugefügt werden, gefiltert, und wenn eine Übereinstimmung mit der Adresse im optionsObjekt gefunden wird, speichert sie dieses Protokoll. Ich bin mir jedoch nicht sicher, ob immer dann, wenn diese Adresse gefunden wird, entweder an gesendet wird oder ob es sich um den Absender handelt .

  • Ich möchte nicht, dass Blöcke übersprungen werden. Aber der vorherige Javascript -Code muss dann auf Geth angewendet werden, und dazu muss Geth ausgeführt werden, bevor der Filter angewendet wird. Bedeutet das nicht, dass einige der Blöcke übersprungen werden, bevor der Filter angewendet wird?


BEARBEITET:

Ich ging auf die Website https://etherscan.io/txs?block=4067373

und wählen Sie mit diesen Informationen die folgende Adresse (dritte in der Reihe) zum Testen aus:

0x25f000254108a104A7127B5a5697cb3C12643e62

Und der folgende Code wurde getestet:

var options = {
  fromBlock: 4067373,
  toBlock: 4067373,
  address: "0x25f000254108a104A7127B5a5697cb3C12643e62",
};
var filter = web3.eth.filter(options);

filter.get(function(error, result){
  if (!error)
    console.log(JSON.stringify(result, null, 2));
});

Ich habe auch einen weiteren Test mit dem Optionsobjekt durchgeführt:

var options = {
  fromBlock: 4067372,
  toBlock: 4067374,
  address: "0x25f000254108a104A7127B5a5697cb3C12643e62",
};

In beiden Fällen war das Ergebnis ein leeres Array:

[]

Frage:

Ist oben etwas falsch gemacht worden? Ich habe erwartet, einige Werte im Ergebnisarray zu erhalten, und ich weiß nicht, warum es leer ist.

Antworten (1)

Aus der Dokumentation wird watch nur nach Zustandsänderungen suchen, dh es werden nur neue Blöcke gemeldet, die seit der letzten Ausführung von geth hinzugefügt wurden.

Etwas unzuverlässig fanden wir, dass bei einer Chain-Reorganisation einige Events nicht gefeuert wurden, obwohl die Transaktion in die Blockchain aufgenommen wurde, oder sie gefeuert wurden, aber die Transaktion bei der Reorganisation entfernt wurde.

Ein weiteres Problem ist, dass dies nicht für "interne Transaktionen" funktioniert, dh wenn ein Vertrag eine Überweisung an die überwachte Adresse durchführt, wird er kein Ergebnis erzeugen.

Sie können die Ereignisse in einem bestimmten Bereich immer mit get abrufen

var previousBlock = 1000;
var options = {
  fromBlock: previousBlock,
  toBlock: previousBlock + 100,
  address: "0xab1323fe3234234234fa34324324234af3423432",
};

var filter = web3.eth.filter(options);

filter.get(function(error, result) {
    if (!error) {
        console.log(result);
    }
});
Hey Ismael danke für die Antwort! Ich habe Ihre Antwort ausprobiert und meine Frage so bearbeitet, dass sie den Versuch enthält. Ich glaube, die Dinge kommen näher, obwohl ich ein Problem bekommen habe. Ich habe die Situation oben geschrieben, wissen Sie zufällig, was schief gelaufen ist?
Ich kann es gerade nicht testen, wenn Sie eine neue Frage haben, erstellen Sie besser eine neue, da die Leute dazu neigen, zuerst unbeantwortet zu lesen.
Ich verstehe. Ich habe versucht, Ihre Lösung dafür zu testen, da sie wirklich gut zu sein scheint :). Ich habe hier eine neue Frage dazu gestellt, wie Sie vorgeschlagen haben: ethereum.stackexchange.com/questions/22954/…