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.
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.5
y 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:
geth
parámetros son necesarios para escuchar eventos en la red principal? También geth --ws --wsport=8546 --wsorigins="*" --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fast
funciona o para qué sirve el diff. parámetros, gracias?--networkid=1
(predeterminada). Sí, eso debería funcionar.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);
}
});
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.
miguel mota
carlom
Svante
Ramírez Saleem