different node IDs

This commit is contained in:
Dobromir Popov
2026-07-09 09:43:36 +02:00
parent 687e2d1769
commit 4c6e1ed8b6
3 changed files with 61 additions and 3 deletions

View File

@@ -6,8 +6,10 @@ import base64
import json import json
import logging import logging
import os import os
import re
import threading import threading
import time import time
import urllib.parse
import urllib.error import urllib.error
import urllib.request import urllib.request
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
@@ -259,5 +261,30 @@ class RelayHttpBridge:
}) })
def peer_id_from_wallet(wallet_address: str) -> str: def _peer_id_suffix(value: str) -> str:
return wallet_address[:16] if len(wallet_address) >= 16 else wallet_address """Return a relay-safe suffix for a human node name or numeric instance id."""
suffix = re.sub(r"[^A-Za-z0-9_.-]+", "-", value.strip()).strip("-._")
return suffix[:32]
def peer_id_from_wallet(
wallet_address: str,
*,
node_name: str | None = None,
advertised_addr: str | None = None,
) -> str:
"""Build a per-node relay peer id from the wallet plus node identity.
Multiple nodes can legitimately share one wallet for payouts, but the relay
registry is keyed by peer_id. Using only the wallet prefix makes those
nodes overwrite each other at the relay. Prefer the operator-provided node
name; if absent, use the advertised endpoint port as the stable integer
instance suffix (7001, 7002, ... for local multi-node runs).
"""
wallet_prefix = wallet_address[:16] if len(wallet_address) >= 16 else wallet_address
suffix = _peer_id_suffix(node_name or "") if node_name else ""
if not suffix and advertised_addr:
parsed = urllib.parse.urlparse(advertised_addr)
if parsed.port is not None:
suffix = str(parsed.port)
return f"{wallet_prefix}-{suffix}" if suffix else wallet_prefix

View File

@@ -346,11 +346,16 @@ def _start_relay_bridge_if_available(
local_base_url: str, local_base_url: str,
advertised_endpoint: str, advertised_endpoint: str,
relay_url: str | None = None, relay_url: str | None = None,
node_name: str | None = None,
) -> tuple[RelayHttpBridge | None, dict]: ) -> tuple[RelayHttpBridge | None, dict]:
relay_url = relay_url or _discover_relay_url(tracker_url) relay_url = relay_url or _discover_relay_url(tracker_url)
if not relay_url: if not relay_url:
return None, {} return None, {}
peer_id = peer_id_from_wallet(wallet_address) peer_id = peer_id_from_wallet(
wallet_address,
node_name=node_name,
advertised_addr=advertised_endpoint,
)
bridge = RelayHttpBridge( bridge = RelayHttpBridge(
relay_url=relay_url, relay_url=relay_url,
peer_id=peer_id, peer_id=peer_id,
@@ -863,6 +868,7 @@ def run_startup(
local_base_url, local_base_url,
endpoint, endpoint,
relay_url=relay_url, relay_url=relay_url,
node_name=node_name,
) )
_attach_relay_bridge(node, relay_bridge) _attach_relay_bridge(node, relay_bridge)
# Register with tracker so other nodes can auto-join this model. # Register with tracker so other nodes can auto-join this model.
@@ -1015,6 +1021,7 @@ def run_startup(
local_base_url, local_base_url,
endpoint, endpoint,
relay_url=relay_url, relay_url=relay_url,
node_name=node_name,
) )
_attach_relay_bridge(node, relay_bridge) _attach_relay_bridge(node, relay_bridge)
model_cache_path = _model_cache_path(assigned_hf_repo, cache_dir) model_cache_path = _model_cache_path(assigned_hf_repo, cache_dir)
@@ -1196,6 +1203,7 @@ def run_startup(
local_base_url, local_base_url,
endpoint, endpoint,
relay_url=relay_url, relay_url=relay_url,
node_name=node_name,
) )
_attach_relay_bridge(node, relay_bridge) _attach_relay_bridge(node, relay_bridge)
reg_payload = { reg_payload = {
@@ -1257,6 +1265,7 @@ def run_startup(
local_base_url, local_base_url,
endpoint, endpoint,
relay_url=relay_url, relay_url=relay_url,
node_name=node_name,
) )
_attach_relay_bridge(node, relay_bridge) _attach_relay_bridge(node, relay_bridge)

View File

@@ -41,6 +41,28 @@ def test_identity_different_for_different_paths(tmp_path):
assert a["peer_id"] != b["peer_id"] assert a["peer_id"] != b["peer_id"]
def test_relay_peer_id_includes_node_name_for_shared_wallet():
from meshnet_node.relay_bridge import peer_id_from_wallet
wallet = "5gMLrmyBYTpkFjmyc4eGwcaWhYquyWgCBFFEqHzR5Qur"
assert peer_id_from_wallet(wallet, node_name="gpu head") == "5gMLrmyBYTpkFjmy-gpu-head"
assert peer_id_from_wallet(wallet, node_name="cpu-tail") == "5gMLrmyBYTpkFjmy-cpu-tail"
def test_relay_peer_id_falls_back_to_endpoint_port_integer():
from meshnet_node.relay_bridge import peer_id_from_wallet
wallet = "5gMLrmyBYTpkFjmyc4eGwcaWhYquyWgCBFFEqHzR5Qur"
first = peer_id_from_wallet(wallet, advertised_addr="http://192.168.0.20:7001")
second = peer_id_from_wallet(wallet, advertised_addr="http://192.168.0.20:7002")
assert first == "5gMLrmyBYTpkFjmy-7001"
assert second == "5gMLrmyBYTpkFjmy-7002"
assert first != second
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# TLS / certificate tests # TLS / certificate tests
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------