So erhalten Sie Knoten im lokalen privaten Geth-Netzwerk, um Peers VON IHREN PEERS zu entdecken

Ich arbeite an einer privaten Blockchain, die aus 4 Knoten besteht, die auf verschiedenen Ports laufen.

Ich versuche, jeden Knoten dazu zu bringen, seine Verbindungen mit seinen Peers zu kommunizieren, damit das Netzwerk vollständig verbunden ist (jeder Knoten hat jeden anderen Knoten als Peer). Knoten entdecken jedoch nicht die Peers ihrer Peers.

Knoten 1 wird als bezeichnet bootstrap node, und die Knoten 2 und 3 verbinden sich beim Start damit. Knoten 1 hat jedoch die Knoten 2 und 3 als Peers, während sie jeweils nur Knoten 1 als eigenen Peer haben. Ich möchte, dass sich die Knoten 2 und 3 gegenseitig entdecken.

Wenn ich außerdem admin.addPeer(node4's enode)von Node 1 aus laufe, wird es nicht an seine Peers gesendet.

Meine Frage: Wie kann ich ein Peer-Discovery-Protokoll aktivieren, bei dem jeder Knoten alle seine Peers mit jedem seiner Peers kommuniziert?

Ich verstehe, dass es einige Hacks gibt, um dies zu umgehen. Pro Instanz kann ich einfach die enodeAdresse jedes der 3 anderen Knoten an jeden Knoten --bootnodesin Geth weitergeben. Oder ich kann einfach admin.addPeer()auf jedem seiner Peers verwenden admin.peers. Aber ich denke, Geth hat das irgendwie automatisiert und ich würde gerne ihre Lösung verwenden.

StartNode-Skript:

geth --networkid 63261 --mine --minerthreads 1 --datadir . --rpc --rpcport "8547" --port "30305" --rpccorsdomain "*" --nat "any" --rpcapi eth,web3,personal,net --unlock 0 --password "./node3password.sec" --ipcdisable --bootnodes "node1enode" console 2>> geth.log

[Bearbeiten]:

Ich hatte bereits jeden meiner Knoten so initialisiert, dass er auf Genesis JSON ( ./BCNetworkName.json) meines privaten Netzwerks verweist, bevor ich das StartNode-Skript ausführte.geth --datadir ./NodeN init BCNetworkName.json

Antworten (1)

Bootnodes sind eine billige und effektive Lösung, um die Selbsterkennung des Netzwerks zu unterstützen, aber sie müssen eine geeignete Genesis-Datei einholen, um Ihr Netzwerk zu isolieren.

Wenn Sie geth ausführen, wird der Genesis-Block von Grund auf neu erstellt und beginnt dann mit der Synchronisierung mit Peers bei Block 1.

Für Ihre private Blockchain müssen Sie diese Datei allen Ihren Knoten zur Verfügung stellen, damit sie miteinander kommunizieren können, ohne Addpeers ausführen zu müssen.

Weitere Informationen zum Genesis-Block finden Sie hier

Wenn Sie mit Docker vertraut sind, können Sie dieses Github-Repository überprüfen, das mit dem Geth-Image spielt, um ein privates Netzwerk zu betreiben. Sie können viel über die Selbstfindung von Gleichaltrigen lernen.

Können Sie erklären, was Sie mit den Knoten meinen, die "eine richtige Genesis-Datei einholen"? Passiert es automatisch mit der Zeit oder muss ich etwas im Startnode-Skript der Knoten angeben? Wie kann ich die Datei "bereitstellen"? Vielen Dank für Ihre Hilfe Bearbeiten: Ich habe bereits geth --datadir ./NodeN init BCNetworkName.jsonauf jedem Knoten ausgeführt, bevor ich das StartNode-Skript ausgeführt habe
Sollte normalerweise funktionieren. Mit welchem ​​Befehl hast du deinen Bootnode ausgeführt?
Ich habe meinen Bootnode initialisiert, indem ich ihn wie hier vorgeschlagen ausgeführt habebootnode -genkey bootnode.key . Dann war mein Skript zum Starten des Bootnode:geth --networkid 63261 --mine --minerthreads 1 --datadir . --rpc --rpcport "8545" --port "30303" --rpccorsdomain "*" --nat "any" --rpcapi eth,web3,personal,net --unlock 0 --password "./node1password.sec" --ipcdisable console 2>> geth.log
Ich konnte in den Geth-CLI-Optionen nichts finden, was ich dem Skript eines Knotens hinzufügen müsste, der der Bootnode sein wird. Habe ich etwas vergessen?
versuchen Sie den Bootnode mit diesem Befehl zu starten--nodekey /opt/bootnode/boot.key
Ihre Vorschläge waren richtig. Ich bin mir nicht sicher, warum mein Code fehlgeschlagen ist, aber ich habe es erneut versucht und alles hat korrekt funktioniert.