Conexión al proveedor web3 alojado desde el backend de NodeJS

Estoy usando estas instrucciones de etherchain . Aquí hay una pregunta similar ( parece duplicada, pero no lo es ). La solución provista allí no funciona para mí, porque no tengo un cliente ethereum local para conectarme. Quiero usar uno proporcionado por Etherchain .

const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider("http://rpc.ethapi.org:8545"));
web3.eth.getBlock("latest", (error, result) => {
  console.log('error:', error);
  console.log('results', result);
});

Error:

Error: Invalid JSON RPC response: ""
   at Object.InvalidResponse (/home/manid/Рабочий стол/Pogovorim/NODE_SERVER/node_modules/web3/lib/web3/errors.js:35:16)
    at XMLHttpRequest.request.onreadystatechange (/home/manid/Рабочий стол/Pogovorim/NODE_SERVER/node_modules/web3/lib/web3/httpprovider.js:116:32)
    at XMLHttpRequestEventTarget.dispatchEvent (/home/manid/Рабочий стол/Pogovorim/NODE_SERVER/node_modules/xhr2/lib/xhr2.js:64:18)
    at XMLHttpRequest._setReadyState (/home/manid/Рабочий стол/Pogovorim/NODE_SERVER/node_modules/xhr2/lib/xhr2.js:354:12)
    at XMLHttpRequest._onHttpRequestError (/home/manid/Рабочий стол/Pogovorim/NODE_SERVER/node_modules/xhr2/lib/xhr2.js:544:12)
    at ClientRequest.<anonymous> (/home/manid/Рабочий стол/Pogovorim/NODE_SERVER/node_modules/xhr2/lib/xhr2.js:414:24)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at Socket.socketErrorListener (_http_client.js:309:9)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at emitErrorNT (net.js:1281:8)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

¿Qué me estoy perdiendo?

Tu solución probablemente esté aquí. ethereum.stackexchange.com/questions/2080/…
@tayvano, gracias! Esa solución no funciona para mí, porque me estoy conectando a un host remoto y la solución provista allí es para la conexión al nodo geth que se ejecuta en la máquina local.

Respuestas (2)

he reemplazado

const web3 = new Web3(new Web3.providers.HttpProvider("http://rpc.ethapi.org:8545"));

con:

const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/TOKEN"));

y todo funciona

Esto https://ropsten.infura.io/TOKENme fue dado después de registrarme en infura.io

Parece que rpc.ethapi.orgestá caído: isup.me/rpc.ethapi.org
Intenté lo que sugirió para conectarme a ropsten pero aparece un error Error: respuesta JSON RPC no válida: "" en Object.module.exports.InvalidResponse (/Blockchain/node_modules/web3/lib/web3/errors.js:35: 16) en HttpProvider.send (/Blockchain/node_modules/web3/lib/web3/httpprovider.js:91:22) en RequestManager.send (/Blockchain/node_modules/web3/lib/web3/requestmanager.js:58:32) en Eth.send [como sendTransaction] (/Blockchain/node_modules/web3/lib/web3/method.js:145:58) en SolidityFunction.sendTransaction (/Blockchain/node_modules/web3/lib/web3/function.js:148: 26) en SolidityFunction.execute (/Blo
Creo que te refieres a ropsten.infura.io/[API_KEY] ? para evitar la confusión con el contrato inteligente token....

Debe tener cuidado al usar Infura porque puede transmitirle información incorrecta. Infura está diseñado con múltiples nodos detrás de un balanceador de carga. Todos estos nodos no están sincronizados, por lo que puede recibir información de nodos que contienen bloques obsoletos o nodos que no están sincronizados con el bloque más reciente.

Solíamos usar Infura, lo cual fue excelente porque es gratuito; sin embargo, resultó en muchas horas de trabajo de ingeniería para nosotros, ya que tuvimos que depurar las respuestas con datos inconsistentes. Cambiamos a Alchemy y deseamos haberlo hecho antes. Es un servicio pago, sin embargo, vale cada centavo.