Провайдер Infura web3 для событий (.get и .watch)

Я использую 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? Спасибо.

Имея такую ​​же проблему. Вы уже нашли решение для этого?
На данный момент я настроил его так, чтобы использовать клиентский web3 (Metamask) для отслеживания событий и отправки их на сервер при обнаружении. Это работает для моих целей. Альтернативой является настройка виртуальной машины на сервере/AWS, запуск узла geth и использование его для мониторинга событий. Это, вероятно, то, что я буду делать в долгосрочной перспективе.
Большое спасибо! Это единственный способ получить все события из 5-6 других способов, которые я пробовал. Кроме того, Infura теперь поддерживает WebSocket — ура! :)
Я использую web3 0.20.6 и использую следующий код, но я ничего не вижу, когда срабатывает событие, я использую nodejs и включаю web3. Может ли кто-нибудь сказать мне, почему событие ничего не показывает, я даже пытался использовать метод наблюдения, я тоже не получаю ошибок. var Web3 = требуется('web3'); web3 = новый Web3 (новый Web3.providers.HttpProvider (" ropsten.infura.io/key" ) ContractInstance.ShippingEvent (функция (ошибка, результат) { if (ошибка) { console.log ("Событие доставки:" + ошибка) ; } else { console.log("Событие доставки: " + результат); console.log("Событие доставки: " + result.args._shipper); console.log("Доставка

Ответы (4)

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:

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

Какие gethпараметры необходимы для прослушивания событий в основной сети? Также geth --ws --wsport=8546 --wsorigins="*" --rpc --rpcapi="personal,eth,network" --rpcport=8545 --fastработает или какая польза от diff. параметры, спасибо?
@AndiGiga Для основной сети используйте идентификатор сети 1, например --networkid=1(по умолчанию). Да, это должно работать.
@MiguelMota const provider = new Web3.providers.WebsocketProvider('wss://rinkeby.infura.io/ws/v3/560e70f3ebfc4f628a53f4143b9460fd'); const web3= новый Web3(поставщик); Этот код не возвращает мне учетные записи const account = await web3.eth.getAccounts();. У вас есть идея?
@Darey infura не обеспечивает управление кошельком, поэтому getAccounts() будет пустым массивом. Однако getAccounts() будет работать на вашем локальном узле.
@MiguelMota Но я хотел развернуть контракт в тестовой сети rinkeby, используя одну из моих учетных записей метамаски. Я добавил свой исходный код здесь ethereum.stackexchange.com/q/68145/51276 , где я смог получить учетную запись с помощью http-провайдера. Спасибо за помощь

Я использую 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);
  }
});
Спасибо, да, за последние несколько месяцев Infura добавила веб-сокеты, которые теперь позволяют подключаться к событиям.
Привет @maheshmurthy, мои события работают, но я получаю уведомление: Ошибка: Текущий провайдер не поддерживает подписки: HDWalletProvider. Как вы думаете, что может быть причиной этого?

В: Знаете ли вы о других провайдерах web3? A: Да, вы должны смотреть либо на QuickNode, либо на Alchemy . Мы не использовали QuickNode, поэтому я не могу говорить о его производительности. Алхимия оказалась для нас намного быстрее и надежнее, чем Инфура.

QuikNode.io работает хорошо. Выделенный узел ETH, поддерживающий как https://, так и wss:// (веб-сокеты). Поддерживает подписки на события и вызовы API txpool/queue; клиенты Parity и Geth; MainNet/Ropsten/Rinkeby/Kovan тоже. Можно зарегистрироваться на веб-сайте и запустить узел за считанные минуты.