Proveedor Infura web3 para Eventos (.get & .watch)

Estoy usando infura para conectarme a testnet/mainnet como mi proveedor web3 del lado del servidor.

Esto funciona para la mayoría de las solicitudes y operaciones, pero no parece funcionar para Eventos.

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

El código anterior se ejecuta localmente (conectándose a un host local: 8545 proveedor / geth) pero no se ejecuta si uso 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'));

¿Alguna sugerencia o alternativa para los proveedores de web3? Gracias.

Tener el mismo problema. ¿Ya encontraste una solución para esto?
Por el momento, lo configuré para usar el web3 del cliente (Metamask) para monitorear eventos y enviarlos al servidor cuando se detecten. Esto funciona para mis propósitos. La alternativa es configurar una VM en un servidor/AWS y ejecutar un nodo geth y usarlo para monitorear eventos. Eso es probablemente lo que haré a largo plazo.
¡Muchas gracias! Esta es la única forma que funcionó para mí para obtener todos los eventos, de las otras 5-6 formas que probé. Además, Infura admite WebSocket ahora, ¡sí! :)
Estoy usando web3 0.20.6 y estoy usando el siguiente código, pero no veo nada cuando se activa el evento, estoy usando nodejs e incluyo web3. ¿Alguien puede decirme por qué el evento no muestra nada, incluso traté de usar el método de observación, tampoco obtengo errores? var Web3 = requerir('web3'); web3 =new Web3(new Web3.providers.HttpProvider(" ropsten.infura.io/key" ) ContractInstance.ShippingEvent(función(error,resultado){ if(error) { console.log("Evento de envío:" + error) ; } else { console.log("Evento de envío: " + resultado); console.log("Evento de envío: " + resultado.args._shipper); console.log("Envío

Respuestas (4)

Infura actualmente no es compatible con WebSockets (requerido para eventos que usan Web3 v1; de lo contrario, obtiene el error "El proveedor actual no admite suscripciones" cuando usa infura como HttpProvider), por lo que debe ejecutar un nodo geth local que se conecta y sincroniza con la red.

Aquí habilitamos el indicador websocket y permitimos que cualquier origen se conecte al nodo geth local que se sincroniza con la red de prueba rinkeby:

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

Para comprobar el estado de sincronización:

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

Una vez que haya terminado de sincronizar, puede conectarse usando WebsocketProvider:

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

Ahora debería poder recibir eventos:

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

  console.log(event)
})

Probado esto con geth v1.6.5y web3 v1.0.0.

Actualización 11 de octubre de 2017:

Infura está experimentando con la compatibilidad con websocket. Puede solicitar acceso beta en este hilo de problemas de github:

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

¿Cuáles de los gethparámetros son necesarios para escuchar eventos en la red principal? También geth --ws --wsport=8546 --wsorigins="*" --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fastfunciona o para qué sirve el diff. parámetros, gracias?
@AndiGiga Para mainnet use la identificación de red 1, por ejemplo --networkid=1(predeterminada). Sí, eso debería funcionar.
@MiguelMota const proveedor = new Web3.providers.WebsocketProvider('wss://rinkeby.infura.io/ws/v3/560e70f3ebfc4f628a53f4143b9460fd'); const web3= new Web3(proveedor); Este código no me está recuperando las cuentas const account = await web3.eth.getAccounts();. ¿Tienes idea?
@Darey infura no proporciona administración de billetera, por lo que getAccounts() será una matriz vacía. Sin embargo, getAccounts() funcionará en su nodo local.
@MiguelMota Pero quería implementar el contrato en la red de prueba de rinkeby usando una de mis cuentas de metamask. Agregué mi código fuente aquí ethereum.stackexchange.com/q/68145/51276 donde pude obtener la cuenta usando el proveedor http. Gracias por la ayuda

He estado usando Infura con web3 1.0 en mainnet. Aquí está mi código, espero que ayude

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);
  }
});
Gracias, sí, infura agregó conexiones web en los últimos meses que ahora permiten conectarse a eventos.
Hola @maheshmurthy, mis eventos funcionan pero recibo la notificación: Error: el proveedor actual no admite suscripciones: HDWalletProvider. ¿Qué crees que podría causar esto?

P: ¿Conoce otros proveedores de web3? R: Sí, debería consultar QuickNode o Alchemy . No hemos usado QuickNode, así que no puedo hablar de su rendimiento. Alchemy ha sido mucho más rápido para nosotros y más confiable que Infura.

QuikNode.io funciona bien. Nodo ETH dedicado compatible con https:// y wss:// (websockets). Admite suscripciones a eventos y llamadas API txpool/queue; Clientes de Parity y Geth; MainNet/Ropsten/Rinkeby/Kovan también. Puede registrarse en el sitio web y tener un nodo ejecutándose en minutos.