Solidity-Ereignisse auf Reagieren nicht feuern

Einfaches Logikereignis mit Funktion zum Auslösen, funktioniert perfekt wie erwartet in der Truffle-Entwicklungskonsole, feuert aber nie auf meinem mit create-react-app erstellten Dapp, es scheint nur das Netzwerk nicht zu hören/überwachen, ich habe Leute, die sagen, es sollte kontinuierlich Laden Sie die POST-Anfrage, um das Netzwerk zu überwachen, aber nicht in meinem Fall. Ich verwende Metamask, und alle Smart-Contract-Funktionsaufrufe funktionieren mit Ausnahme von Ereignissen gut.

event RoundStarted(uint256 closingBlock);

function roundStart() public ownerOnly {
    RoundStarted(block.number + ROUND_LENGTH);
}

Und die Codezeile, die ich in der Truffle-Entwicklungskonsole verwendet habe, die nicht funktioniert, wenn ich sie in componentWillMount() einfüge

  Loto.deployed().then(function(instance){
    return instance.RoundStarted({},{fromBlock: 0, toBlock: 'latest'});
  }).then((result) => {
    return result.watch((error,result) => { 
      console.log('Found him!')
    })
  })

UPD: Ich habe herausgefunden, dass Ereignisse in der Truffle React Box gut funktionieren, also löst das irgendwie das Problem, aber ich weiß immer noch nicht, wie sie es geschafft haben, es ist nicht mein Codeproblem, etwas über Abhängigkeiten, ich würde es gerne wissen was vermisse ich in meiner create-react-app.

Machen Sie etwas Ähnliches, um einen Bezug zum Loto-Vertrag zu bekommen const Loto = Contract(LotoContract); Loto.setProvider(web3.currentProvider)? Wobei web3 vom injizierten Anbieter stammt, zB MetaMask.
@willjgriff, ja, genau, aber ich verwende Truffle-Contract und JSON-Datei, um einen Vertrag zu erhalten, wie folgt: import { default as contract } from 'truffle-contract' import loto_artifacts from './Loto.json' var Loto = contract( loto_artifacts); Loto.setProvider(web3.currentProvider); Auch hier denke ich, dass das Problem eher in Reaktion oder etwas dazwischen liegt. Ich habe web3 0.20.4 und 1.0.0-29beta ausprobiert, beide funktionieren für Funktionen und alles, außer für Ereignisse.

Antworten (1)

Funktioniert es, wenn Sie alle JS-Objektargumente im Vertragsereignisaufruf entfernen, z. B. wenn Sie Zeile 2 in Ihrem Snippet durch ersetzenreturn instance.RoundStarted();

Ich habe nicht damit experimentiert, Start- und Endblöcke anzugeben, die ich überwachen möchte, aber vielleicht den Endblock so anzugeben, dass er 'latest'den letzten Block zum Zeitpunkt des Aufrufs Ihrer componentWillMount()Funktion übernimmt, was wahrscheinlich ein Block vor dem Auslösen Ihres Ereignisses ist.

Ja, ich habe es zum ersten Mal ohne Argumente versucht, und ich habe jemanden gesehen, der vorschlug, sie zu verwenden, was jemandem geholfen hat, also habe ich beide Wege versucht, und ich habe versucht, einen Ereignisbeobachter sowohl in componentWillMount() als auch in componentDidMount( ) gleichzeitig und separat und auf Knopfdruck, also denke ich, dass es nicht das Problem ist, müssen Sie tiefer gehen.