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 ).
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});
}
});
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" } }
geth
sie ausgelöst.
Xavier Leprêtre B9lab
Sebi
Xavier Leprêtre B9lab
event
Die 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.Sebi