mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Merge bitcoin/bitcoin#25989: init: abort if i2p/cjdns are chosen via -onlynet but are unreachable
68209a7b5crpc: make addpeeraddress work with cjdns addresses (Martin Zumsande)a8a9ed67ccinit: Abort if i2p/cjdns are chosen via -onlynet but unreachable (Martin Zumsande) Pull request description: If the networks i2p / cjdns are chosen via `-onlynet` but the user forgot to provide `-i2psam` / `-cjdnsreachable`, no outbound connections will be made - it would be nice to inform the user about that. The solution proposed here mimics existing behavior for `-onlynet=onion` and non-specified `-onion`/`-proxy` where we already abort with an InitError - if reviewers would prefer to just print a warning, please say so. The second commit adds CJDNS support to the debug-only `addpeeraddress` RPC allowing to add CJDNS addresses to addrman for testing and debug purposes. (if `-cjdnsreachable=1`) This is the result of an [IRC discussion](https://bitcoin-irc.chaincode.com/bitcoin-core-dev/2022-09-01#848066;) with vasild. ACKs for top commit: vasild: ACK68209a7b5cdergoegge: ACK68209a7b5cTree-SHA512: 6db9787f01820190f14f90a0b39e4206603421eb7521f792879094d8bbf4d4d0bfd70665eadcc40994ac7941a15ab5a8d65c4779fba5634c0e6fa66eb0972b8d
This commit is contained in:
10
src/init.cpp
10
src/init.cpp
@@ -1285,6 +1285,11 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!args.IsArgSet("-cjdnsreachable")) {
|
if (!args.IsArgSet("-cjdnsreachable")) {
|
||||||
|
if (args.IsArgSet("-onlynet") && IsReachable(NET_CJDNS)) {
|
||||||
|
return InitError(
|
||||||
|
_("Outbound connections restricted to CJDNS (-onlynet=cjdns) but "
|
||||||
|
"-cjdnsreachable is not provided"));
|
||||||
|
}
|
||||||
SetReachable(NET_CJDNS, false);
|
SetReachable(NET_CJDNS, false);
|
||||||
}
|
}
|
||||||
// Now IsReachable(NET_CJDNS) is true if:
|
// Now IsReachable(NET_CJDNS) is true if:
|
||||||
@@ -1757,6 +1762,11 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
}
|
}
|
||||||
SetProxy(NET_I2P, Proxy{addr});
|
SetProxy(NET_I2P, Proxy{addr});
|
||||||
} else {
|
} else {
|
||||||
|
if (args.IsArgSet("-onlynet") && IsReachable(NET_I2P)) {
|
||||||
|
return InitError(
|
||||||
|
_("Outbound connections restricted to i2p (-onlynet=i2p) but "
|
||||||
|
"-i2psam is not provided"));
|
||||||
|
}
|
||||||
SetReachable(NET_I2P, false);
|
SetReachable(NET_I2P, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ bool SeenLocal(const CService& addr);
|
|||||||
bool IsLocal(const CService& addr);
|
bool IsLocal(const CService& addr);
|
||||||
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = nullptr);
|
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = nullptr);
|
||||||
CService GetLocalAddress(const CNetAddr& addrPeer);
|
CService GetLocalAddress(const CNetAddr& addrPeer);
|
||||||
|
CService MaybeFlipIPv6toCJDNS(const CService& service);
|
||||||
|
|
||||||
|
|
||||||
extern bool fDiscover;
|
extern bool fDiscover;
|
||||||
|
|||||||
@@ -947,7 +947,8 @@ static RPCHelpMan addpeeraddress()
|
|||||||
bool success{false};
|
bool success{false};
|
||||||
|
|
||||||
if (LookupHost(addr_string, net_addr, false)) {
|
if (LookupHost(addr_string, net_addr, false)) {
|
||||||
CAddress address{{net_addr, port}, ServiceFlags{NODE_NETWORK | NODE_WITNESS}};
|
CService service{net_addr, port};
|
||||||
|
CAddress address{MaybeFlipIPv6toCJDNS(service), ServiceFlags{NODE_NETWORK | NODE_WITNESS}};
|
||||||
address.nTime = Now<NodeSeconds>();
|
address.nTime = Now<NodeSeconds>();
|
||||||
// The source address is set equal to the address. This is equivalent to the peer
|
// The source address is set equal to the address. This is equivalent to the peer
|
||||||
// announcing itself.
|
// announcing itself.
|
||||||
|
|||||||
@@ -332,6 +332,16 @@ class ProxyTest(BitcoinTestFramework):
|
|||||||
msg = "Error: Invalid -i2psam address or hostname: 'def:xyz'"
|
msg = "Error: Invalid -i2psam address or hostname: 'def:xyz'"
|
||||||
self.nodes[1].assert_start_raises_init_error(expected_msg=msg)
|
self.nodes[1].assert_start_raises_init_error(expected_msg=msg)
|
||||||
|
|
||||||
|
self.log.info("Test passing invalid -onlynet=i2p without -i2psam raises expected init error")
|
||||||
|
self.nodes[1].extra_args = ["-onlynet=i2p"]
|
||||||
|
msg = "Error: Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided"
|
||||||
|
self.nodes[1].assert_start_raises_init_error(expected_msg=msg)
|
||||||
|
|
||||||
|
self.log.info("Test passing invalid -onlynet=cjdns without -cjdnsreachable raises expected init error")
|
||||||
|
self.nodes[1].extra_args = ["-onlynet=cjdns"]
|
||||||
|
msg = "Error: Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided"
|
||||||
|
self.nodes[1].assert_start_raises_init_error(expected_msg=msg)
|
||||||
|
|
||||||
self.log.info("Test passing -onlynet=onion with -onion=0/-noonion raises expected init error")
|
self.log.info("Test passing -onlynet=onion with -onion=0/-noonion raises expected init error")
|
||||||
msg = (
|
msg = (
|
||||||
"Error: Outbound connections restricted to Tor (-onlynet=onion) but "
|
"Error: Outbound connections restricted to Tor (-onlynet=onion) but "
|
||||||
|
|||||||
Reference in New Issue
Block a user