From d2e8fe7fa1f76faf783414bf6092823dc501a3f9 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 13 Jul 2018 17:57:00 +0800 Subject: [PATCH] Update peer discovery code for protocol 1.3 --- electrumx/server/peers.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/electrumx/server/peers.py b/electrumx/server/peers.py index 03b6495..7eb1b0b 100644 --- a/electrumx/server/peers.py +++ b/electrumx/server/peers.py @@ -18,7 +18,7 @@ from functools import partial from aiorpcx import ClientSession, RPCError, SOCKSProxy, ConnectionError from electrumx.lib.peer import Peer -from electrumx.lib.util import ConnectionLogger, class_logger +from electrumx.lib.util import ConnectionLogger, class_logger, protocol_tuple PEER_GOOD, PEER_STALE, PEER_NEVER, PEER_BAD = range(4) @@ -101,20 +101,18 @@ class PeerSession(ClientSession): def on_version(self, request): '''Handle the response to the version message.''' - if not self.is_good(request, (list, str)): + if not self.is_good(request, list): return result = request.result() - if isinstance(result, str): - version = result - else: - # Protocol version 1.1 returns a pair with the version first - if len(result) < 2 or not isinstance(result[0], str): - self.fail(request, 'result array bad format') - return - version = result[0] + # Protocol version 1.1 returns a pair with the version first + if len(result) != 2 or not all(isinstance(x, str) for x in result): + self.fail(request, 'result array bad format') + return + version = result[0] self.peer.server_version = version self.peer.features['server_version'] = version + self.ptuple = protocol_tuple(result[1]) for method, on_done in [ ('blockchain.headers.subscribe', self.on_height), @@ -146,7 +144,10 @@ class PeerSession(ClientSession): result = request.result() controller = self.peer_mgr.controller our_height = controller.bp.db_height - their_height = result.get('block_height') + if self.ptuple < (1, 3): + their_height = result.get('block_height') + else: + their_height = result.get('height') if not isinstance(their_height, int): self.bad('invalid height {}'.format(their_height)) return