Ошибка web3 json rpc при попытке транзакции

Мы используем web3 для подключения к тестовой сети ethereum rinkeby. При этом через geth, через localhost, с помощью следующей команды web3:

var web3 = new Web3('http://localhost:8545');

Мы не получаем ошибок. Мы используем эту команду для запуска geth:

geth --rinkeby --rpc --rpcapi="personal,eth,network,web3,net" --ipcpath "~/Library/Ethereum/geth.ipc"

Однако, когда мы пытаемся использовать тестовую сеть rinkeby напрямую:

var web3 = new Web3('https://rinkeby.infura.io/');

Получаем такую ​​ошибку:

Error: Invalid JSON RPC response: ""
   at Object.InvalidResponse (errors.js:42)
   at XMLHttpRequest.request.onreadystatechange (index.js:73)
   at XMLHttpRequest.dispatchEvent (event-target.js:172)
   at XMLHttpRequest.setReadyState (XMLHttpRequest.js:546)
   at XMLHttpRequest.__didCompleteResponse (XMLHttpRequest.js:387)
   at XMLHttpRequest.js:493
   at RCTDeviceEventEmitter.emit (EventEmitter.js:181)
   at MessageQueue.__callFunction (MessageQueue.js:353)
   at MessageQueue.js:118
   at MessageQueue.__guardSafe (MessageQueue.js:316)

Большинство операций выполняется в обеих сетях, но .send() вызовы не работают при прямом подключении к сети rinkeby.

Мы думаем, что это проблема аутентификации, поскольку успешно выполняются другие команды, не выполняющие транзакции. Однако мы попытались использовать HDWalletProvider, и ни одна из наших учетных записей, созданных с помощью geth, не имеет мнемоники.

Будем признательны за любые советы или шаги по устранению неполадок. Спасибо


person rofls    schedule 02.04.2018    source источник
comment
На всякий случай, вы также передаете свой ключ API? var web3 = new Web3('https://rinkeby.infura.io/API_KEY');   -  person Adam Kipnis    schedule 03.04.2018
comment
Ну, раньше не было, спасибо :) Но мы добавили это и получили те же результаты. Мы также попробовали сделать: web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby.infura.io/API_KEY')); и получили то же сообщение   -  person rofls    schedule 03.04.2018
comment
Ага, похоже, нам следует использовать https://api-rinkeby.etherscan.io/ для вызовов API! :)   -  person rofls    schedule 03.04.2018
comment
Я не уверен, что понимаю второй комментарий. Вы говорите о двух разных API. Один для Infura, а другой для Etherscan. Infura требует, чтобы вы создали ключ API и добавили его в конец URL-адреса. Если вы по-прежнему получаете сообщение об ошибке, значит, у вас есть и другая проблема. Имейте в виду, что у вас нет доступа к тому же набору библиотек RPC API через Infura, который вы указали в Geth, поэтому ваши функциональные возможности будут зависеть от того, что вы пытаетесь сделать.   -  person Adam Kipnis    schedule 03.04.2018
comment
Наконец понял это. Что ж, теперь мы вернулись к правильному API, с ключом API от infura, но он по-прежнему дает ту же ошибку json RPC.   -  person rofls    schedule 03.04.2018
comment
Я предполагаю, что одна из возможностей заключается в том, что API_KEY еще не активирован, поскольку мы только что зарегистрировались около 10 минут назад.   -  person rofls    schedule 03.04.2018
comment
Ваш ключ API не займет много времени, чтобы заработать. Если у вас все еще возникают проблемы, обновите свой пост, добавив в него больше кода, иллюстрирующего, что вы пытаетесь сделать на клиенте, и соответствующий код контракта, и я посмотрю, смогу ли я оказать некоторую помощь.   -  person Adam Kipnis    schedule 03.04.2018
comment
Конечно, на данный момент все это с открытым исходным кодом. Итак: github.com/r0fls/fig-lotto/ blob / master / App.js # L39-L40 И github.com/r0fls/fig-lotto/blob/master/App.js#L55 Это вызовы, которые не работают при использовании URL-адреса rinkeby. Оба они возвращают неверную ошибку JSON RPC. Не волнуйтесь, этот пароль предназначен только для тестовой сети, поэтому нас это не волнует. Очевидно, что мы не будем хранить в репо какие-либо действительно конфиденциальные данные ... наверное, не следовало помещать их туда, ну да ладно.   -  person rofls    schedule 03.04.2018
comment
@AdamKipnis, если вам нужно, чтобы я объяснил конкретные моменты в коде или что-то еще, дайте мне знать.   -  person rofls    schedule 03.04.2018


Ответы (1)


Сделки должны быть подписаны. Когда вы отправляете транзакцию через локальный узел geth, он знает закрытый ключ, соответствующий адресу, с которого вы отправляете транзакцию, поэтому он может подписать транзакцию за вас (как только вы разблокируете учетную запись).

Публичный узел, такой как Infura (к счастью!), Не знает вашего закрытого ключа, поэтому он не может подписывать транзакции за вас. Вам нужно будет подписать их локально, а затем отправить с помощью sendSignedTransaction.

person user94559    schedule 03.04.2018
comment
Ага, похоже, это была проблема. Спасибо! - person rofls; 03.04.2018
comment
что произойдет, если кто-то знает URL-адрес json rpc geth и адрес учетной записи? Теоретически этот человек может подписать транзакцию и отправить им эфир, верно? Как же тогда этого не допустить? - person Nathan Aw; 31.07.2018
comment
@NathanAw Комментарии - неподходящее место, чтобы задавать новые вопросы. - person user94559; 31.07.2018