etclabscore / core-geth

A highly configurable Go implementation of the Ethereum protocol.
https://etclabscore.github.io/core-geth
GNU Lesser General Public License v3.0
263 stars 144 forks source link

Bootloader nodes with DNS off will stop nodes the moment of reading. #612

Closed Phoenix1969 closed 5 months ago

Phoenix1969 commented 5 months ago

ffff

meowsbits commented 5 months ago

Looks like you're using a config file -- can you please show the relevant lines as you have them configured? This will help us replicate and better understand your issue.

I'm confused because the DNS lines are EthDiscoveryURLs and SnapDiscoveryURLs, and your screenshot shows BootstrapNodes.

meowsbits commented 5 months ago

Thanks to @ziogaschr's investigation, we've reproduced your report with

BootstrapNodes = ["enode://6b6ea53a498f0895c10269a3a74b777286bd467de6425c3b512740fcc7fbc8cd281dca4ab041dd97d62b38f3d0b5b05e71f48d28a3a2f4b5de40fe1f6bf05531@mai829.ddnssdsadsa.net:30303"]

This host is unreachable:

dig mai829.ddnssdsadsa.net

; <<>> DiG 9.16.1-Ubuntu <<>> mai829.ddnssdsadsa.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 7985
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;mai829.ddnssdsadsa.net.                IN      A

;; Query time: 131 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Mon Feb 05 11:46:42 MST 2024
;; MSG SIZE  rcvd: 51

Geth is exiting because it can't resolve the host name in your configuration, which its treating like an invalid enode address. You can avoid this error by replacing the host name with an IP, and geth should then tolerate even unavailable bootnodes.

// Parse the IP address.
    ip := net.ParseIP(u.Hostname())
    if ip == nil {
        ips, err := lookupIPFunc(u.Hostname())
        if err != nil {
            return nil, err
        }
        ip = ips[0]
    }

https://github.com/etclabscore/core-geth/blob/master/p2p/enode/urlv4.go#L110

LordExodus commented 5 months ago

Isn't it possible for GETH to skip the nodes that are not reachable even with DNS names? Just like it is with an IP?

ziogaschr commented 5 months ago

This is by design based on the specification.

The hostname can only be given as an IP address; DNS names are not allowed.

Source: https://ethereum.org/developers/docs/networking-layer/network-addresses#enode

p.s.: I can't find the exact specification, still I was able to find mentions of it on all major clients documentation.