tlnbase: parse ipv6, fix transport bug - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit e4b188c7142fde4e5e023da6619425d98323d22e DIR parent d212c90ed9725ec0920bfd8b63e3bf4eea2bb18e HTML Author: ThomasV <thomasv@electrum.org> Date: Sun, 15 Apr 2018 18:55:18 +0200 lnbase: parse ipv6, fix transport bug Diffstat: M lib/lnbase.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) --- DIR diff --git a/lib/lnbase.py b/lib/lnbase.py t@@ -310,6 +310,8 @@ class Peer(PrintError): self.temporary_channel_id_to_incoming_funding_signed = {} self.init_message_received_future = asyncio.Future() self.localfeatures = 0x08 # request initial sync + self.nodes = {} # received node announcements + self.channels = {} # received channel announcements def diagnostic_name(self): return self.host t@@ -330,8 +332,8 @@ class Peer(PrintError): self.writer.write(lc+c) async def read_message(self): - rn_l = self.rn() - rn_m = self.rn() + rn_l, rk_l = self.rn() + rn_m, rk_m = self.rn() while True: s = await self.reader.read(2**10) if not s: t@@ -340,14 +342,14 @@ class Peer(PrintError): if len(self.read_buffer) < 18: continue lc = self.read_buffer[:18] - l = aead_decrypt(self.rk, rn_l, b'', lc) + l = aead_decrypt(rk_l, rn_l, b'', lc) length = int.from_bytes(l, byteorder="big") offset = 18 + length + 16 if len(self.read_buffer) < offset: continue c = self.read_buffer[18:offset] self.read_buffer = self.read_buffer[offset:] - msg = aead_decrypt(self.rk, rn_m, b'', c) + msg = aead_decrypt(rk_m, rn_m, b'', c) return msg async def handshake(self): t@@ -385,7 +387,7 @@ class Peer(PrintError): self.s_ck = ck def rn(self): - o = self._rn + o = self._rn, self.rk self._rn += 1 if self._rn == 1000: self.r_ck, self.rk = get_bolt8_hkdf(self.r_ck, self.rk) t@@ -447,6 +449,7 @@ class Peer(PrintError): def read(n): data, self.s = self.s[0:n], self.s[n:] return data + addresses = [] while self.s: atype = ord(read(1)) if atype == 0: t@@ -455,15 +458,16 @@ class Peer(PrintError): ipv4_addr = '.'.join(map(lambda x: '%d'%x, read(4))) port = int.from_bytes(read(2), byteorder="big") x = ipv4_addr, port, binascii.hexlify(pubkey) - self.print_error('node announcement', x) - node_list.append(x) + addresses.append((ipv4_addr, port)) elif atype == 2: - ipv6_addr = read(16) - port = read(2) - print(ipv6_addr, port) + ipv6_addr = b':'.join([binascii.hexlify(read(2)) for i in range(4)]) + port = int.from_bytes(read(2), byteorder="big") + addresses.append((ipv6_addr, port)) else: pass continue + self.print_error('node announcement', binascii.hexlify(pubkey), addresses) + self.nodes[pubkey] = {'addresses': addresses} def on_init(self, payload): pass