[backport] Complete the BIP155 implementation and upgrade to TORv3
Summary
This is a backport of https://github.com/bitcoin/bitcoin/pull/19954
This also includes a partial backport of https://github.com/bitcoin/bitcoin/pull/20564
This PR contains the two remaining commits from #19031 to complete the BIP155 implementation:
net: CAddress & CAddrMan: (un)serialize as ADDRv2
net: advertise support for ADDRv2 via new message
plus one more commit:
tor: make a TORv3 hidden service instead of TORv2
Depends on !1475 (merged)
Test plan
ninja all check check-functional-extended
-
./test/functional/test_runner.py --failfast -j $(nproc) $(echo {1..128} | sed 's/[^ ]*/p2p_addrv2_relay.py/g')
to check for the fixed race condition inp2p_addrv2_relay
- Install a Tor instance and set
ControlPort 9051
,CookieAuthentication 1
,CookieAuthFileGroupReadable 1
and depending on distroDataDirectoryGroupReadable 1
in/etc/tor/torrc
. Add your user to the tor group:gpasswd -a tor user
. Restart tor. You might need to log out and log in again to get your login session to have the additional group, check withid
. -
bitcoind -datadir=<first datadir> -proxy=127.0.0.1:9050 -listen -debug=tor -debug=net
to start the first instance. Check the log fortor: Got service ID v525rwi6aar2hpgmbryssymabh7ty4yzyjpym2pje5edhco23o6kofqd, advertising service v525rwi6aar2hpgmbryssymabh7ty4yzyjpym2pje5edhco23o6kofqd.onion:8333
, this is your onion service address. -
bitcoind -datadir=<second datadir> -proxy=127.0.0.1:9050 -onlynet=onion -debug=tor -addnode=v525rwi6aar2hpgmbryssymabh7ty4yzyjpym2pje5edhco23o6kofqd.onion:8333 -rpcport=8442
to start the second instance. - Check the logs to see if the second instance can connect to the first and they exchange sendaddrv2 after verack and then send addrv2.
- Do the same with -useextversion=1.
Some more useful commands to test this:
bitcoin-cli getpeerinfo > peerinfo.json
# Check that sendaddrv2 has been sent to all our peers
test $(jq '. | length' peerinfo.json) -eq $(jq '[.[] | select(.bytessent_per_msg.sendaddrv2 > 0)] | length' peerinfo.json) || echo failed
# List peers that have advertised via sendaddrv2 to us
jq '.[] | select(.bytesrecv_per_msg.sendaddrv2 > 0)' peerinfo.json
# List peers that have sent addrv2 to us
jq '.[] | select(.bytesrecv_per_msg.addrv2 > 0)' peerinfo.json
# List peers that we sent addrv2 to
jq '.[] | select(.bytesrecv_per_msg.addrv2 > 0)' peerinfo.json
# List onion peers
jq '.[] | select(.addr | contains("onion"))' peerinfo.json
Edited by Axel Gembe