RPC с удаленным узлом

Я знаю, что этот вопрос задавался так много раз. Но я не смог решить свою проблему.

Я пытаюсь подключиться к удаленному узлу, расположенному на сервере.

На моем сервере работает geth на rinkeby, и RPC должен быть включен благодаря этой команде:

admin.startRPC("0.0.0.0", 8545, "*", "web3,db,net,eth")

В моем коде (NodeJS) у меня есть следующее:

function getNode(callback) {
    var web3;
    console.log(web3);
    web3 = new Web3(new Web3.providers.HttpProvider("https://X.X.X.X:8545"));
    console.log(web3);
    if (web3 != null) {
        console.log("GOT WEB3");
        callback(null, web3);
    } else {
        console.log("did not get web3");
        callback("ERROR", web3);
    }
}

Переменная web3 не определена в первом журнале и возвращает объект после того, как я получаю поставщика HTTP.

Однако у меня есть эта ошибка в моей консоли:

Ошибка: неверный ответ JSON RPC: "" в Object.InvalidResponse (D:\node_modules\web3\lib\web3\errors.js:38:16) в XMLHttpRequest.request.onreadystatechange (D:\node_modules\web3\lib\web3 \httpprovider.js:119:24)

Что я сделал не так?

Изменить: TCP и UDP открыты на порту 8545.

ОБНОВЛЕНИЕ 1

Текущая команда для запуска geth:

geth --rinkeby console -rpc -rpcaddr "0.0.0.0" --rpccorsdomain "*"

Текущий код NodeJS:

function getNode(callback) {
    var web3 = new Web3();
    web3.setProvider(new web3.providers.HttpProvider("https://server_external_ip:8545/"), function(error, result) {
        if (error) {
            console.log(error);
            callback("ERROR", web3);
        } else {
            console.log(web3.isConnected());
            callback(null, web3);
        }
    });
}

Вот что мне дает netstat:

tcp6       0      0 :::8545                 :::*                    LISTEN      3565/geth 

Результат: serverless дает мне тайм-аут. Если тайм-аут не указан, он работает бесконечно, ничего не получая.

какая версия у Web3вас requireв коде?
Мне нужна бета-версия 1.0.0.26 @ValidityLabs-Sebastian

Ответы (1)

Вам нужно заставить geth прослушивать IP-адрес, с которого ваш сервер доступен извне:

admin.startRPC(<external ip address>, 8545, "*", "web3,db,net,eth")

Если вы укажете локальный хост, geth будет принимать только локальные соединения, т.е. соединения, исходящие с той же машины, но не с удаленной.

Имеет смысл. Но он возвращает этоError: listen tcp MY.IP.IS.HERE:8545: bind: cannot assign requested address
Похоже, порт уже используется каким-то сервером. Вы проверили, например, с lsof -i TCP| fgrep LISTEN(в Linux)?
Это дает только следующее: geth 2809 myname 33u IPv6 47912 0t0 TCP *:30303 (LISTEN)Та же ошибка для случайных портов
Только что проверил сообщение об ошибке. Дело не в порте, а в адресе. Вы уверены в IP-адресе? Если вы используете виртуальную машину в облаке, у виртуальной машины обычно есть внутренний и внешний IP-адреса.
Пробовал с внешним адресом и внутренним. Работал только внутренний. Но когда я пытаюсь отправить запрос, у меня все равно возникает та же ошибка, что и в вопросе.
Да, вы получите ошибку с внутренним адресом. Вам действительно нужно установить geth на внешний адрес. Отсюда трудно сказать, в чем причина, скорее похоже на проблему с конфигурацией сервера. Я бы проверил, есть ли брандмауэр, который блокирует прослушивание
Но я не понимаю. если я укажу «0.0.0.0», он должен прослушивать каждый интерфейс моей машины. Так что это должно работать (даже если не защищено)
Ну, с текущей конфигурацией он просто загружается бесконечно ... (на моем сервере не установлено время ожидания, которое запрашивает соединение)
Привет, немного поздно. Даже ваше решение работает, я хочу запустить rpc при запуске geth, без необходимости делать это вручную. Но использование флагов просто не работает (проверьте вопрос о флагах), в каком бы порядке я их ни ставил.
Конечно нет, так как варианты идут с двумя знаками минус. Попробуйте --rpc и --rpcaddr вместо -rpc и -rpcaddr
Уже пробовал, тоже самое :С
он говорит:Error: HTTP server already running on 0.0.0.0:8545