different node IDs
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user