So verbinden Sie sich von zwei lokalen Maschinen mit Ethereum mit Geth

Ich bin neu bei Ethereum und habe alles versucht, um Testnet von zwei lokalen Maschinenknoten zu verbinden. Ich habe versucht, zwei Konsolen auf einer einzigen Maschine von admin.addPeers (nodeUrl) auszuführen, und konnte eine Verbindung herstellen. Wenn ich mit demselben für verschiedene Maschinen mit derselben Netzwerk-ID versucht habe, wird die Peer-Anzahl als Null angezeigt. Bitte helfen Sie, dies zu lösen. vielen Dank im Voraus

Antworten (5)

Da Sie zwei Knoten auf zwei verschiedenen Computern ausführen, müssen Sie die IP-Adresse des Knotens angeben, während Sie eine Verbindung herstellen addPeer(enodeURI).

Ausführliche Anleitung:

  • Sie müssen auf jeder Maschine, auf der Sie einen Knoten starten möchten, dieselbe Genesis-Datei haben.

  • Alle Knoten sollten gleich sein--networkid

  • Das --rpcportund --portsollte für jede Geth-Instanz unterschiedlich sein.

  • Wenn Sie auf demselben Computer arbeiten, sollte jede Geth-Instanz unterschiedliche --datadir.

Geth-Instanzen starten:

Knoten 1:

geth --genesis path/to/genesis.json --datadir path/to/directory --networkid 1234 --port 30301 --rpcport 8101 console

Knoten 2:

geth --genesis path/to/genesis.json --datadir path/to/directory --networkid 1234 --port 30302 --rpcport 8102 console

--maxpeersSie können Befehle wie und hinzufügen, --nodiscoverwenn Sie möchten.

Suchen Sie nach dem Starten dieser Instanzen nach einer ähnlichen Meldung auf der Konsole:

I0829 13:30:07.347738   3987 backend.go:303] Successfully wrote genesis block. New genesis hash = 82b6159155c00fb0b420046012a02257a176ad5dcfce4be4a15da39c166518e2

Wenn dies der Fall ist, haben Sie die Nodes erfolgreich mit einer privaten Blockchain gestartet. Wenn Sie eine ähnliche Meldung wie sehen Warning: Wrote default ethereum genesis block, stimmt etwas nicht.

Verbindungsknoten:

Knoten 1: (auf der JavaScript-Konsole)

admin.nodeInfo.enode

Die Ausgabe wird in etwa so aussehen:

"enode://da97197a3335806658f17fdc167e943bd040fdf59ed882389d5f87b29f31362b12f13bd58438b7b5619497b54bab252a696cafc7cdd9696c4db1cacdb7e6a962@[::]:30301"

Beachten Sie, dass die Portnummer am Ende des URI 30301 ist.

Knoten 2:

Führen Sie denselben Befehl auf Knoten 2 aus und Sie erhalten am Ende eine ähnliche Ausgabe mit 30302:

"enode://47e61e304d802fb98403fbf877e1018d13044630a16eb9c15c1d0fb139d465e02d995acd239768f6ced04579d9639d8a75c73c30d7443a9d6d6146a44c8b5e7b@[::]:30302"

Um diese Knoten zu verbinden, finden Sie die IP-Adresse von Knoten 2 heraus. Da es sich um ein lokales Netzwerk handelt, sollte jeder Computer eine eindeutige private IP-Adresse haben. Bei Verwendung der addPeer(enodeURI)Funktion sollte das [::]in der enodeURI durch die IP-Adresse der Maschine ersetzt werden, auf der der Knoten ausgeführt wird. Jetzt auf Knoten 1:

admin.addPeer("enode://47e61e304d802fb98403fbf877e1018d13044630a16eb9c15c1d0fb139d465e02d995acd239768f6ced04579d9639d8a75c73c30d7443a9d6d6146a44c8b5e7b@10.0.0.123:30302") 

Nachdem dieser Befehl true zurückgibt , net.peerCountsollte der 1 zurückgeben und admin.peersdie Details des hinzugefügten/verbundenen Knotens zurückgeben. Überprüfen Sie vor dem Verbinden, ob auf beiden Knoten net.listeningwahr zurückgegeben wird .

Quellen:

Einrichten eines privaten Netzwerks oder lokalen Clusters

Verbinden mit dem Netzwerk

So erstellen Sie eine private Ethereum-Kette

--genesis ist nicht mehr gültig
@galahad, danke für die ausführliche Antwort. Ich weiß, dass dies die Antwort vom letzten Jahr ist und die Dinge sich geändert haben. Trotzdem frage ich Sie nach dem dritten Schritt, dh addPeer. Müssen wir die IP der Maschine erwähnen, wenn wir versuchen, auf derselben Maschine zu laufen? Und müssen beide Knoten minen, auch wenn sie dasselbe Netzwerk sind?

Rolands Antwort ist gut, aber Sie sollten bedenken, dass Geth (und alle bisherigen Ethereum) an dieselben Standardports gebunden sind, was bedeutet, dass Sie sie von ihren Standardeinstellungen ändern müssen, wenn Sie mehrere Instanzen auf demselben Host ausführen (z. B. 127.0.0.1). .

Es ist ziemlich einfach, einfach die Standardports für jede Instanz zu erhöhen und dann ein (Bash-)Skript zu erstellen, um sie unabhängig (als Hintergrundprozesse) auszuführen.

Wenn Sie mehr Unabhängigkeit zwischen den Geth-Instanzen wünschen, sollten Sie für jede ein separates Datenverzeichnis erstellen (ändern Sie das Befehlszeilenargument --datadir aus der anderen Antwort):

--datadir "~/privethnet/geth_client"
--datadir "~/privethnet/geth_bootstrap"
Kumpel, er sagte zwei Maschinen...
Zwei lokale Maschinen können auch auf virtuelle Hosts verweisen. Vielleicht kann er aufklären?
Danke Leute. Zwei lokale Maschinen bedeuten zwei Laptops, sagen wir mal.

Ein Beispiel-Setup für ein privates Netzwerk

Erstellen Sie eine Datei namens genesis.json mit folgendem Inhalt:

{
    "nonce": "0xdeadbeefdeadbeef",
    "timestamp": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x0",
    "gasLimit": "0x8000000",
    "difficulty": "0x400",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x3333333333333333333333333333333333333333",
    "alloc": {
    }
}

Führen Sie Folgendes aus:geth --datadir ./ init genesis.json

geth --identity "nodeA" --rpc --rpcport "8000" --rpccorsdomain "*" --datadir "~/privethnet/" --port "30303" --ipcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --rpcapi "db,eth,net,web3" --autodag --networkid 1900 --nat "any" console


geth --identity "nodeB" --rpc --rpcport "8000" --rpccorsdomain "*" --datadir "~/privethnet/" --port "30303" --ipcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --rpcapi "db,eth,net,web3" --autodag --networkid 1900 --nat "any" console

Fügen Sie den Peer mithilfe der URL des Peers hinzu:
Suchen Sie den Peernode aus dem Startprotokoll von geth0712 13:34:00.865021 p2p/discover/udp.go:217] Listening, enode:...

admin.addPeer(nodeURL)

Überprüfen Sie, ob ein Peer-Knoten hinzugefügt wurde:admin.peers

Beispiele für nodeURLS sind: Node A nodeURL:

enode://da97197a3335806658f17fdc167e943bd040fdf59ed882389d5f87b29f31362b12f13bd58438b7b5619497b54bab252a696cafc7cdd9696c4db1cacdb7e6a962@151.62.56.89:30303

Node B nodeURL:

enode://9d4687d7cfa8c2215d2f2b4278a3e0ab4bde22ab838dd203b234866d69405b4b704fce4a71638f8c66018ba187a3599c612267ac382589bb81131c7dc18ff251@151.62.56.89:30303
Danke .. Ich hatte das versucht und konnte auch die Peer-Zählung erhalten In der ersten Maschine und Mining von der zweiten Maschine ausführen, wird es nicht übertragen. Ich verstehe nicht, was der Fehler ist.

Ein Benutzer auf Github namens FleetingCloud hat ein nettes UI-Skript im Befehlsstil zum Einrichten von Ethereum in einem privaten Netzwerk zusammengestellt. Ich empfehle es sehr.

https://libraries.io/github/FleetingClouds/InitializeEthereumPrivateNetwork

Bearbeiten:

Führen Sie nach dem Klonen des Repos einfach das Skript initializeEthereumPrivateNetwork.sh aus. Es wird Sie dann fragen, wie Sie Ihr Netzwerk benennen möchten, die Verzeichnisse der Geth auf Root- und Client-Knoten usw.

Während dies die Frage theoretisch beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.

--genesis ist nicht mehr gültig. Sie müssen stattdessen init verwenden. Hier ist mein Code, den ich durch Schritt 1 ersetzt habe:

geth --identity "MyTestNode" --nodiscover --networkid 1999 --port 30301 -- rpcport 8101 --datadir /home/appo/geth/  init /home/appo/.json console

Sie können beliebige Flags und Ports festlegen, dies ist nur der Code, den ich auf meinem Computer ausgeführt habe.