🇺🇦

Fournisseur Infura web3 pour les événements (.get & .watch)

étiqueter: web3jsinfuraweb3-providers

J'utilise infura pour me connecter à testnet/mainnet en tant que fournisseur web3 côté serveur.

Cela fonctionne pour la plupart des demandes et des opérations, mais cela ne semble pas fonctionner pour les événements.

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);

Le code ci-dessus s'exécute localement (connexion à un hôte local:8545 provider / geth) mais ne s'exécute pas si j'utilise infura:

// 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'));

Des suggestions ou des alternatives pour les fournisseurs web3 ? Merci.

4 Réponses

Solution

Infura ne prend actuellement pas en charge les WebSockets (requis pour les événements utilisant Web3 v1, sinon vous obtenez l'erreur "Le fournisseur actuel ne prend pas en charge les abonnements" lorsque vous utilisez infura en tant que HttpProvider), vous devez donc exécuter un nœud geth local qui se connecte et se synchronise au réseau.

Ici, nous activons le drapeau websocket et permettons à toute origine de se connecter au nœud geth local qui se synchronise avec le testnet rinkeby:

geth --rinkeby --ws --wsport=8546 --wsorigins="*" --datadir=$HOME/.rinkeby --cache=512 --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fast --bootnodes=enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb[email protected]52.169.42.101:30303

Pour vérifier l'état de la synchronisation:

geth attach ipc:$HOME/.rinkeby/geth.ipc
> eth.syncing

Une fois la synchronisation terminée, vous pouvez vous connecter en utilisant WebsocketProvider :

const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'))

Vous devriez maintenant pouvoir recevoir des événements:

myContract.events.allEvents((error, event) => {
  if (error) {
    console.error(error)
    return false
  }

  console.log(event)
})

Testé avec geth v1.6.5 et web3 v1.0.0.

Mise à jour du 11 octobre 2017:

Infura expérimente la prise en charge des Websockets. Vous pouvez demander un accès bêta dans ce fil de discussion github:

https://github.com/INFURA/infura/problèmes/29

QuikNode.io fonctionne bien. Nœud ETH dédié prenant en charge à la fois https:// et wss:// (websockets). Prend en charge les abonnements aux événements et les appels API txpool/file d'attente ; Clients de Parité et Geth ; MainNet/Ropsten/Rinkeby/Kovan aussi. Peut s'inscrire sur le site Web et faire fonctionner le nœud en quelques minutes.

J'utilise Infura avec web3 1.0 sur le réseau principal. Voici mon code, j'espère que ça t'aidera

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);
  }
});

Q: Connaissez-vous d'autres fournisseurs web3 ? R: Oui, vous devriez regarder QuickNode ou Alchemy . Nous n'avons pas utilisé QuickNode, donc je ne peux pas parler de ses performances. Alchemy a été beaucoup plus rapide pour nous et plus fiable qu'Infura.