¿Cómo podría "ethereum block explorer" conectarse a geth que ya se está ejecutando en el servidor principal de forma segura?

Estoy trabajando en la red Ethereum privada. Ejecuto el nodo de arranque y la Ethereum Block Exploreraplicación de Ethereum ( https://github.com/etherparty/explorer (un explorador de bloques ligero de ethereum)) en el servidor principal.

Dentro del servidor principal donde ejecuto el nodo Ethereum, en el navegador podría conectarme Ethereum Block Explorerdesde localhost:8000:

ingrese la descripción de la imagen aquí

Pero desde un nodo externo en el navegador, cuando intento conectarme desde la dirección IP del servidor principal, < ip-address >:8000me encuentro con el siguiente mensaje de error. La razón principal de este mensaje de error fue " web3no está conectado"

ingrese la descripción de la imagen aquí

var eth_node_url = 'http://localhost:8545'; // TODO: remote URL
web3.setProvider(new web3.providers.HttpProvider(eth_node_url));

if(!web3.isConnected()) {
    $('#connectwarning').modal({keyboard:false,backdrop:'static'}) //enters here
    $('#connectwarning').modal('show') //enters here
}

En el nodo externo, si ejecuto gethuna aplicación en segundo plano que ya está conectada a la red privada de Ethereum, resuelve el problema.

[P] En el nodo externo sin ejecutar la gethaplicación en segundo plano, ¿es posible Ethereum Block Explorerconectarse a la gethaplicación que ya se está ejecutando en el servidor principal? En caso afirmativo, ¿existe un enfoque seguro como ejecutarlo gethen --rpcaddr="localhost" --rpccorsdomain="*"el servidor principal?

Gracias por su valioso tiempo y ayuda.

Nota:

=> La forma en que ejecuto el Nodo Ethereum:

geth --port 3000 --networkid 23422 --nodiscover --datadir="/home/MyEthereumEbloc" 
--rpc --rpcaddr="localhost" --rpccorsdomain="*" --maxpeers=6 --ipcapi 
"admin,eth,web3" --autodag

=> Para instalar Ethereum Block Explorer, he seguido la guía de instalación en https://github.com/etherparty/explorer .

[~$] git clone https://github.com/etherparty/explorer 
[~$] cd explorer
[~/explorer$] npm start

> EthereumExplorer@0.1.0 prestart /home/netlab/explorer
> npm install


> EthereumExplorer@0.1.0 postinstall /home/netlab/explorer
> bower install


> EthereumExplorer@0.1.0 start /home/netlab/explorer
> http-server ./app -a 79.123.177.145 -p 8000 -c-1

Starting up http-server, serving ./app on port: 8000

=> Dentro del archivo package.json que se encuentra en la carpeta del explorador: la aplicación se inició de la siguiente manera:

"start": "http-server ./app -a localhost -p 8000 -c-1"

Tenga en cuenta que cuando cambié localhost a la dirección IP del nodo, no ayudó:

"start": "http-server ./app -a <ip-address> -p 8000 -c-1"

Entonces, si entendí bien, el nodo externo no está en la misma red que su nodo principal, donde se está ejecutando Ethereum Block Explorer. Sé que esta es una solución indirecta, pero ¿qué hay de usar su propia VPN y dejar que piensen que están en la misma red? ¿O tal vez solo un túnel ssh puede ser suficiente?
Lo siento si mi explicación no es clara. Sí, el nodo externo no está en la misma red que mi nodo principal. Podría ser cualquiera que tenga el enlace. Por ejemplo: cuando entré en Ethereum Block Explorer para ETC " etherscan.io ", no estoy obligado a ejecutarlo gethen ETHmi máquina local y todavía puedo ver toda la información en el sitio web.

Respuestas (3)

¡¡Tenga en cuenta que esta solución solo funciona si el nodo externo y el servidor principal están en el mismo dominio de red!!

Enfoque inseguro:

El problema era: cómo empiezo mi RPC.

Ejecutar gethen el servidor principal de la siguiente manera:

> admin.startRPC("0.0.0.0", 8545, "*")
true

o

--rpc --rpcport 8545 --rpcaddr 0.0.0.0 --rpccorsdomain "*" --rpcapi "eth,web3"

Actualice explorer/app/app.js de la siguiente manera:

    //var eth_node_url = 'http://localhost:8545'; //commented out. 
    var eth_node_url = 'http://<ip-address of the main server>:8545';         
    web3.setProvider(new web3.providers.HttpProvider(eth_node_url));
AFAIK esto es muy inseguro, está exponiendo el acceso RPC a todos. Cuando , la solución real sería exponer RPC solo a la aplicación web y esta aplicación web debería entregar contenido al espectador. La arquitectura de Block Explorer en sí no está diseñada para usarse como un servicio público, solo para un solo usuario para tareas privadas.
@Nulik De acuerdo. Pero, ¿por qué todos (?) los exploradores que veo asumen que se ejecuta SOLAMENTE en localhost y consulta RPC directamente desde el lado del navegador (y, por lo tanto, necesita RPC en 0.0.0.0 si desea que el explorador sea público?). Ese es un diseño bastante limitado. Tiene que haber un método para permitir que se realice la consulta RPC, pero no tener que permitir 0.0.0.0/public en RPC. Simplemente no entiendo por qué todos están diseñados de esta manera.
@bshea tal vez porque blockchain es información pública y no hay riesgo de seguridad si publica algo de lo que todos ya tienen conocimiento. No hay riesgo de seguridad a menos que exponga sus billeteras, es decir, el módulo personal con billeteras desbloqueadas y ejecute sus propias operaciones monetarias en ese nodo.

He utilizado Dockerpara superar este problema. Instalación de Docker . De esta respuesta a esta pregunta ¿Cómo puedo exponer el servidor RPC de Geth a conexiones externas? , lo he usado Dockercomo servidor de aplicaciones, que en realidad se ejecuta dentro de mi Ethereum Node.

He seguido la instalación de la Ethereum Block Exploreraplicación.

Para superar el siguiente problema (curl: (56) Recv failure: Connection reset by peer)dentro de Docker, reemplacé la palabra clave "localhost" que existe en la carpeta del explorador con "0.0.0.0": https://stackoverflow.com/a/27818259/2402577

Suponga que gethse ejecuta en remotehost.remotedomain.tld

[~] git clone https://github.com/etherparty/explorer
[~] cd explorer
[~] dir="$PWD";
[~] find $dir -type f -exec sed -i 's/localhost/0.0.0.0/g' {} +
[~] emacs -nw  Dockerfile

Pegue las siguientes líneas en Dockerfile.

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8000
CMD [ "npm", "start" ]

-

[~] sudo docker build -t <your username>/node-web-app 
[~] sudo docker run -p 3002:8000 -d <your username>/node-web-app

Esta parte no es necesaria:

[~] sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
26c46398b20d        yo/node-web-app     "npm start"         7 seconds ago       Up 5 seconds        0.0.0.0:3002->8000/tcp   pedantic_knuth
[~] sudo docker exec -it 26c46398b20d /bin/bash
root@26c46398b20d:/usr/src/app# ssh -f -N -L 8545:localhost:8545 remoteUser@remotehost.remotedomain.tld

Ahora puede abrir la Ethereum Block Exploreraplicación desde un nodo externo utilizando host's_IP:port.

remotehost.remotedomain.tld:3002

Enlace útil para compilar nodejsy docker: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

Al igual que todas las otras respuestas, todo lo que ha hecho es poner el mismo permiso RPC inseguro. 0.0.0.0 es fácil de agregar. Es fácil porque es completamente inseguro.

Si el nodo externo es su nodo de confianza, puede intentar usar el túnel SSH. Ejecute ssh -L 8545:localhost:8545 nombredeusuario@dirección-ip-del-servidor-principal en el nodo remoto y se abrirá el puerto 8545 en el nodo remoto que se reenviará de forma segura (encriptada) a la dirección-ip-del-servidor-principal:8545. Todas las conexiones al nodo remoto: 8545 se interpretarán como conexiones a la dirección IP del servidor principal: 8545 desde localhost.

Para simplificar el proceso de conexión, puede agregar la clave pública del nodo remoto al archivo ~/.ssh/authorized_keys del servidor principal como se describe aquí https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh- llaves--2

¡¡¡ESTE ENFOQUE ES INSEGURO!!! Si solo desea tener abierto el puerto rpc en su servidor principal, también puede usar ssh para ello. Ejecute ssh -L main-server-external-ip-address:port-to-forward-rpc:localhost:8545 username@localhost en su servidor principal, y obtendrá el puerto abierto port -to-forward-rpc en el servidor principal -dirección IP externa a la que se puede acceder desde cualquier lugar. Todas las conexiones a este puerto serán interpretadas por geth como conexiones de localhost. Después de eso puedes usar

var eth_node_url = 'http://main-server-external-ip-address:port-to-forward-rpc '; web3.setProvider(new web3.providers.HttpProvider(eth_node_url));

sin ninguna limitación de acceso a dominio\red

No resuma las respuestas a las que se ha enfrentado en ethereum.stackexchange.com/a/3209/4575 @Alexey Barsuk
@Avatar, no fue un resumen, fue una respuesta clara. Lamentablemente no he visto el enlace que mencionas. Si observa más de cerca la segunda parte de la respuesta, verá que ofrezco un enfoque diferente: crear un túnel ssh localmente en el servidor (no de nodo a servidor) para reenviar el puerto geth rpc a otro puerto, al que se puede acceder desde el exterior para superar las limitaciones, mencionadas en ethereum.stackexchange.com/a/10083/6041 "¡¡Tenga en cuenta que esta solución solo funciona si el nodo externo y el servidor principal están en el mismo dominio de red!!"