Ich arbeite an einem Projekt, das es Benutzern ermöglicht, einen bestimmten Vertrag, den ich erstellt habe, automatisch bereitzustellen. Es ist wichtig, dass das System bestimmte Ereignisse (z. B. neue Transaktionen) bei ALLEN bereitgestellten Verträgen überwachen kann.
Hinweis: Ich verwende nodejs über web3 json rpc, um Ereignisse zu überwachen.
Eine mögliche Lösung, an die ich dachte, ist die Verwendung eines Wrapper-Vertrags, der alle Transaktionsanforderungen tunnelt und die Ereignisse selbst sendet. Dies ermöglicht es, nur Ereignisse aus einem einzigen Vertrag abzuhören, aber ich finde diese Lösung nicht sehr elegant.
Gibt es eine effiziente und skalierbare Möglichkeit, dies zu erreichen, ohne einen Listener für jeden einzelnen Vertrag zu erstellen?
Es hört sich so an, als ob die Sorge besteht, dass sich die Zuhörer auf eine Weise vermehren könnten, die möglicherweise nicht skaliert wird. Soweit ich weiß, gibt es keine Wunderwaffe, mit der ein einzelner Listener Ereignisse so filtern könnte, wie Sie es benötigen würden. Dieser dritte Weg ist eine Variante der beiden Optionen, die Sie meines Wissens nach in Betracht ziehen.
Erwägen Sie, Transaktionen so zu handhaben, wie Sie es möchten, und logisch zentralisierte Protokollierungsfunktionen hinzuzufügen. Zum Beispiel die Auftragsfabrik. Ordnen Sie die Dinge so an, dass sich werkseitig erstellte Verträge auf die zentralisierten Protokollierungsfunktionen statt auf interne Ereignisemitter verlassen.
Wenn Sie haben:
contract Factory { ...
contract Created {
event LogSomething(bytes32 Id);
...
LogSomething(Id);
Neu anordnen als
contract Hub {
event LogSomething(address contract, bytes32 Id);
...
function logSomething(bytes32 Id);
LogSomething(msg.sender, Id); // msg.sender will be the "spoke" that called Hub function.
contract Created{
...
function important(bytes32 id) {
..
Hub.logSomething(Id);
Factory sollte wahrscheinlich Hub genannt werden, falls man sich auf sie für mehr als nur Prägeverträge verlässt.
Ich hoffe es hilft.
web3.eth.filter() (die Low-Level-Methode, nicht die Art, die Sie von Vertragsobjekten erhalten können) ermöglicht es, eine Liste von Adressen anzugeben, die mit einem Filter überwacht werden sollen. Sie müssen die Themen manuell interpretieren, aber das sollte nicht allzu schwierig sein.
Es ist etwas schwieriger, darauf zu achten, wann ein Vertrag erstellt wird (damit Sie wissen, auf welche Adressen Sie hören müssen). Sie können die gleiche Methode verwenden, ohne eine Liste von Adressen anzugeben, und dann das topics
Argument verwenden, um sicherzustellen, dass Sie nur Ereignisse aus Verträgen erhalten , die vorgeben , Ihnen zu gehören. Die Unterscheidung ist wichtig – jeder kann ein Ereignis dazu bringen, alles zu sagen, daher wäre es ratsam, zu überprüfen, ob es aus einem Vertrag stammt, der Ihren Code enthält.
Nergall
Nergall
Rob Hitchens
Rob Hitchens
Rob Hitchens
Nergall
Rob Hitchens
Nergall