From 5caabc1dddb25a8560185d260b2e4d59466b6ed2 Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Mon, 16 Feb 2026 15:45:44 +1100 Subject: [PATCH 1/6] improve readme, add bootstrap node --- README.md | 13 +++++++++++-- examples/downloader.c | 4 ++-- examples/uploader.c | 6 +++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 469bed3..7a9a586 100644 --- a/README.md +++ b/README.md @@ -86,14 +86,23 @@ Commands: `help`, `start`, `stop`, `upload`, `download`, `quit`. ### uploader / downloader -Standalone programs that demonstrate file sharing between two nodes. On one machine, start the uploader: +Standalone programs that demonstrate file sharing between two nodes. + +Optionally generate a file to upload. For example, using `dd` on nix-based systems: + +```bash +# generate a 500MB file with random contents +dd if=/dev/urandom of=myfile.txt bs=1048576 count=500 +``` + +On one machine, start the uploader, passing in the path to a file to upload: ```bash ./build/uploader ./myfile.txt # prints: Run: downloader ./output-file ``` -On another (or the same machine), run the downloader with the printed values: +In another terminal, run the downloader with the printed values: ```bash ./build/downloader ./output-file diff --git a/examples/downloader.c b/examples/downloader.c index 79482c0..203d20b 100644 --- a/examples/downloader.c +++ b/examples/downloader.c @@ -28,8 +28,8 @@ int main(int argc, char *argv[]) { .api_port = 8081, .disc_port = 9091, .data_dir = "./downloader-data", - .log_level = "INFO", - .bootstrap_node = spr, + .log_level = "TRACE", + .bootstrap_node = "spr:CiUIAhIhA-VlcoiRm02KyIzrcTP-ljFpzTljfBRRKTIvhMIwqBqWEgIDARpJCicAJQgCEiED5WVyiJGbTYrIjOtxM_6WMWnNOWN8FFEpMi-EwjCoGpYQs8n8wQYaCwoJBHTKubmRAnU6GgsKCQR0yrm5kQJ1OipHMEUCIQDwUNsfReB4ty7JFS5WVQ6n1fcko89qVAOfQEHixa03rgIgan2-uFNDT-r4s9TOkLe9YBkCbsRWYCHGGVJ25rLj0QE", .nat = "none", }; diff --git a/examples/uploader.c b/examples/uploader.c index 883cef9..44656a9 100644 --- a/examples/uploader.c +++ b/examples/uploader.c @@ -24,7 +24,7 @@ int main(int argc, char *argv[]) { .api_port = 8080, .disc_port = 9090, .data_dir = "./uploader-data", - .log_level = "INFO", + .log_level = "TRACE", .bootstrap_node = NULL, .nat = "none", }; @@ -40,8 +40,8 @@ int main(int argc, char *argv[]) { char *spr = e_storage_spr(node); if (spr == NULL) panic("Failed to obtain node's Signed Peer Record (SPR)"); - printf("Run: downloader %s %s ./output-file\n", spr, cid); - printf("\nPress Enter to exit\n"); + printf("Run: ./build/downloader %s %s ./output-file\n", spr, cid); + printf("\nKeep running while downloading.\n\nPress Enter to exit when finished.\n"); getchar(); printf("Deleting file (this could take a while)..."); From 6fe42327b44bd65fad904755f42f57044144d8b6 Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Mon, 16 Feb 2026 16:02:23 +1100 Subject: [PATCH 2/6] change the bootstrap spr in uploader --- examples/uploader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/uploader.c b/examples/uploader.c index 44656a9..4b241e8 100644 --- a/examples/uploader.c +++ b/examples/uploader.c @@ -25,7 +25,7 @@ int main(int argc, char *argv[]) { .disc_port = 9090, .data_dir = "./uploader-data", .log_level = "TRACE", - .bootstrap_node = NULL, + .bootstrap_node = "spr:CiUIAhIhA-VlcoiRm02KyIzrcTP-ljFpzTljfBRRKTIvhMIwqBqWEgIDARpJCicAJQgCEiED5WVyiJGbTYrIjOtxM_6WMWnNOWN8FFEpMi-EwjCoGpYQs8n8wQYaCwoJBHTKubmRAnU6GgsKCQR0yrm5kQJ1OipHMEUCIQDwUNsfReB4ty7JFS5WVQ6n1fcko89qVAOfQEHixa03rgIgan2-uFNDT-r4s9TOkLe9YBkCbsRWYCHGGVJ25rLj0QE", .nat = "none", }; From 12a063b1c055efe06fa0a2a43526260be1209b2d Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Mon, 16 Feb 2026 21:32:46 +1100 Subject: [PATCH 3/6] set listen addrs for discovery, try diff bootstrap node --- easystorage.c | 4 ++++ easystorage.h | 1 + examples/downloader.c | 3 ++- examples/uploader.c | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/easystorage.c b/easystorage.c index 2498004..11aa795 100644 --- a/easystorage.c +++ b/easystorage.c @@ -180,6 +180,10 @@ STORAGE_NODE e_storage_new(node_config config) { pos += snprintf(json + pos, sizeof(json) - pos, ",\"bootstrap-node\":[\"%s\"]", config.bootstrap_node); } + if (config.listen_addr) { + pos += snprintf(json + pos, sizeof(json) - pos, ",\"listen-addrs\":[\"%s\"]", config.listen_addr); + } + if (config.nat) { pos += snprintf(json + pos, sizeof(json) - pos, ",\"nat\":\"%s\"", config.nat); } diff --git a/easystorage.h b/easystorage.h index d952a54..820c615 100644 --- a/easystorage.h +++ b/easystorage.h @@ -13,6 +13,7 @@ typedef struct { char *data_dir; char *log_level; char *bootstrap_node; + char *listen_addr; char *nat; } node_config; diff --git a/examples/downloader.c b/examples/downloader.c index 203d20b..15d602c 100644 --- a/examples/downloader.c +++ b/examples/downloader.c @@ -29,7 +29,8 @@ int main(int argc, char *argv[]) { .disc_port = 9091, .data_dir = "./downloader-data", .log_level = "TRACE", - .bootstrap_node = "spr:CiUIAhIhA-VlcoiRm02KyIzrcTP-ljFpzTljfBRRKTIvhMIwqBqWEgIDARpJCicAJQgCEiED5WVyiJGbTYrIjOtxM_6WMWnNOWN8FFEpMi-EwjCoGpYQs8n8wQYaCwoJBHTKubmRAnU6GgsKCQR0yrm5kQJ1OipHMEUCIQDwUNsfReB4ty7JFS5WVQ6n1fcko89qVAOfQEHixa03rgIgan2-uFNDT-r4s9TOkLe9YBkCbsRWYCHGGVJ25rLj0QE", + .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", + .listen_addr = "/ip4/127.0.0.1/tcp/65032", .nat = "none", }; diff --git a/examples/uploader.c b/examples/uploader.c index 4b241e8..a82c801 100644 --- a/examples/uploader.c +++ b/examples/uploader.c @@ -25,7 +25,8 @@ int main(int argc, char *argv[]) { .disc_port = 9090, .data_dir = "./uploader-data", .log_level = "TRACE", - .bootstrap_node = "spr:CiUIAhIhA-VlcoiRm02KyIzrcTP-ljFpzTljfBRRKTIvhMIwqBqWEgIDARpJCicAJQgCEiED5WVyiJGbTYrIjOtxM_6WMWnNOWN8FFEpMi-EwjCoGpYQs8n8wQYaCwoJBHTKubmRAnU6GgsKCQR0yrm5kQJ1OipHMEUCIQDwUNsfReB4ty7JFS5WVQ6n1fcko89qVAOfQEHixa03rgIgan2-uFNDT-r4s9TOkLe9YBkCbsRWYCHGGVJ25rLj0QE", + .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", + .listen_addr = "/ip4/127.0.0.1/tcp/65032", .nat = "none", }; From e3aa09cf579ea34b5e21fa3bb2396dbbf3c349c4 Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Mon, 16 Feb 2026 21:55:05 +1100 Subject: [PATCH 4/6] remove nat option so it defaults to upnp note to self: this should probably be more explicitly set --- examples/downloader.c | 1 - examples/uploader.c | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/downloader.c b/examples/downloader.c index 15d602c..2c46523 100644 --- a/examples/downloader.c +++ b/examples/downloader.c @@ -31,7 +31,6 @@ int main(int argc, char *argv[]) { .log_level = "TRACE", .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", .listen_addr = "/ip4/127.0.0.1/tcp/65032", - .nat = "none", }; STORAGE_NODE node = e_storage_new(cfg); diff --git a/examples/uploader.c b/examples/uploader.c index a82c801..4b9d436 100644 --- a/examples/uploader.c +++ b/examples/uploader.c @@ -27,7 +27,6 @@ int main(int argc, char *argv[]) { .log_level = "TRACE", .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", .listen_addr = "/ip4/127.0.0.1/tcp/65032", - .nat = "none", }; char *filepath = argv[1]; From 89ddbe3866fd96265a64c01761a8e673302164e5 Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Mon, 16 Feb 2026 22:23:50 +1100 Subject: [PATCH 5/6] change listen addr so it binds to all addresses, not just localhost --- examples/downloader.c | 2 +- examples/uploader.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/downloader.c b/examples/downloader.c index 2c46523..3018dd7 100644 --- a/examples/downloader.c +++ b/examples/downloader.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) { .data_dir = "./downloader-data", .log_level = "TRACE", .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", - .listen_addr = "/ip4/127.0.0.1/tcp/65032", + .listen_addr = "/ip4/0.0.0.0/tcp/65032", }; STORAGE_NODE node = e_storage_new(cfg); diff --git a/examples/uploader.c b/examples/uploader.c index 4b9d436..a72d6ab 100644 --- a/examples/uploader.c +++ b/examples/uploader.c @@ -26,7 +26,7 @@ int main(int argc, char *argv[]) { .data_dir = "./uploader-data", .log_level = "TRACE", .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", - .listen_addr = "/ip4/127.0.0.1/tcp/65032", + .listen_addr = "/ip4/0.0.0.0/tcp/65032", }; char *filepath = argv[1]; From 2855c573630a71cea2b2de10123cadb0541c4cf3 Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Mon, 23 Feb 2026 21:24:51 +1100 Subject: [PATCH 6/6] Add remote and local peer connection instructions --- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a9a586..e55bf4e 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ Optionally generate a file to upload. For example, using `dd` on nix-based syste dd if=/dev/urandom of=myfile.txt bs=1048576 count=500 ``` -On one machine, start the uploader, passing in the path to a file to upload: +In one terminal, start the uploader, passing in the path to a file to upload: ```bash ./build/uploader ./myfile.txt @@ -108,6 +108,64 @@ In another terminal, run the downloader with the printed values: ./build/downloader ./output-file ``` +#### Connecting to remote peers + +To run the uploader/downloader example, but connect to peers remotely, the config will need to be updated before it will work. + +##### UPnP / PMP + +The easiest way to connect to remote peers is to enable UPnP or PMP in your router. Once this is enabled, update the config to: + +```c +// uploader.c + node_config cfg = { + .api_port = 8080, + .disc_port = 9090, + .data_dir = "./uploader-data", + .log_level = "TRACE", + .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", + .nat = "upnp" // or "pmp" or "any", +}; + +// downlaoder.c +node_config cfg = { + .api_port = 8081, + .disc_port = 9091, + .data_dir = "./downloader-data", + .log_level = "TRACE", + .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", + .nat = "upnp" // or "pmp" or "any", +}; +``` + +By specifying a common bootstrap node, the uploader and downloader will be able to share DHT entries. Specifically, the uploader will announce itself as a provider for the CID in the DHT to its closes neighbours (the bootstrap node), and the downloader will be able to traverse its closest peers when finding a provider for the CID. + +#### Connecting to peers on the same network or machine + +To connect to peers locally, the same config updates need to be made, except now, `nat` should be set to `none`: + +```c +// uploader.c + node_config cfg = { + .api_port = 8080, + .disc_port = 9090, + .data_dir = "./uploader-data", + .log_level = "TRACE", + .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", + .nat = "none" +}; + +// downlaoder.c +node_config cfg = { + .api_port = 8081, + .disc_port = 9091, + .data_dir = "./downloader-data", + .log_level = "TRACE", + .bootstrap_node = "spr:CiUIAhIhApIj9p6zJDRbw2NoCo-tj98Y760YbppRiEpGIE1yGaMzEgIDARpJCicAJQgCEiECkiP2nrMkNFvDY2gKj62P3xjvrRhumlGISkYgTXIZozMQvcz8wQYaCwoJBAWhF3WRAnVEGgsKCQQFoRd1kQJ1RCpGMEQCIFZB84O_nzPNuViqEGRL1vJTjHBJ-i5ZDgFL5XZxm4HAAiB8rbLHkUdFfWdiOmlencYVn0noSMRHzn4lJYoShuVzlw", + .nat = "none" +}; +``` + ## Testing ```bash