Я использую:
Первый вопрос - можно web3-providers-ws
ли использовать с web3
v0.20.*
?
Второй вопрос (проблема) - я получаю сообщение об ошибке, когда, возможно, пытаюсь отправить транзакцию (чтение и просмотр событий через этого провайдера совершенно нормально).
Запрос на вытягивание: https://github.com/ethereum-alarm-clock/timenode-core/pull/146
E2E-тесты рабочего HTTP-провайдера:
https://travis-ci.org/ethereum-alarm-clock/timenode-core/jobs/406823597
Неудачные тесты E2E провайдера WS:
https://travis-ci.org/ethereum-alarm-clock/timenode-core/jobs/406823603
Фактическая ошибка:
5 passing (4s)
3 failing
1) ScheduleTx
schedules a basic transaction:
TypeError: Cannot set property 'method' of undefined
at WebsocketProvider._addResponseCallback (node_modules/web3-providers-ws/src/index.js:197:39)
at WebsocketProvider.send (node_modules/web3-providers-ws/src/index.js:252:10)
at RequestManager.send (node_modules/web3/lib/web3/requestmanager.js:58:32)
at Eth.get [as accounts] (node_modules/web3/lib/web3/property.js:107:62)
at Object.<anonymous> (test/e2e/TestScheduleTx.ts:75:34)
at Generator.next (<anonymous>)
at fulfilled (test/e2e/TestScheduleTx.ts:4:58)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
Единственная разница между поставщиком HTTP и поставщиком WS заключается в использовании ws://localhost:5454
вместо http://localhost:8545
. RPC, с которым я говорю, это ganache-cli 6.1.6.
Убедитесь, что вы ganache-cli@beta
установили
Вы должны взломать send
и sendAsync
решить проблему при настройке провайдера.
так:
export const setProvider = (provider: any) =>
Contracts.concat(HumanFriendlyToken).forEach((contract) => {
contract.setProvider(provider)
if (typeof contract.currentProvider.sendAsync !== "function") {
contract.currentProvider.sendAsync = function() {
return contract.currentProvider.send.apply(contract.currentProvider, arguments)
}
}
})
^ Удостоверьтесь, что НЕ используете функцию стрелки () => выше, так как она привязывает это к области, а нам это не нужно.
Должно работать после этого
Знаете ли вы, что API для RPC и WS отличается? Не уверен, поддерживает ли это ганаш, с «нормальным» гетом нужно запускать как geth --ws
. Это свяжет API веб-сокета с портом 8546
по умолчанию.