Я использую infura для подключения к testnet/mainnet в качестве моего провайдера web3 на стороне сервера.
Это работает для большинства запросов и операций, но, похоже, не работает для событий.
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);
Приведенный выше код запускается локально (подключение к провайдеру / geth localhost:8545), но не запускается, если я использую 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'));
Любые предложения или альтернативы для провайдеров web3? Спасибо.
Infura в настоящее время не поддерживает WebSockets (требуется для событий, использующих Web3 v1, иначе вы получите сообщение об ошибке «Текущий провайдер не поддерживает подписки» при использовании infura в качестве HttpProvider), поэтому вам нужно запустить локальный узел geth, который подключается и синхронизируется с сетью.
Здесь мы включаем флаг websocket и разрешаем любому источнику подключаться к локальному узлу geth, который синхронизируется с тестовой сетью 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
Чтобы проверить статус синхронизации:
geth attach ipc:$HOME/.rinkeby/geth.ipc
> eth.syncing
После завершения синхронизации вы можете подключиться с помощью WebsocketProvider
:
const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'))
Теперь вы должны иметь возможность получать события:
myContract.events.allEvents((error, event) => {
if (error) {
console.error(error)
return false
}
console.log(event)
})
Протестировано с помощью geth v1.6.5
и web3 v1.0.0
.
Обновление от 11 октября 2017 г.:
Infura экспериментирует с поддержкой веб-сокетов. Вы можете запросить доступ к бета-версии в этой теме github:
geth
параметры необходимы для прослушивания событий в основной сети? Также geth --ws --wsport=8546 --wsorigins="*" --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fast
работает или какая польза от diff. параметры, спасибо?--networkid=1
(по умолчанию). Да, это должно работать.Я использую Infura с web3 1.0 в основной сети. Вот мой код, надеюсь поможет
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);
}
});
В: Знаете ли вы о других провайдерах web3? A: Да, вы должны смотреть либо на QuickNode, либо на Alchemy . Мы не использовали QuickNode, поэтому я не могу говорить о его производительности. Алхимия оказалась для нас намного быстрее и надежнее, чем Инфура.
QuikNode.io работает хорошо. Выделенный узел ETH, поддерживающий как https://, так и wss:// (веб-сокеты). Поддерживает подписки на события и вызовы API txpool/queue; клиенты Parity и Geth; MainNet/Ropsten/Rinkeby/Kovan тоже. Можно зарегистрироваться на веб-сайте и запустить узел за считанные минуты.
Мигель Мота
Карлолм
Сванте
Рамиз Салим