Ist es möglich, Ereignisse zu verwenden, um serverähnliche Funktionen zu implementieren?

In der Dokumentation und den vorgeschlagenen Links und dieser Frage wird erwähnt, dass Ereignisse an Methoden gebunden sind und ausgelöst werden, wenn eine Methode (über eine Transaktion) aufgerufen wird. Es gibt ein Beispiel für einen Vertrag:

contract ClientReceipt {
    event Deposit(
        address indexed _from,
        bytes32 indexed _id,
        uint _value
    );

    function deposit(bytes32 _id) {
        // Any call to this function (even deeply nested) can
        // be detected from the JavaScript API by filtering
        // for `Deposit` to be called.
        Deposit(msg.sender, _id, msg.value);
    }
}

bei dem bei jedem Aufruf der Methode deposit() ein Event ausgelöst wird. Ich habe versucht, die Argumenttypen zu ändern und den folgenden vereinfachten Vertrag geschrieben:

contract ClientReceipt {
    event Deposit(
        uint256 a
    );

    function deposit(uint256 a) {
        // Any call to this function (even deeply nested) can
        // be detected from the JavaScript API by filtering
        // for `Deposit` to be called.
        Deposit(a);
    }
}

aber ich bekomme den Fehler:

TypeError: Cannot read property 'event' of undefined

beim Bereitstellen und Aufrufen der Methode (in browser-solidity ).

  • Warum wird das Ereignis nicht richtig ausgelöst?
  • Kann ein Listener als Server von Javascript verwendet werden, indem jedes Mal eine Methode aus dem Skript aufgerufen wird?
  • Wenn ein Ereignis in einer Funktion ausgelöst wird, die den Status der Funktion ändert, wird es ausgelöst, nachdem der Status geändert wurde (die entsprechende Transaktion wurde abgebaut)?

Bearbeiten:

Der Javascript-Ereignis-Listener:

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at(0x123 /* address */);

var event = clientReceipt.Deposit(function(error, result) {
    if (!error)
        console.log(result);
    else {
        // Based on the result call another method of the contract
        clientReceipt.callMethod({gas: 4700000});
    }
});
Können Sie den Javascript-Teil Ihres Codebeispiels hinzufügen?
Hinzugefügt. Das Problem ist, dass das Ereignis nicht richtig ausgelöst wird.
eventDie Tatsache, dass Sie die Variable überschreiben , ist seltsam. Als ich jedoch Ihren Code mit einer kleinen Änderung ausprobierte, um in Truffle zu arbeiten, funktionierte er einfach wie erwartet.
Entschuldigung, ich habe beide Beispiele in die Code-Snippets kopiert. Es funktioniert wie erwartet, obwohl das von den Listenern zurückgegebene Ergebnis nicht gut dokumentiert ist.

Antworten (1)

Aus Ihrem Codebeispiel werden die Ereignisse ordnungsgemäß ausgelöst.

Sie können Ereignisse auf einem Server verwenden, wenn Sie ein NodeJs ausführen. Vielleicht kann sich jemand anderes mit Zuverlässigkeitsproblemen einmischen.

Das Ereignis wird ausgelöst, wenn der Block abgebaut wird. Also, ja, das Ereignis wird ausgelöst, nachdem sich der Status geändert hat.

Randnotiz. Ein aufkommendes Muster besteht darin, Ihren Ereignissen das Präfix Log voranzustellen. Also nenne es event LogDeposit(uint a);.

Das stringifizierte Objekt gab Folgendes zurück:

{
    "logIndex": 0,
    "transaktionsindex": 0,
    "transactionHash": "0xa1a1e96217d05ca3f305ea051104da6de62c0df479d680494cc3e4dc013a846d",
    "blockHash": "0x923ede06e8027f07d239980b3d1502397e81958882a06008676647ad62c18e9d",
    "blockNummer": 504,
    "Adresse": "0x1c7dc63b49a32c4b6cbc9c1a0e816b574c00e2fa",
    "Typ": "abgebaut",
    "event": "Einzahlung",
    "Argumente": {
        "a": "1"
    }
}
Sie taten; Ich habe Browser Solidity verwendet, als ich diese Fehler erhalten habe, aber in einem privaten Testnetz, in dem sie verwendet werden, werden gethsie ausgelöst.