Abrufen aller ERC721-Transaktionen von einem Konto

Mein Ansatz bestand hier darin, auf ein Übertragungsereignis für einen Vertrag (z. B. Cryptokitties) zu hören, das nach dem indizierten Konto gefiltert wurde .

var contract = new web3.eth.Contract(kittyABI, kittyContractAddress, 
{from: account});
contract.events.Transfer(
  {filter: {from: account}}, fromBlock: 0},
  function(error, event){ console.log(event); })

Der Anbieter war zunächst Metamask. Aber das warf den Fehler:The current provider doesn't support subscriptions

Also bin ich auf Infura umgestiegen. Infura hatte ein ähnliches Problem, es sei denn, Sie verwenden Websockets. Der Fehler verschwand und stattdessen begann ich mit dem Timeout-Problem zu kämpfen. Nach vielen Bemühungen scheint es, als ob der Infura-Websocket-Ansatz immer noch nicht perfekt funktioniert. Also denke ich darüber nach, einen eigenen Geth-Knoten einzuführen, der einfach diese Abfrage ausführt. Aber bevor ich das tue, gibt es etwas, das ich vermisse? Das Problem sollte nicht so schwer sein. Ich habe immerhin viele ERC20-Geldbörsen gesehen.

Ich glaube nicht, dass es einen anderen Weg gibt, als Ereignisse zu lesen.

Antworten (1)

Ein Problem mit der CryptoKitties-Implementierung von ERC721 besteht darin, dass Ereignisparameter nicht indiziert werden:

event Transfer(address from, address to, uint256 tokenId)
event Approval(address owner, address approved, uint256 tokenId);

Dies führt dazu, dass das Filtern ein kostspieligerer Vorgang ist und Zeitüberschreitungen verursacht. Da dies Teil des Vertrags ist, kann dies nicht geändert werden und wirkt sich auf Ihren eigenen Knoten aus.

Der endgültige Standard hat sie indiziert und Sie werden keine Probleme mit neuen Implementierungen haben, die ihm folgen.

Für CryptoKitties besteht eine mögliche Lösung darin, alle Ereignisse in einer Datenbank separat zu indizieren.

Oh toll. Gut zu wissen. Das ist mir komplett entgangen. :)