Ich verwende Infura für die Verbindung zu Testnet/Mainnet als meinen serverseitigen Web3-Anbieter.
Dies funktioniert für die meisten Anfragen und Operationen, aber es scheint nicht für Ereignisse zu funktionieren.
const allEvents = (event, callback) =>
event({}, { fromBlock: 0, toBlock: 'latest' }).get((error, results) => {
if (error) return callback(error);
results.forEach(result => callback(null, result));
event().watch(callback);
});
allEvents(contractInstance.Event, eventCallback);
Der obige Code wird lokal ausgeführt (Verbindung zu einem localhost:8545-Anbieter / geth), wird jedoch nicht ausgeführt, wenn ich infura verwende:
// THIS DOES NOT WORK:
const web3Url = `https://ropsten.infura.io/${infuraKey}`;
const web3 = new Web3(new Web3.providers.HttpProvider(web3Url));
// THIS WORKS:
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
Irgendwelche Vorschläge oder Alternativen für Web3-Anbieter? Vielen Dank.
Infura unterstützt derzeit keine WebSockets (erforderlich für Veranstaltungen mit Web3 v1, sonst erhalten Sie den Fehler "Der aktuelle Anbieter unterstützt keine Abonnements", wenn Sie infura als HttpProvider verwenden). Sie müssen also einen lokalen Geth-Knoten ausführen, der dies tut verbindet und synchronisiert sich mit dem Netzwerk.
Hier aktivieren wir das Websocket-Flag und erlauben jedem Ursprung, sich mit dem lokalen Geth-Knoten zu verbinden, der mit dem Rinkeby-Testnetz synchronisiert wird:
geth --rinkeby --ws --wsport=8546 --wsorigins="*" --datadir=$HOME/.rinkeby --cache=512 --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fast --bootnodes=enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303
So überprüfen Sie den Synchronisierungsstatus:
geth attach ipc:$HOME/.rinkeby/geth.ipc
> eth.syncing
Sobald die Synchronisierung abgeschlossen ist, können Sie eine Verbindung herstellen, indem Sie Folgendes verwenden WebsocketProvider
:
const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'))
Sie sollten jetzt Ereignisse empfangen können:
myContract.events.allEvents((error, event) => {
if (error) {
console.error(error)
return false
}
console.log(event)
})
Getestet wurde dies mit geth v1.6.5
und web3 v1.0.0
.
Aktualisierung 11.10.2017:
Infura experimentiert mit der Websocket-Unterstützung. Sie können in diesem Github-Issue-Thread um Beta-Zugriff bitten:
geth
Parameter sind erforderlich, um Ereignisse im Mainnet abzuhören? Funktioniert geth --ws --wsport=8546 --wsorigins="*" --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fast
auch oder was nützen die diff. Parameter, danke?--networkid=1
(Standard). Ja das sollte funktionieren.Ich habe Infura mit web3 1.0 im Mainnet verwendet. Hier ist mein Code, hoffe es hilft
var Web3 = require('web3')
var request = require('request');
var contract = require('truffle-contract')
var zastrin_pay_artifacts = require('./build/contracts/ZastrinPay.json')
var ws_provider = 'wss://mainnet.infura.io/ws'
var web3 = new Web3(new Web3.providers.WebsocketProvider(ws_provider))
var ZastrinPay = contract(zastrin_pay_artifacts);
var econtract = new web3.eth.Contract(ZastrinPay.abi, '<address>');
console.log("Starting listner ....");
newPaymentEvent = econtract.events.NewPayment({fromBlock: 5424000, address: '<address>', toBlock: 'latest'}, function(error, result){
if (result !== undefined) {
var args = result.returnValues;
args["_txn"] = result.transactionHash;
console.log(args);
}
});
QuikNode.io funktioniert gut. Dedizierter ETH-Knoten, der sowohl https:// als auch wss:// (Websockets) unterstützt. Unterstützt Ereignisabonnements und txpool/queue-API-Aufrufe; Paritäts- und Geth-Clients; MainNet/Ropsten/Rinkeby/Kovan auch. Kann sich auf der Website anmelden und den Knoten in wenigen Minuten ausführen.
Miguel Mota
Carlolm
Swante
Rameez Saleem