Infura Web3-Provider für Events (.get & .watch)

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.

Habe das gleiche Problem. Hast du dafür schon eine Lösung gefunden?
Im Moment habe ich es tatsächlich so eingerichtet, dass ich web3 (Metamask) des Clients verwende, um Ereignisse zu überwachen und sie an den Server zu senden, wenn sie erkannt werden. Das funktioniert für meine Zwecke. Die Alternative besteht darin, eine VM auf einem Server/AWS einzurichten und einen Geth-Knoten auszuführen und diesen zur Überwachung von Ereignissen zu verwenden. Das werde ich wahrscheinlich längerfristig machen.
Ich danke dir sehr! Dies ist der einzige Weg, der für mich funktioniert hat, um alle Ereignisse zu erhalten, von 5-6 anderen Wegen, die ich versucht habe. Außerdem unterstützt Infura jetzt WebSocket - yay! :)
Ich verwende web3 0.20.6 und den folgenden Code, aber ich sehe nichts, wenn das Ereignis ausgelöst wird, ich verwende nodejs und schließe web3 ein. Kann mir jemand sagen, warum das Ereignis nichts anzeigt, ich habe sogar versucht, die Watch-Methode zu verwenden, ich bekomme auch keine Fehler. var Web3 = require('web3'); web3 =neues Web3(neues Web3.providers.HttpProvider(" ropsten.infura.io/key" ) ContractInstance.ShippingEvent(function(error,result){ if(error) { console.log("Shipping Event :" + error) ; } else { console.log("Versandereignis: " + Ergebnis); console.log("Versandereignis: " + result.args._shipper); console.log("Versand

Antworten (4)

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.5und 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:

https://github.com/INFURA/infura/issues/29

Welche der gethParameter sind erforderlich, um Ereignisse im Mainnet abzuhören? Funktioniert geth --ws --wsport=8546 --wsorigins="*" --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fastauch oder was nützen die diff. Parameter, danke?
@AndiGiga Verwenden Sie für das Hauptnetz die Netzwerk-ID 1, z. B. --networkid=1(Standard). Ja das sollte funktionieren.
@MiguelMota const provider = new Web3.providers.WebsocketProvider('wss://rinkeby.infura.io/ws/v3/560e70f3ebfc4f628a53f4143b9460fd'); const web3= neues Web3(Provider); Dieser Code gibt mir die Konten nicht zurück const accounts = await web3.eth.getAccounts();. Hast du eine Idee?
@Darey infura bietet keine Brieftaschenverwaltung, daher ist getAccounts() ein leeres Array. getAccounts() funktioniert jedoch auf Ihrem lokalen Knoten.
@MiguelMota Aber ich wollte den Vertrag mit einem meiner Metamask-Konten im Rinkeby-Testnetzwerk bereitstellen. Ich habe meinen Quellcode hier ethereum.stackexchange.com/q/68145/51276 hinzugefügt , wo ich das Konto über den http-Anbieter erhalten konnte. Danke für die Hilfe

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);
  }
});
Danke, ja, infura hat in den letzten Monaten Web-Sockets hinzugefügt, die jetzt die Verbindung zu Ereignissen ermöglichen
Hallo @maheshmurthy, meine Events funktionieren, aber ich erhalte die Benachrichtigung: Fehler: Der aktuelle Anbieter unterstützt keine Abonnements: HDWalletProvider. Was könnte Ihrer Meinung nach die Ursache sein?

F: Kennen Sie andere web3-Anbieter? A: Ja, Sie sollten sich entweder QuickNode oder Alchemy ansehen . Wir haben QuickNode nicht verwendet, daher kann ich nichts zu seiner Leistung sagen. Alchemy war für uns viel schneller und zuverlässiger als Infura.

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.