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.
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 fromBlock
fü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.
Achala Dissanayake
web3.eth.subscribe(type [, options] [, callback]);
wie hier definiertSieg
Sieg