Summary:
This PR fixes two related issues with address discovery when using explicit bind addresses in Bitcoin Core:
- #31293: Discover() will not run if listening on any address with an explicit bind=0.0.0.0
- #31336: Functional tests: feature_bind_port_discover.py is failing
Problem
When using -bind=0.0.0.0:port (or -bind=::), the Discover() function was not being executed because the code only checked the bind_on_any flag. This led to two problems:
- The node would not discover its own local addresses if an explicit “any” bind was used.
- The functional test
feature_bind_port_discover.pywould fail, as it expects local addresses to be discovered in these cases.
The Fix
This PR:
- Checks both
bind_on_anyand any bind addresses usingIsBindAny()
EnsuresDiscover()runs when binding to 0.0.0.0 or ::, even if specified explicitly. - Ensures correct address discovery
The node will now discover its own addresses when using explicit “any” binds, matching user expectations and fixing the test. - Maintains backward compatibility
The semantic meaning ofbind_on_anyis preserved as defined innet.h:“True if the user did not specify -bind= or -whitebind= and thus we should bind on 0.0.0.0 (IPv4) and :: (IPv6)”
- Updates the test to use dynamic ports
The functional testfeature_bind_port_discover.pyis updated to use dynamic ports instead of hardcoded ones, improving reliability.
How this PR Differs from #31492
- Preserves the semantic meaning of
bind_on_any(seenet.h). - Uses a simpler approach: checks
IsBindAny()on bind addresses, without modifyingGetListenPort(). - Avoids code duplication with
DefaultOnionServiceTarget().