Skip to content

Commit 80f64a3

Browse files
brunoergpinheadmz
andcommitted
test: add support for all networks in CAddress in messages.py
Also removes TorV2 from messages.py See bitcoin#22050 Co-authored-by: Matthew Zipkin <[email protected]>
1 parent bc4f6b1 commit 80f64a3

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

test/functional/test_framework/messages.py

+57-6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import socket
2828
import struct
2929
import time
30+
import unittest
3031

3132
from test_framework.siphash import siphash256
3233
from test_framework.util import assert_equal
@@ -77,6 +78,10 @@ def sha256(s):
7778
return hashlib.sha256(s).digest()
7879

7980

81+
def sha3(s):
82+
return hashlib.sha3_256(s).digest()
83+
84+
8085
def hash256(s):
8186
return sha256(sha256(s))
8287

@@ -229,16 +234,25 @@ class CAddress:
229234

230235
# see https://github.com/bitcoin/bips/blob/master/bip-0155.mediawiki
231236
NET_IPV4 = 1
237+
NET_IPV6 = 2
238+
NET_TORV3 = 4
232239
NET_I2P = 5
240+
NET_CJDNS = 6
233241

234242
ADDRV2_NET_NAME = {
235243
NET_IPV4: "IPv4",
236-
NET_I2P: "I2P"
244+
NET_IPV6: "IPv6",
245+
NET_TORV3: "TorV3",
246+
NET_I2P: "I2P",
247+
NET_CJDNS: "CJDNS"
237248
}
238249

239250
ADDRV2_ADDRESS_LENGTH = {
240251
NET_IPV4: 4,
241-
NET_I2P: 32
252+
NET_IPV6: 16,
253+
NET_TORV3: 32,
254+
NET_I2P: 32,
255+
NET_CJDNS: 16
242256
}
243257

244258
I2P_PAD = "===="
@@ -285,33 +299,54 @@ def deserialize_v2(self, f):
285299
self.nServices = deser_compact_size(f)
286300

287301
self.net = struct.unpack("B", f.read(1))[0]
288-
assert self.net in (self.NET_IPV4, self.NET_I2P)
302+
assert self.net in self.ADDRV2_NET_NAME
289303

290304
address_length = deser_compact_size(f)
291305
assert address_length == self.ADDRV2_ADDRESS_LENGTH[self.net]
292306

293307
addr_bytes = f.read(address_length)
294308
if self.net == self.NET_IPV4:
295309
self.ip = socket.inet_ntoa(addr_bytes)
296-
else:
310+
elif self.net == self.NET_IPV6:
311+
self.ip = socket.inet_ntop(socket.AF_INET6, addr_bytes)
312+
elif self.net == self.NET_TORV3:
313+
prefix = b".onion checksum"
314+
version = bytes([3])
315+
checksum = sha3(prefix + addr_bytes + version)[:2]
316+
self.ip = b32encode(addr_bytes + checksum + version).decode("ascii").lower() + ".onion"
317+
elif self.net == self.NET_I2P:
297318
self.ip = b32encode(addr_bytes)[0:-len(self.I2P_PAD)].decode("ascii").lower() + ".b32.i2p"
319+
elif self.net == self.NET_CJDNS:
320+
self.ip = socket.inet_ntop(socket.AF_INET6, addr_bytes)
321+
else:
322+
raise Exception(f"Address type not supported")
298323

299324
self.port = struct.unpack(">H", f.read(2))[0]
300325

301326
def serialize_v2(self):
302327
"""Serialize in addrv2 format (BIP155)"""
303-
assert self.net in (self.NET_IPV4, self.NET_I2P)
328+
assert self.net in self.ADDRV2_NET_NAME
304329
r = b""
305330
r += struct.pack("<I", self.time)
306331
r += ser_compact_size(self.nServices)
307332
r += struct.pack("B", self.net)
308333
r += ser_compact_size(self.ADDRV2_ADDRESS_LENGTH[self.net])
309334
if self.net == self.NET_IPV4:
310335
r += socket.inet_aton(self.ip)
311-
else:
336+
elif self.net == self.NET_IPV6:
337+
r += socket.inet_pton(socket.AF_INET6, self.ip)
338+
elif self.net == self.NET_TORV3:
339+
sfx = ".onion"
340+
assert self.ip.endswith(sfx)
341+
r += b32decode(self.ip[0:-len(sfx)], True)[0:32]
342+
elif self.net == self.NET_I2P:
312343
sfx = ".b32.i2p"
313344
assert self.ip.endswith(sfx)
314345
r += b32decode(self.ip[0:-len(sfx)] + self.I2P_PAD, True)
346+
elif self.net == self.NET_CJDNS:
347+
r += socket.inet_pton(socket.AF_INET6, self.ip)
348+
else:
349+
raise Exception(f"Address type not supported")
315350
r += struct.pack(">H", self.port)
316351
return r
317352

@@ -1852,3 +1887,19 @@ def serialize(self):
18521887
def __repr__(self):
18531888
return "msg_sendtxrcncl(version=%lu, salt=%lu)" %\
18541889
(self.version, self.salt)
1890+
1891+
class TestFrameworkScript(unittest.TestCase):
1892+
def test_addrv2_encode_decode(self):
1893+
def check_addrv2(ip, net):
1894+
addr = CAddress()
1895+
addr.net, addr.ip = net, ip
1896+
ser = addr.serialize_v2()
1897+
actual = CAddress()
1898+
actual.deserialize_v2(BytesIO(ser))
1899+
self.assertEqual(actual, addr)
1900+
1901+
check_addrv2("1.65.195.98", CAddress.NET_IPV4)
1902+
check_addrv2("2001:41f0::62:6974:636f:696e", CAddress.NET_IPV6)
1903+
check_addrv2("2bqghnldu6mcug4pikzprwhtjjnsyederctvci6klcwzepnjd46ikjyd.onion", CAddress.NET_TORV3)
1904+
check_addrv2("255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p", CAddress.NET_I2P)
1905+
check_addrv2("fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa", CAddress.NET_CJDNS)

test/functional/test_runner.py

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"blocktools",
7777
"ellswift",
7878
"key",
79+
"messages",
7980
"muhash",
8081
"ripemd160",
8182
"script",

0 commit comments

Comments
 (0)