Wie könnte sich „ethereum block explorer“ sicher mit Geth verbinden, das bereits auf dem Hauptserver läuft?

Ich arbeite an einem privaten Ethereum-Netzwerk. Ich führe Ethereum Boot-Node und Ethereum Block ExplorerApp ( https://github.com/etherparty/explorer (Ein leichter Ethereum-Block-Explorer.) ) auf dem Hauptserver aus.

Innerhalb des Hauptservers, auf dem ich den Ethereum-Knoten betreibe, konnte ich mich im Browser mit dem verbinden Ethereum Block Explorervon localhost:8000:

Geben Sie hier die Bildbeschreibung ein

Aber von einem externen Knoten im Browser, wenn ich versuche, eine Verbindung von der IP-Adresse des Hauptservers herzustellen, wird < ip-address >:8000mir die folgende Fehlermeldung angezeigt. Der Hauptgrund für diese Fehlermeldung war " web3ist nicht verbunden"

Geben Sie hier die Bildbeschreibung ein

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
}

Wenn ich auf dem externen Knoten eine gethApp im Hintergrund ausführe, die bereits mit dem privaten Ethereum-Netzwerk verbunden ist, wird das Problem gelöst.

[F] Ist es auf dem externen Knoten möglich , eine Verbindung zu der App herzustellen, die bereits auf dem Hauptserver ausgeführt wird , ohne die gethApp im Hintergrund auszuführen? Wenn ja, gibt es einen sicheren Ansatz zum Ausführen mit auf dem Hauptserver?Ethereum Block Explorergethgeth--rpcaddr="localhost" --rpccorsdomain="*"

Vielen Dank für Ihre wertvolle Zeit und Hilfe.

Notiz:

=> So betreibe ich den Ethereum Node:

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

=> Zur Installation Ethereum Block Explorerhabe ich die Installationsanleitung auf https://github.com/etherparty/explorer befolgt .

[~$] 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

=> In der Datei package.json, die sich im Explorer-Ordner befindet: App wurde wie folgt gestartet:

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

Bitte beachten Sie, dass es nicht geholfen hat, als ich localhost in node'a IP-Adresse geändert habe:

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

Wenn ich also richtig verstanden habe, befindet sich der externe Knoten nicht im selben Netzwerk wie Ihr Hauptknoten, auf dem Sie ausgeführt werden Ethereum Block Explorer. Ich weiß, dass dies eine indirekte Lösung ist, aber wie wäre es, wenn Sie Ihr eigenes VPN verwenden und sie glauben lassen, dass es sich im selben Netzwerk befindet? Oder reicht vielleicht nur ein SSH-Tunnel?
Entschuldigung, wenn meine Erklärung unklar ist. Ja, der externe Knoten befindet sich nicht im selben Netzwerk wie mein Hauptknoten. Es könnte jeder sein, der den Link hat. Zum Beispiel: Wenn ich in den Ethereum Block Explorer für ETC „ etherscan.io “ eingetreten bin, muss ich gethden nicht ETHauf meinem lokalen Rechner ausführen und kann trotzdem alle Informationen auf der Website sehen.

Antworten (3)

!!Bitte beachten Sie, dass diese Lösung nur funktioniert, wenn sich der externe Knoten und der Hauptserver in derselben Netzwerkdomäne befinden!!

Unsicherer Ansatz:

Das Problem war: wie starte ich meinen RPC.

Führen Sie gethauf dem Hauptserver wie folgt aus:

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

oder

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

Aktualisieren Sie explorer/app/app.js wie folgt:

    //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, das ist sehr unsicher, Sie geben den RPC-Zugriff für alle frei. Wenn , wäre die wirkliche Lösung, RPC nur für die Webanwendung verfügbar zu machen, und diese Webanwendung sollte dem Betrachter Inhalte liefern. Die Architektur des Block Explorers selbst ist nicht dafür ausgelegt, als öffentlicher Dienst genutzt zu werden, sondern nur für einzelne Benutzer für private Aufgaben.
@Nulik Einverstanden. Aber warum gehen alle (?) Explorer, die ich sehe, davon aus, dass Sie NUR auf localhost laufen und RPC direkt von der Browserseite abfragen (und benötigen daher RPC auf 0.0.0.0, wenn Sie den Explorer öffentlich machen wollen?). Das ist ein ziemlich begrenztes Design. Es muss eine Methode geben, um RPC-Abfragen zuzulassen, aber 0.0.0.0/public auf RPC nicht zulassen zu müssen. Ich verstehe nur nicht, warum die alle so aufgebaut sind?
@bshea vielleicht, weil Blockchain öffentliche Daten sind und es kein Sicherheitsrisiko gibt, wenn Sie etwas veröffentlichen, von dem jeder bereits Kenntnis hat. Es besteht kein Sicherheitsrisiko, es sei denn, Sie legen Ihre Brieftaschen offen, dh das persönliche Modul mit entsperrten Brieftaschen, und führen Ihre eigenen Geldoperationen auf diesem Knoten aus.

Ich habe verwendet Docker, um dieses Problem zu überwinden. Docker-Installation . Von dieser Antwort auf diese Frage Wie kann ich den RPC-Server von Geth für externe Verbindungen verfügbar machen? , habe ich Dockerals Anwendungsserver verwendet, der tatsächlich in meiner Ethereum Node.

Ich habe die Installation für die Ethereum Block ExplorerApp befolgt.

Um das folgende Problem zu lösen (Curl: (56) Recv failure: Connection reset by peer)In Docker habe ich das Schlüsselwort „localhost“, das im Explorer-Ordner vorhanden ist, durch „0.0.0.0“ ersetzt): https://stackoverflow.com/a/27818259/2402577

Angenommen geth, es wird unter remotehost.remotedomain.tld ausgeführt

[~] 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

Fügen Sie die folgenden Zeilen in Dockerfile ein.

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

Dieser Teil wird nicht benötigt:

[~] 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

Jetzt können Sie die Ethereum Block ExplorerApp von einem externen Knoten mit host's_IP:port öffnen.

remotehost.remotedomain.tld:3002

Hilfreicher Link zum Kompilieren nodejsund docker: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

Genau wie bei allen anderen Antworten haben Sie lediglich dieselbe unsichere RPC-Zulassung eingefügt. 0.0.0.0 ist einfach hinzuzufügen. Es ist einfach, weil es völlig unsicher ist.

Wenn der externe Knoten Ihr vertrauenswürdiger Knoten ist, können Sie versuchen, SSH-Tunneling zu verwenden. Führen Sie ssh -L 8545:localhost:8545 username@main-server-ip-address auf dem Remote-Knoten aus und Sie erhalten geöffneten Port 8545 auf dem Remote-Knoten, der sicher (verschlüsselt) an main_server-ip-address:8545 weitergeleitet wird. Alle Verbindungen zu remote-node:8545 werden als Verbindungen zu main-server-ip-address:8545 von localhost interpretiert.

Um den Verbindungsprozess zu vereinfachen, können Sie den öffentlichen Schlüssel des Remote-Knotens zur Datei ~/.ssh/authorized_keys des Hauptservers hinzufügen, wie hier beschrieben https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh- Schlüssel--2

DIESER ANSATZ IST UNSICHER!!! Wenn Sie nur den RPC-Port auf Ihrem Hauptserver geöffnet haben möchten, können Sie auch ssh dafür verwenden. Führen Sie ssh -L main-server-external-ip-address:port-to-forward-rpc:localhost:8545 username@localhost auf Ihrem Hauptserver aus, und Sie erhalten einen geöffneten Port port-to-forward-rpc auf dem Hauptserver -externe IP-Adresse , auf die von überall aus zugegriffen werden kann. Alle Verbindungen zu diesem Port werden von geth als Verbindungen von localhost interpretiert. Danach können Sie verwenden

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

ohne Domänen-\Netzwerkzugriffsbeschränkungen

@Avatar, es war keine Zusammenfassung, es war eine klare Antwort. Leider habe ich den von dir genannten Link nicht gesehen. Wenn Sie sich den zweiten Teil der Antwort genauer ansehen, werden Sie feststellen, dass ich einen anderen Ansatz anbiete - um einen SSH-Tunnel lokal auf dem Server (nicht von Knoten zu Server) zu erstellen, um den Geth-RPC-Port an einen anderen Port weiterzuleiten, der von außen erreicht werden kann um die Einschränkungen zu überwinden, die in ethereum.stackexchange.com/a/10083/6041 erwähnt werden "!!Bitte beachten Sie, dass diese Lösung nur funktioniert, wenn sich der externe Knoten und der Hauptserver in derselben Netzwerkdomäne befinden!!"