upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/nostr.cpp
diff options
context:
space:
mode:
authorbitflash-maintainer <noreply@bitflash.invalid>2026-08-08 04:37:52 +0000
committerbitflash-maintainer <noreply@bitflash.invalid>2026-08-23 04:37:36 +0000
commit76f154a4c600082b346124e9e9af26ce401600da (patch)
treeb748e59a06b5b2dc45a319ecd9b208f446d0dfcd /src/nostr.cpp
parent6e4865c14c858d00c6cfa6967e66a86b31cd12f8 (diff)
nostr: make /rvrelay a true pin -- never merge discovered relays
A pool started with /rvrelay=ONE still spawned an accept thread for every Nostr-discovered relay (BtfAllRelays always merged g_discoveredRelays), and each thread optimistically overwrote the advertised meeting node before registering -- so a discovered Tailscale-only relay (a mesh host) flapped the published .btf descriptor and public miners could not connect. fBtfRelayPinned (set only when /rvrelay parses) makes BtfAllRelays return exactly the pinned list. Also validate the /rvrelay value at parse time: with the pin in place no discovered relay can mask a typo. (cherry picked from commit 0a4d2b02fa5382c5e788b5f0e2f8a844695dec47)
Diffstat (limited to 'src/nostr.cpp')
-rw-r--r--src/nostr.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/nostr.cpp b/src/nostr.cpp
index 21104bc..6d85bf6 100644
--- a/src/nostr.cpp
+++ b/src/nostr.cpp
@@ -110,6 +110,12 @@ vector<string> vBtfMeetingRelays = {
110 "31.44.4.249:8434", // New Jersey, US 110 "31.44.4.249:8434", // New Jersey, US
111 "90.156.222.107:8434", // Almaty, KZ 111 "90.156.222.107:8434", // Almaty, KZ
112}; 112};
113// True when the operator pinned the relay list with /rvrelay: discovered
114// relays must NOT be merged in (BtfAllRelays), otherwise one accept thread
115// per discovered relay is spawned and each one optimistically overwrites the
116// advertised meeting node (BtfSetActiveRelay) before registering -- a
117// discovered but unreachable relay then flaps the published .btf descriptor.
118bool fBtfRelayPinned = false;
113string strBtfActiveRelay; 119string strBtfActiveRelay;
114static CCriticalSection cs_activeRelay; 120static CCriticalSection cs_activeRelay;
115 121
@@ -144,7 +150,7 @@ static map<string, BtfPoolAnnouncement> g_discoveredPools;
144static CCriticalSection cs_discoveredPools; 150static CCriticalSection cs_discoveredPools;
145 151
146// Basic sanity: "host:port" with a numeric 1..65535 port and a plausible host. 152// Basic sanity: "host:port" with a numeric 1..65535 port and a plausible host.
147static bool LooksLikeRelay(const string& r) 153bool LooksLikeRelay(const string& r)
148{ 154{
149 size_t colon = r.rfind(':'); 155 size_t colon = r.rfind(':');
150 if (colon == string::npos || colon == 0 || colon + 1 >= r.size()) 156 if (colon == string::npos || colon == 0 || colon + 1 >= r.size())
@@ -172,6 +178,8 @@ static bool LooksLikeRelay(const string& r)
172vector<string> BtfAllRelays() 178vector<string> BtfAllRelays()
173{ 179{
174 vector<string> all = vBtfMeetingRelays; 180 vector<string> all = vBtfMeetingRelays;
181 if (fBtfRelayPinned)
182 return all;
175 CRITICAL_BLOCK(cs_discoveredRelays) 183 CRITICAL_BLOCK(cs_discoveredRelays)
176 foreach(const string& r, g_discoveredRelays) 184 foreach(const string& r, g_discoveredRelays)
177 if (find(all.begin(), all.end(), r) == all.end()) 185 if (find(all.begin(), all.end(), r) == all.end())