getsockopt: Verbindung beim Ausführen eines Bootnodes abgelehnt

  • Geth-Version: v1.6.0-unstable-1018bf6a/linux/go1.7.3
  • Betriebssystem & Version: Linux/Ubuntu 16.04.1 LTS (x86_64)

Ich möchte ein privates verteiltes Blockchain-Netzwerk aufbauen. Ich kann Knoten (die auf verschiedenen Computern laufen) nicht dazu bringen, sich gegenseitig zu erkennen.

Beide Knoten haben die gleiche Genesis-Datei und sind mit der gleichen networkId verbunden.

INFO Successfully wrote genesis state  hash=X (hash equal on both nodes)

Der UDP-Port 30301 des Bootknotens ist offen

> netcat -u -z -v <PUB-IP> 30301
Connection to <PUB-IP> 30301 port [udp/*] succeeded!

Wenn ich die Bootnote starte, übergebe ich die folgenden Argumente:

--nodekey <FILE> —addr :30301 --nat extip:<PUB-IP> --verbosity 9

Die Protokolle bestätigen, dass es erfolgreich erstellt und überwacht wurde:

INFO Mapped network port    proto=udp extport=30301 intport=30301 interface=ExtIP(<PUB-IP>)
DEBUG UDP listener up       self=enode://<PUB-ID>@<PUB-IP>:30301

Wenn ich den Knoten starte, übergebe ich die folgenden Argumente:

--cache=512 --verbosity=6 --datadir <DIR> --nat extip:<PUB-IP> --networkid=<VAL*> --rpc --rpcaddr=0.0.0.0 --rpcapi=eth,net,web3,personal,db --rpccorsdomain '*' --ipcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --bootnodes enode://<PUB-ID>@<PUB-IP>:30301 --identity node1 

*(Ich verwende eine große Netzwerk-ID, aber sie liegt innerhalb des BigInteger-Bereichs)

Die Protokolle auf dem Knoten bestätigen, dass der Bootknoten gut identifiziert ist

INFO  Starting P2P networking 
# >> Info about the current node:
DEBUG UDP listener up             self=enode://<PUB-ID>@<PUB-IP>:30303
INFO  Mapped network port         proto=udp extport=30303 intport=30303 interface=ExtIP(<PUB-IP>)
# >> Info about the bootnode:
TRACE Starting bonding ping/pong  id=<PUB-ID-SHORT> known=false failcount=0 age=XmXs

Aber die Verbindung schlägt fehl und admin.peerszeigt keine Peers an

TRACE >> PING/v4                 addr=<PUB-IP>:30301 err=nil
TRACE Starting bonding ping/pong id=<PUB-ID-SHORT> known=false failcount=0 age=XmXs
TRACE >> PING/v4                 addr=<PUB-IP>:30301  err=nil

Wenn ich versuche, den Bootnode manuell hinzuzufügen, wird admin.addPeer("enode://..")true zurückgegeben, aber die Protokolle zeigen:

DEBUG Adding static node    node=enode://<PUB-ID>@<PUB-IP>:30301
TRACE New dial task         task="staticdial <PUB-ID-SHORT> <PUB-IP>:30301"
TRACE Dial error            task="staticdial <PUB-ID-SHORT> <PUB-IP>:30301" err="dial tcp <PUB-IP>:30301: getsockopt: connection refused"
DEBUG Resolving node failed id=<PUB-ID-SHORT> newdelay=2m0s
TRACE Dial task done        task="staticdial <PUB-ID-SHORT> <PUB-IP>:30301"
TRACE New dial task         task="staticdial <PUB-ID-SHORT> <PUB-IP>:30301"
TRACE Dial error            task="staticdial <PUB-ID-SHORT> <PUB-IP>:30301" err="dial tcp <PUB-IP>:30301: getsockopt: connection refused"
TRACE Dial task done        task="staticdial <PUB-ID-SHORT> <PUB-IP>:30301"

Ich habe auch versucht, eine Verbindung über static-nodes.jsonherzustellen, wobei ich die Adresse des Bootknotens in allen Knoten angebe; und auch ohne das --bootnodesFlag, wo irgendwie auch meine Knoten nicht erkannt werden, aber es gibt einige zufällige externe Knoten, die sporadisch als Peers angezeigt werden . Ich habe auch versucht zu spezifizieren --maxpeers( nach dem Rat von BokkyPooBah ) und scheint keinen Unterschied zu machen.

Bitte hilf mir.

Eine Idee wäre, sowohl UDP als auch TCP auf den Standardports von zu belassen 30303und den lauschenden (UDP) Port nicht auf zu ändern 30301. (Es sieht so aus, als hätte einer Ihrer Knoten UDP 30303und der andere UDP 30301, was möglicherweise keine Rolle spielt, da Sie die Ports in den übergebenen Optionen angegeben haben. Persönlich hätte ich alles als Port 30303... )
Ich könnte versuchen, den Bootnode-Port auf 30303 umzustellen. In dem Netzwerk, das ich baue, verwenden die Knoten UDP 30303, aber der Bootnode verwendet 30301. Die Konsolenanzeige, bei der Port UDP 30303 aktiviert ist, entspricht dem regulären Knoten.
Nun, mit Port 30303 auf dem Bootnode scheint es mehr Aktivität zu geben, aber es bekommt immer noch nicht den anderen Knoten, der sich explizit mit ihm verbindet. Ich denke, der Grund, warum 30301 für Bootnode und Knoten besser wäre, ist, weniger Verkehr zu haben. Aber warum erkennen sie sich nicht?
Haben Sie überprüft, ob alle Server die gleiche Datetime haben? Beste, Marcello Kazuo
Ja, habe ich. Sie wurden synchronisiert

Antworten (1)

Endlich hat es funktioniert. Ich weiß immer noch nicht wirklich, was es getan hat, aber ich werde hier einige der Änderungen auflisten, die es zum Laufen gebracht haben. Wenn ich herausfinde, was genau es getan hat, werde ich meine Antwort aktualisieren.

  • Verwenden Sie das --v5discFlag für die Knotenerkennung.
  • Der Bootnode brauchte ewig, um mit dem --v5Flag zu starten, also habe ich statt eines Bootnode einen zufälligen Node als Bootnode gewählt. Ich habe meinen Knoten mit dem --bootnodesVerweis auf diesen regulären Knoten gestartet, aber es schien nicht zu funktionieren, bis ich ihn manuell hinzugefügt habe. Wahrscheinlich static-nodes.jsonhätte die Verwendung auch funktioniert.
  • Verwenden Sie eine kleine networkId . Ich glaube, ich war zu optimistisch in Bezug auf die Größe dieses Werts. Einmal habe ich geth ausgeführt und festgestellt, dass es eine andere Netzwerk-ID verwendet als die, die ich eingegeben habe. Das war kein gutes Zeichen, aber anstatt einen kleineren Wert zu wählen, wählte ich den Wert, den Geth vorschlug. Ich habe erst gemerkt, dass etwas nicht stimmt, als ich diesen Fehler bekam Protocol eth/63 failed id=X conn=inbound err="NetworkId mismatch - 3853220132 (!= 1245324517197969700)". Ich verwende jetzt eine 10-stellige Netzwerk-ID, und das scheint den Trick getan zu haben.
  • [Möglicherweise nicht notwendig] Führen Sie einen Knoten im Miner-Modus aus ( personal.newAccount("pw"), miner.setEtherbase(eth.accounts[0])& miner.start())

Ich neige eher zu der Annahme, dass die Netzwerk-ID ein Problem verursacht hat. Zumindest das Umschalten auf v5machte es leichter zu erkennen.