diff options
| author | Bitflash <btf01@proton.me> | 2026-07-29 11:52:12 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-29 11:52:12 -0300 |
| commit | 96a8e42bbc313f96d54377ae5886da84298e61a3 (patch) | |
| tree | 36bcd61016ee03c90140b407d4e5863a282e78cf /src/main_gui.cpp | |
| parent | 7f6fdbab6c90360ab3b2d391a7b5aedc6f9721ac (diff) | |
Remember .btf peers that answered, and dial them first on start (#25)
* net: remember .btf peers that answered, and dial them first on start
Discovery depends entirely on the Nostr relays. A node that has been up
for hours knows exactly which peers respond, and throws all of it away on
exit; the next start reaches for the relays again and walks the same
descriptor list, of which roughly 96% is dead. That is what makes a
restart take minutes before the first tunnel opens -- measured today at
about seven.
Every peer that completes a tunnel is now written to btfpeers.json with
its meeting node and encryption key, which is everything needed to redial
it. On start a thread tries those before the relays have answered
anything, stopping once eight are connected. Entries older than a week
are dropped, and the file holds at most fifty.
Cache only: nothing here changes how a first-ever run bootstraps, and a
missing or corrupt file just falls through to relay discovery.
* net: exchange signed .btf descriptors between peers
Discovery has depended entirely on the Nostr relays. Two connected nodes never
told each other who else existed, so a relay outage left a running network
unable to grow, and a node that found one stale peer had no way to learn there
was anything better. The old `addr` gossip went out with the IRC seed.
Peers now trade signed descriptors over a new "btfpeers" message: our own
first, then peers that actually answered us. The receiver checks each Schnorr
signature against the key the `.btf` address decodes to, so the sender is
trusted for nothing -- forging an entry needs somebody else's secret key. That
leaves flooding with self-generated keys, which the per-message caps and the
"peers that answered" ordering are there to blunt.
Unknown commands are ignored (main.cpp), so nodes without this just drop the
message; nothing here is a protocol break.
The cache from the peer-cache change now keeps each peer's descriptor verbatim
alongside the parsed fields, because that signature is what makes a peer
relayable. Entries without one -- resolved through Nostr, or written before
this -- stay dialable, just not passed on. A dial never clears a descriptor
already on file.
* main_gui: implement /port, which net.cpp already documented
net.cpp has said nListenPort is "tunable via /port" since it was written, but
nothing ever parsed the option. Two nodes could not share a machine, which is
exactly what testing peer exchange needs. Sets addrLocalHost.port too, so we
do not advertise a port we never bound.
Diffstat (limited to 'src/main_gui.cpp')
| -rw-r--r-- | src/main_gui.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 842b0d5..edc772d 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp | |||
| @@ -58,6 +58,7 @@ static void PrintUsage() | |||
| 58 | printf(" /connectbtf=PEER_BTF_ADDRESS\n"); | 58 | printf(" /connectbtf=PEER_BTF_ADDRESS\n"); |
| 59 | printf(" /rvrelay=HOST:PORT\n"); | 59 | printf(" /rvrelay=HOST:PORT\n"); |
| 60 | printf(" /announcerelay=HOST:PORT\n"); | 60 | printf(" /announcerelay=HOST:PORT\n"); |
| 61 | printf(" /port=N (P2P listen port, default 8433)\n"); | ||
| 61 | printf("\n"); | 62 | printf("\n"); |
| 62 | printf("Each option also accepts '-' instead of '/'.\n"); | 63 | printf("Each option also accepts '-' instead of '/'.\n"); |
| 63 | } | 64 | } |
| @@ -113,6 +114,23 @@ static void ParseStartupArguments(int argc, char* argv[]) | |||
| 113 | string announceRelay = argval2(argc, argv, "/announcerelay", "-announcerelay"); | 114 | string announceRelay = argval2(argc, argv, "/announcerelay", "-announcerelay"); |
| 114 | if (!announceRelay.empty()) | 115 | if (!announceRelay.empty()) |
| 115 | strBtfAnnounceRelay = announceRelay; | 116 | strBtfAnnounceRelay = announceRelay; |
| 117 | |||
| 118 | // net.cpp has claimed nListenPort was "tunable via /port" since it was | ||
| 119 | // written, but nothing ever read the option. Without it a second node | ||
| 120 | // cannot start on a machine that already runs one -- which is exactly what | ||
| 121 | // testing peer exchange needs. | ||
| 122 | string strPort = argval2(argc, argv, "/port", "-port"); | ||
| 123 | if (!strPort.empty()) | ||
| 124 | { | ||
| 125 | int nPort = atoi(strPort.c_str()); | ||
| 126 | if (nPort <= 0 || nPort > 65535) | ||
| 127 | fprintf(stderr, "Ignoring /port=%s: not a port number\n", strPort.c_str()); | ||
| 128 | else | ||
| 129 | { | ||
| 130 | nListenPort = htons((unsigned short)nPort); | ||
| 131 | addrLocalHost.port = nListenPort; // or we advertise a port we never bound | ||
| 132 | } | ||
| 133 | } | ||
| 116 | } | 134 | } |
| 117 | 135 | ||
| 118 | int main(int argc, char* argv[]) | 136 | int main(int argc, char* argv[]) |