Beobachtete Ereignisse werden nicht wie erwartet registriert

Ich habe einen einfachen Vertrag mit einem Ereignis erstellt. Ich verwende web3 über MetaMask, um nach diesen Ereignissen zu suchen, aber ich kann die Transaktionen auf Etherscan sehen, aber der Javascript-Callback wird nicht für das neue Ereignis ausgelöst.

Ereignisse, die vor dem Laden der Seite aufgetreten sind, kann ich abrufen.

Der Vertrag liegt bei Ropsten

pragma solidity ^0.4.18;

contract MyContract {
    address creator;
    event HasAccepted(address sender, bool isCreator);

    function MyContract () 
    public 
    {
        creator = msg.sender;
    }

    function accept () 
    public
    {
        bool isCreator = msg.sender == creator;
        HasAccepted(msg.sender, isCreator);
    }
}

und zugehöriger web3-Code unten:

<html>
  <script>
    var contractAddr = "0x33743a345c0e20f556bf15d19ca12968c47ae4d8";
    var contractAbi = [{"constant":false,"inputs":[],"name":"accept","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"isCreator","type":"bool"}],"name":"HasAccepted","type":"event"}];

    function startApp() {
        var MyContract = web3.eth.contract(contractAbi);
        var contractInstance = MyContract.at(contractAddr);

        document.getElementById('acceptBtn').addEventListener('click', function(){
            contractInstance.accept({value: 0, gas: 210000}, console.log);
        });

        var event = contractInstance.HasAccepted(function(error, result){
            // Expect to log when click 'Run accept' button
            console.log("HasAccepted", error, result);
        });
    }

    window.addEventListener('load', function() {
      if (typeof web3 !== 'undefined') {
        window.web3 = new Web3(web3.currentProvider);
      }
      startApp();
    })
  </script>
  <body>
    <button type="button" id="acceptBtn">Run accept</button>
  </body>
</html>

Ich würde erwarten, dass ich die Ausgabe des Rückrufs sehen würde, der an das Ereignis „HasAccepted“ gegeben wird.

versuchen Sie es web3.eth.subscribe(type [, options] [, callback]);wie hier definiert
@AchalaDissanayake, das scheint eine großartige Ergänzung zu sein, die in 1.xx hinzugefügt wird. Ich frage mich, was das Polyfill für github.com/ethereum/web3.js/releases/tag/0.19.0 ist
Ich habe auch eine Frage zu einem Polyfill für das Abonnieren erstellt. ethereum.stackexchange.com/questions/28928/…

Antworten (1)

Es gab zwei Hauptprobleme mit Ihrem Code.
- Die Funktion method.event() benötigt mindestens eine Variable: indizierter Filter oder {}, falls nicht benötigt
- Es scheint, dass Metamask fromBlockfür das Sammeln oder Beobachten von Ereignissen erforderlich ist (Manchmal kann die Synchronisierung von Metamask mit dem Netzwerk verzögert werden, jedoch nicht oft).

var fromBlock = 1908935;
var contractAddr = "0x33743a345c0e20f556bf15d19ca12968c47ae4d8";
...

    var event = contractInstance.HasAccepted({},{fromBlock:fromBlock},function(error, result){
        // Expect to log when click 'Run accept' button
        console.log("HasAccepted", error, result);
    });
}

Ich hoffe das hilft.

Danke das funktioniert! Seltsamerweise funktioniert der Code, den ich oben gepostet habe, auch bei mir. Ich denke, es könnte ein Problem in Metamask/web3 gegeben haben, das in den letzten Tagen behoben wurde. v3.11.2