Explain PEX for .onion addresses
Explain PEX for .onion addresses. If we get more organized we can figure out how to implement IPv6 peer exchange.
To add new kind of connection (ipv6 or i2p) we need to modify these:
- Incoming PEX request: https://github.com/HelloZeroNet/ZeroNet/blob/master/src/File/FileRequest.py#L267
- Sending PEX request: https://github.com/HelloZeroNet/ZeroNet/blob/master/src/Peer/Peer.py#L239
- Packing peers: https://github.com/HelloZeroNet/ZeroNet/blob/master/src/util/helper.py#L77
+ Modify AnnounceZero and Bootstrapper plugin to store and send new kind of peer addresses.
So it's not extendable easily...
I made a pull request (#64) and it is merged. The PEX packet is much more flexible than I expect. Let me propose the PEX encoding for IPv6 addresses and Next-generation onion services.
IPv6 address in PEX: A packed IPv6 address is an element in the peers list. It is (16+2) bytes long. The last two bytes are the port number.
Next-generation (v3) onion address in PEX: A next-generation onion address is an element in the peers_onion list. It is (35+2) bytes long. The address is b32-decoded, so that it can be represented in 35 bytes instead of 56 bytes. The last 2 bytes are the port number.
You can vote below. If this gets enough votes, we can make this spec official.
Recipe for parsing and packing IPv6 addresses (Python 3)
>>> import ipaddress
>>> ipaddress.IPv6Address
<class 'ipaddress.IPv6Address'>
>>> ipv6 = ipaddress.IPv6Address("::1")
>>> ipv6.packed
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
>>> len(ipv6.packed)
16
>>> ipaddress.IPv6Address(ipv6.packed)
IPv6Address('::1')
>>> ipv4 = ipaddress.IPv4Address('8.8.8.8')
>>> ipv4.packed
b'\x08\x08\x08\x08'
>>> len(ipv4.packed)
4
Sounds great for me. Still have to decide if we should pack next-gen onion addresses to "peers_onion" node and ipv6 ones to "peers" or separate ones. Probably it's easier to use the current ones, but we need to take care about backward compatibility issues. (checking client's version before sending new-style addresses to them)
Does ZeroNet put onion peers in PEX requests? There should be a peers_onion field in the request.
https://zeronet.readthedocs.io/en/latest/help_zeronet/network_protocol/#pex-site-peers-need
Yes, thanks, added!