Peer-Erkennung funktioniert nicht im privaten Netzwerk

Ich führe 3 Knoten mit dem folgenden Befehl aus:

geth --verbosity 4 --autodag --nat any --genesis /opt/blockchain/genesis.json \
     --datadir /opt/blockchain/data --networkid 4828 --port 30303 --rpc \
     --rpcaddr 10.48.247.25 --rpcport 8545 --rpcapi db,eth,net,web3,admin \
     --rpccorsdomain '*' --fast --mine --ipcdisable

Das genesis.json fileist für jeden Knoten gleich (ich habe sie sicherheitshalber mit einer Prüfsumme versehen).

Was passiert, ist, dass sich die Knoten nicht alleine finden können, ich muss sie manuell verbinden throw admin.addPeer.

Um es zu testen, habe ich eine Intervallschleife in der Konsole erstellt, um admin.peersalle 1 Sekunde zu drucken:

var interval = setInterval(function(){console.log(admin.peers)}, 1000);

Wenn Sie Knoten 1mit Knoten verbinden 2( 1--2), verbinden sie sich weiterhin und trennen sich voneinander. Aber der Knoten 3kann sich mit keinem von ihnen verbinden.

Warum passiert das?

Antworten (1)

Jede der Geth-Instanzen muss mindestens eine andere Instanz mit einer Verbindung zum Rest Ihres privaten Netzwerks erkennen.

Sie könnten eine (oder mehrere) Ihrer Geth-Instanzen als Bootnode benennen , mit dem sich alle anderen Instanzen zuerst verbinden, um andere Peers in Ihrem privaten Netzwerk zu finden. Um den Bootnode anzugeben, mit dem sich die Nicht-Bootnode-Instanzen anfänglich verbinden sollen, verwenden Sie den folgenden Befehlszeilenparameter (von https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network#connecting-to -das-netzwerk ) :

geth --bootnodes "enode://pubkey1@ip1:port1 [enode://pubkey2@ip2:port2 [enode://pubkey3@ip3:port3]]"

Sie können alternativ einen (oder mehrere) der Knoten als statischen Knoten benennen, mit dem sich andere Peers immer verbinden (von https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network#static -nodes ), indem Sie die Datei /static-nodes.jsonfür jede Geth-Instanz mit folgendem Inhalt hinzufügen:

[
  "enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",
  "enode://pubkey@ip:port"
]

Denken Sie daran, das Komma ',' zu entfernen, wenn Sie nur eine Geth-Instanz in Ihrer Datei static-nodes.json haben ( Kann jemand helfen, zwei Geth-Clients auf derselben Box und demselben Netzwerk auszuführen? ).

Es gibt also im Grunde keine Möglichkeit, einen Knoten einfach mit einem Netzwerk zu verbinden und er beginnt automatisch, andere Knoten zu pingen, um den Verlauf zu erhalten?
Im Gegensatz zu UDP, wo Sie einen Ping senden können (und nicht über das Internet funktionieren), erfordert das TCP-Protokoll einige Startadressen und Ports. Es gibt ein paar ip:ports, die im Quellcode fest codiert sind, mit denen alle Ethereum-Knoten im Live-Netzwerk prüfen - die Bootnodes.