Skip to content

Commit b6431d4

Browse files
committed
dynamically update relays
1 parent 42b072a commit b6431d4

File tree

3 files changed

+34
-18
lines changed

3 files changed

+34
-18
lines changed

Diff for: electrum/gui/qt/main_window.py

+1
Original file line numberDiff line numberDiff line change
@@ -1269,6 +1269,7 @@ def descr(x):
12691269
if choice is None:
12701270
return False
12711271
self.config.SWAPSERVER_NPUB = choice
1272+
self.config.LAST_SWAPSERVER_RELAYS = transport._offers[choice]['relays']
12721273
pairs = transport.get_offer(choice)
12731274
sm.update_pairs(pairs)
12741275
return True

Diff for: electrum/simple_config.py

+1
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,7 @@ def __setattr__(self, name, value):
812812
SWAPSERVER_FEE_MILLIONTHS = ConfigVar('swapserver_fee_millionths', default=5000, type_=int)
813813
TEST_SWAPSERVER_REFUND = ConfigVar('test_swapserver_refund', default=False, type_=bool)
814814
SWAPSERVER_NPUB = ConfigVar('swapserver_npub', default=None, type_=str)
815+
LAST_SWAPSERVER_RELAYS = ConfigVar('last_swapserver_relays', default=None, type_=str)
815816
SWAPSERVER_ANN_POW_NONCE = ConfigVar('swapserver_ann_pow_nonce', default=0, type_=int)
816817
SWAPSERVER_POW_TARGET = ConfigVar('swapserver_pow_target', default=30, type_=int)
817818

Diff for: electrum/submarine_swaps.py

+32-18
Original file line numberDiff line numberDiff line change
@@ -1277,11 +1277,10 @@ def __init__(self, config, sm, keypair):
12771277
self.private_key = keypair.privkey
12781278
self.nostr_private_key = to_nip19('nsec', keypair.privkey.hex())
12791279
self.nostr_pubkey = keypair.pubkey.hex()[2:]
1280-
self.dm_replies = defaultdict(asyncio.Future) # type: Dict[bytes, asyncio.Future]
1280+
self.dm_replies = defaultdict(asyncio.Future) # type: Dict[str, asyncio.Future]
12811281
ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_path)
12821282
self.relay_manager = aionostr.Manager(self.relays, private_key=self.nostr_private_key, log=self.logger, ssl_context=ssl_context)
12831283
self.taskgroup = OldTaskGroup()
1284-
self.server_relays = None
12851284

12861285
def __enter__(self):
12871286
asyncio.run_coroutine_threadsafe(self.main_loop(), self.network.asyncio_loop)
@@ -1329,7 +1328,11 @@ async def stop(self):
13291328

13301329
@property
13311330
def relays(self):
1332-
return self.network.config.NOSTR_RELAYS.split(',')
1331+
our_relays = self.config.NOSTR_RELAYS.split(',') if self.config.NOSTR_RELAYS else []
1332+
if self.sm.is_server:
1333+
return our_relays
1334+
last_swapserver_relays = self.config.LAST_SWAPSERVER_RELAYS.split(',') if self.config.LAST_SWAPSERVER_RELAYS else []
1335+
return list(set(our_relays + last_swapserver_relays))
13331336

13341337
def get_offer(self, pubkey):
13351338
offer = self._offers.get(pubkey)
@@ -1377,7 +1380,7 @@ async def publish_offer(self, sm):
13771380
private_key=self.nostr_private_key)
13781381
self.logger.info(f"published offer {event_id}")
13791382

1380-
async def send_direct_message(self, pubkey: str, relays, content: str) -> str:
1383+
async def send_direct_message(self, pubkey: str, content: str) -> str:
13811384
event_id = await aionostr._add_event(
13821385
self.relay_manager,
13831386
kind=self.NOSTR_DM,
@@ -1388,10 +1391,13 @@ async def send_direct_message(self, pubkey: str, relays, content: str) -> str:
13881391

13891392
@log_exceptions
13901393
async def send_request_to_server(self, method: str, request_data: dict) -> dict:
1394+
# this ensures that we are also connected to the server relays when we
1395+
# just selected it (no previous get_pairs call)
1396+
self.logger.debug(f"sending request to server. Triggering relay update: {self.relays}")
1397+
await self.relay_manager.update_relays(self.relays)
13911398
request_data['method'] = method
1392-
request_data['relays'] = self.config.NOSTR_RELAYS
13931399
server_pubkey = self.config.SWAPSERVER_NPUB
1394-
event_id = await self.send_direct_message(server_pubkey, self.server_relays, json.dumps(request_data))
1400+
event_id = await self.send_direct_message(server_pubkey, json.dumps(request_data))
13951401
response = await self.dm_replies[event_id]
13961402
return response
13971403

@@ -1402,13 +1408,15 @@ async def receive_offers(self):
14021408
"limit":10,
14031409
"#d": [f"electrum-swapserver-{self.NOSTR_EVENT_VERSION}"],
14041410
"#r": [f"net:{constants.net.NET_NAME}"],
1405-
"since": int(time.time()) - self.OFFER_UPDATE_INTERVAL_SEC
1411+
"since": int(time.time()) - 60 * 60,
1412+
"until": int(time.time()) + 60 * 60,
14061413
}
14071414
async for event in self.relay_manager.get_events(query, single_event=False, only_stored=False):
14081415
try:
14091416
content = json.loads(event.content)
14101417
tags = {k: v for k, v in event.tags}
14111418
except Exception as e:
1419+
self.logger.debug(f"failed to parse event: {e}")
14121420
continue
14131421
if tags.get('d') != f"electrum-swapserver-{self.NOSTR_EVENT_VERSION}":
14141422
continue
@@ -1417,8 +1425,9 @@ async def receive_offers(self):
14171425
# check if this is the most recent event for this pubkey
14181426
pubkey = event.pubkey
14191427
ts = self._offers.get(pubkey, {}).get('timestamp', 0)
1420-
if event.created_at <= ts:
1421-
#print('skipping old event', pubkey[0:10], event.id)
1428+
if (event.created_at <= ts
1429+
or event.created_at > time.time() + 60 * 60
1430+
or event.created_at < time.time() - 60 * 60):
14221431
continue
14231432
try:
14241433
pow_bits = get_nostr_ann_pow_amount(
@@ -1433,9 +1442,10 @@ async def receive_offers(self):
14331442
content['pow_bits'] = pow_bits
14341443
content['pubkey'] = pubkey
14351444
content['timestamp'] = event.created_at
1436-
self._offers[pubkey] = content
14371445
# mirror event to other relays
14381446
server_relays = content['relays'].split(',') if 'relays' in content else []
1447+
content['relays'] = ','.join(server_relays[:10]) # limit to 10 relays
1448+
self._offers[pubkey] = content
14391449
await self.taskgroup.spawn(self.rebroadcast_event(event, server_relays))
14401450

14411451
async def get_pairs(self):
@@ -1446,7 +1456,8 @@ async def get_pairs(self):
14461456
"authors": [self.config.SWAPSERVER_NPUB],
14471457
"#d": [f"electrum-swapserver-{self.NOSTR_EVENT_VERSION}"],
14481458
"#r": [f"net:{constants.net.NET_NAME}"],
1449-
"since": int(time.time()) - self.OFFER_UPDATE_INTERVAL_SEC,
1459+
"since": int(time.time()) - 60 * 60,
1460+
"until": int(time.time()) + 60 * 60,
14501461
"limit": 1
14511462
}
14521463
async for event in self.relay_manager.get_events(query, single_event=True, only_stored=False):
@@ -1459,14 +1470,18 @@ async def get_pairs(self):
14591470
continue
14601471
if tags.get('r') != f"net:{constants.net.NET_NAME}":
14611472
continue
1462-
# check if this is the most recent event for this pubkey
1463-
pubkey = event.pubkey
1464-
content['pubkey'] = pubkey
1473+
if (event.created_at > time.time() + 60 * 60
1474+
or event.created_at < time.time() - 60 * 60):
1475+
continue
1476+
content['pubkey'] = event.pubkey
14651477
content['timestamp'] = event.created_at
14661478
self.logger.info(f'received offer from {age(event.created_at)}')
14671479
pairs = self._parse_offer(content)
1480+
server_relays = content['relays'].split(',')[:10] if 'relays' in content else []
1481+
if server_relays:
1482+
self.config.LAST_SWAPSERVER_RELAYS = ','.join(server_relays)
1483+
await self.relay_manager.update_relays(self.relays)
14681484
self.sm.update_pairs(pairs)
1469-
self.server_relays = content['relays'].split(',')
14701485

14711486
async def rebroadcast_event(self, event: Event, server_relays: Sequence[str]):
14721487
"""If the relays of the origin server are different from our relays we rebroadcast the
@@ -1509,8 +1524,7 @@ async def handle_request(self, request):
15091524
method = request.pop('method')
15101525
event_id = request.pop('event_id')
15111526
event_pubkey = request.pop('event_pubkey')
1512-
self.logger.info(f'handle_request: id={event_id} {method} {request}')
1513-
relays = request.pop('relays').split(',')
1527+
print(f'handle_request: id={event_id} {method} {request}')
15141528
if method == 'addswapinvoice':
15151529
r = self.sm.server_add_swap_invoice(request)
15161530
elif method == 'createswap':
@@ -1521,4 +1535,4 @@ async def handle_request(self, request):
15211535
raise Exception(method)
15221536
r['reply_to'] = event_id
15231537
self.logger.info(f'sending response id={event_id}')
1524-
await self.send_direct_message(event_pubkey, relays, json.dumps(r))
1538+
await self.send_direct_message(event_pubkey, json.dumps(r))

0 commit comments

Comments
 (0)