diff --git a/.gitignore b/.gitignore index 2f2fd2771..f68f7d526 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ aider_stdlib_map.md # Local tools and notes .local-tools/ +*.local.md +*.local/ # Release artifacts (downloaded binaries) release-artifacts/ diff --git a/CLAUDE.local.md b/CLAUDE.local.md deleted file mode 100644 index ab3de5c02..000000000 --- a/CLAUDE.local.md +++ /dev/null @@ -1,95 +0,0 @@ -- contract states are commutative monoids, they can be "merged" in any order to arrive at the same result. This may reduce some potential race conditions. - -## Transport Layer Key Management Issues (2025-01-06) - -### Problem -Integration test `test_put_contract` was failing with "Failed to decrypt packet" errors after v0.1.5 deployment to production. The same decryption failures were affecting the River app in production. - -### Root Cause -The transport layer was incorrectly handling symmetric key establishment for gateway connections: - -1. **Gateway connection key misuse**: Gateway was using different keys for inbound/outbound when it should use the same client key for both directions -2. **Client ACK encryption error**: Client was encrypting its final ACK response with the gateway's key instead of its own key -3. **Packet routing overflow**: When existing connection channels became full, packets were misrouted to new gateway connection handlers instead of waiting - -### Key Protocol Rules -- **Gateway connections**: Use the same symmetric key (client's key) for both inbound and outbound communication -- **Peer-to-peer connections**: Use different symmetric keys for each direction (each peer's own inbound key) -- **Connection establishment**: Only initial gateway connections and explicit connect operations should create new connections -- **PUT/GET/SUBSCRIBE/UPDATE operations**: Should only use existing active connections, never create new ones - -### Fixes Applied - -#### 1. Gateway Connection Key Fix (`crates/core/src/transport/connection_handler.rs:578-584`) -```rust -// For gateway connections, use the same key for both directions -let inbound_key = outbound_key.clone(); -let outbound_ack_packet = SymmetricMessage::ack_ok( - &outbound_key, - outbound_key_bytes.try_into().unwrap(), - remote_addr, -)?; -``` - -#### 2. Client ACK Response Fix (`crates/core/src/transport/connection_handler.rs:798-811`) -```rust -// Use our own key to encrypt the ACK response (same key for both directions with gateway) -outbound_packets - .send(( - remote_addr, - SymmetricMessage::ack_ok( - &inbound_sym_key, // Use our own key, not the gateway's - inbound_sym_key_bytes, - remote_addr, - )? - .prepared_send(), - )) - .await - .map_err(|_| TransportError::ChannelClosed)?; -``` - -#### 3. Packet Sending Consistency (`crates/core/src/transport/connection_handler.rs:740-747`) -```rust -let packet_to_send = our_inbound.prepared_send(); -outbound_packets - .send((remote_addr, packet_to_send.clone())) - .await - .map_err(|_| TransportError::ChannelClosed)?; -sent_tracker - .report_sent_packet(SymmetricMessage::FIRST_PACKET_ID, packet_to_send); -``` - -### Testing -- Created specialized transport tests in `crates/core/src/transport/test_gateway_handshake.rs` -- `test_gateway_handshake_symmetric_key_usage()`: Verifies gateway connections use same key for both directions -- `test_peer_to_peer_different_keys()`: Verifies peer-to-peer connections use different keys -- Both specialized tests pass, confirming the transport layer fixes work correctly - -### Root Cause Analysis Complete - -#### PUT Operation Connection Creation Issue -**Location**: `crates/core/src/node/network_bridge/p2p_protoc.rs:242-291` - -**Problem**: PUT/GET/SUBSCRIBE/UPDATE operations create new connections when no existing connection is found, violating the protocol rule that these operations should only use existing active connections. - -**Behavior**: When `NetworkBridge.send()` is called and no existing connection exists: -1. System logs warning: "No existing outbound connection, establishing connection first" -2. Creates new connection via `NodeEvent::ConnectPeer` -3. Waits up to 5 seconds for connection establishment -4. Attempts to send message on newly created connection - -**Channel Overflow Root Cause**: Channels fill up due to throughput mismatch: -- **Fast UDP ingress**: Socket receives packets quickly -- **Slow application processing**: `peer_connection_listener` processes one message at a time sequentially -- **Limited buffering**: 100-packet channel buffer insufficient for high-throughput scenarios -- **No flow control**: System creates new connections instead of implementing proper backpressure - -**Cascade Effect**: Channel overflow → packet misrouting → wrong connection handlers → decryption failures → new connection creation - -#### Required Fix -The network bridge should fail gracefully or retry with existing connections instead of creating new ones for PUT/GET/SUBSCRIBE/UPDATE operations. Only initial gateway connections and explicit CONNECT operations should establish new connections. - -### Next Steps -1. Modify PUT/GET operation handling to use only existing connections -2. Implement proper backpressure handling for full channels instead of creating new connections -3. Test that integration test `test_put_contract` passes after the fix \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index 434fbfa8d..c1d395a3a 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,10 +1,10 @@ # How Freenet Licensing Works While `freenet-core` is licensed under the GNU Affero General Public -License (AGPL), this does *not* mean that all software built on Freenet +License (AGPL), this does _not_ mean that all software built on Freenet must also be AGPL-licensed. -Applications that *use* Freenet—such as apps published to the network or +Applications that _use_ Freenet—such as apps published to the network or clients that connect to it—are typically built against `freenet-stdlib`, which is licensed under the more permissive LGPL. This means your app can be licensed however you choose, including under a permissive or proprietary @@ -236,23 +236,23 @@ produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: -- a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. -- b) The work must carry prominent notices stating that it is - released under this License and any conditions added under - section 7. This requirement modifies the requirement in section 4 - to "keep intact all notices". -- c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. -- d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, @@ -271,42 +271,42 @@ sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: -- a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. -- b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the Corresponding - Source from a network server at no charge. -- c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. -- d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. -- e) Convey the object code using peer-to-peer transmission, - provided you inform other peers where the object code and - Corresponding Source of the work are being offered to the general - public at no charge under subsection 6d. +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be @@ -382,23 +382,23 @@ Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: -- a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or -- b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or -- c) Prohibiting misrepresentation of the origin of that material, - or requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or -- d) Limiting the use for publicity purposes of names of licensors - or authors of the material; or -- e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or -- f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions - of it) with contractual assumptions of liability to the recipient, - for any liability that these contractual assumptions directly - impose on those licensors and authors. +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you diff --git a/README.md b/README.md index 487c7d62d..75811b8e4 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,20 @@ -This is the freenet-core repository. To learn more about Freenet please visit our website +This is the freenet-core repository. To learn more about Freenet please visit our website at [freenet.org](https://freenet.org/). # Decentralize Everything -Freenet is the internet as it should be—fully decentralized, designed to put you back in control. Imagine a global shared -computer where you can communicate and collaborate freely, without reliance on big tech. Freenet lets you regain your +Freenet is the internet as it should be—fully decentralized, designed to put you back in control. Imagine a global shared +computer where you can communicate and collaborate freely, without reliance on big tech. Freenet lets you regain your digital independence. -Freenet is a peer-to-peer network that transforms users’ computers into a resilient, distributed platform on which anyone -can build decentralized services. Every peer contributes to a fault-tolerant collective, ensuring services are always +Freenet is a peer-to-peer network that transforms users’ computers into a resilient, distributed platform on which anyone +can build decentralized services. Every peer contributes to a fault-tolerant collective, ensuring services are always available and robust. -Today’s web is a series of siloed services, but every system built on Freenet is fully interoperable by default. Freenet +Today’s web is a series of siloed services, but every system built on Freenet is fully interoperable by default. Freenet apps can be built with popular web frameworks, accessed through any browser just like the web. ## Build Instructions diff --git a/apps/freenet-email-app/README.md b/apps/freenet-email-app/README.md index 2dfa69d0a..98abbc5ec 100644 --- a/apps/freenet-email-app/README.md +++ b/apps/freenet-email-app/README.md @@ -37,7 +37,9 @@ local node, which simulates a node on the network. ```bash git submodule update --init --recursive ``` + ### Note about MacOS + Email account creation currently does not work on MacOS ## Prepare the Freenet email contracts and delegates @@ -59,6 +61,7 @@ This delegate is located inside the modules folder of freenet-core: - ... Add the target directory for the project. This should be an absolute file path to freenet-core/target. + ```bash export CARGO_TARGET_DIR="... freenet-core/target" ``` diff --git a/apps/freenet-microblogging/README.md b/apps/freenet-microblogging/README.md index 693db9b19..74cf8f261 100644 --- a/apps/freenet-microblogging/README.md +++ b/apps/freenet-microblogging/README.md @@ -31,23 +31,23 @@ Prepare the microblogging app web and posts contracts. The app is located inside the `apps/freenet-microblogging` folder: - `freenet-core/` - - `apps/` - - `freenet-microblogging/` <-- this folder contains the microblogging app - - `contracts/` <-- this folder contains the contract source code - - `posts/` <-- this folder contains the posts contract - - `build/` <-- the generated folder that contains the compiled contract binary with version + wasm - code - - `src/` <-- this folder contains the source code of the contract - - ... - - `web/` <-- this folder contains the web app source code, web app built with node and webpack - - `build/` <-- the generated folder that contains the compiled web app binary with version + wasm - code - - `container/` <-- this folder contains the web contract container, a simple contract associated - with the web app, as the state. - - `src/` <-- this folder contains the source code of the web app - - ... - - `Makefile` <-- this file contains the build instructions for building and running the web app, and - the local node. + - `apps/` + - `freenet-microblogging/` <-- this folder contains the microblogging app + - `contracts/` <-- this folder contains the contract source code + - `posts/` <-- this folder contains the posts contract + - `build/` <-- the generated folder that contains the compiled contract binary with version + wasm + code + - `src/` <-- this folder contains the source code of the contract + - ... + - `web/` <-- this folder contains the web app source code, web app built with node and webpack + - `build/` <-- the generated folder that contains the compiled web app binary with version + wasm + code + - `container/` <-- this folder contains the web contract container, a simple contract associated + with the web app, as the state. + - `src/` <-- this folder contains the source code of the web app + - ... + - `Makefile` <-- this file contains the build instructions for building and running the web app, and + the local node. To build the microblogging application, go to the `apps/freenet-microblogging` folder and run the following command: diff --git a/apps/freenet-ping/README.md b/apps/freenet-ping/README.md index d6b2f21fa..74c977553 100644 --- a/apps/freenet-ping/README.md +++ b/apps/freenet-ping/README.md @@ -85,23 +85,28 @@ This project includes two Makefiles to help you set up and run a local Freenet n - `run-ping.mk`: Builds and runs the ping application. ### Start Local Network + 1. Navigate to the `freenet-core/scripts` directory: + ```bash cd freenet-core/scripts ``` 2. First, clean any previous setup and create necessary directories: + ```bash make -f local-network.mk clean make -f local-network.mk setup N_GATEWAYS=1 N_NODES=2 ``` 3. Start the gateway: + ```bash make -f local-network.mk start-gateways N_GATEWAYS=1 ``` 4. Start the nodes: + ```bash make -f local-network.mk start-nodes N_NODES=2 ``` @@ -112,6 +117,7 @@ This project includes two Makefiles to help you set up and run a local Freenet n ``` The network will be configured with: + - 1 Gateway on port 3101 - Node 1: WebSocket port 3001, Network port 3102 - Node 2: WebSocket port 3002, Network port 3103 @@ -135,26 +141,30 @@ make -f local-network.mk clean ## Build and Run Ping 1. Navigate to the `freenet-core/apps/freenet-ping` directory: + ```bash cd freenet-core/apps/freenet-ping ``` 1. View available options: + ```bash make -f run-ping.mk help ``` -2. Build the contract and application: +1. Build the contract and application: + ```bash make -f run-ping.mk build ``` -3. Run ping towards node 1: +1. Run ping towards node 1: ```bash make -f run-ping.mk run WS_PORT=3001 ``` You will see something like this: + ```bash 2024-05-14T15:33:20.685412Z INFO freenet_ping: 154: put ping contract successfully! key=Cuj4LbFao6vzZ5VtvZAKZ64Y99qNh7MpTUdaCcEkU4oR 2024-05-14T15:33:20.729883Z INFO freenet_ping: 146: Hello, ubiquitous-letters! @@ -163,6 +173,7 @@ You will see something like this: ``` You can customize the ping behavior with these parameters: + ```bash make -f run-ping.mk run WS_PORT=3001 FREQUENCY=2000 TTL=7200 ``` @@ -182,4 +193,4 @@ make -f run-ping.mk clean ## Feedback -If you encounter any issues please let us know in our [Matrix](https://matrix.to/#/#freenet-locutus:matrix.org) channel or by submitting a [Github Issue](https://github.com/freenet/freenet-core/issues). \ No newline at end of file +If you encounter any issues please let us know in our [Matrix](https://matrix.to/#/#freenet-locutus:matrix.org) channel or by submitting a [Github Issue](https://github.com/freenet/freenet-core/issues). diff --git a/crates/core/LICENSE.md b/crates/core/LICENSE.md index 434fbfa8d..c1d395a3a 100644 --- a/crates/core/LICENSE.md +++ b/crates/core/LICENSE.md @@ -1,10 +1,10 @@ # How Freenet Licensing Works While `freenet-core` is licensed under the GNU Affero General Public -License (AGPL), this does *not* mean that all software built on Freenet +License (AGPL), this does _not_ mean that all software built on Freenet must also be AGPL-licensed. -Applications that *use* Freenet—such as apps published to the network or +Applications that _use_ Freenet—such as apps published to the network or clients that connect to it—are typically built against `freenet-stdlib`, which is licensed under the more permissive LGPL. This means your app can be licensed however you choose, including under a permissive or proprietary @@ -236,23 +236,23 @@ produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: -- a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. -- b) The work must carry prominent notices stating that it is - released under this License and any conditions added under - section 7. This requirement modifies the requirement in section 4 - to "keep intact all notices". -- c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. -- d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, @@ -271,42 +271,42 @@ sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: -- a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. -- b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the Corresponding - Source from a network server at no charge. -- c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. -- d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. -- e) Convey the object code using peer-to-peer transmission, - provided you inform other peers where the object code and - Corresponding Source of the work are being offered to the general - public at no charge under subsection 6d. +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be @@ -382,23 +382,23 @@ Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: -- a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or -- b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or -- c) Prohibiting misrepresentation of the origin of that material, - or requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or -- d) Limiting the use for publicity purposes of names of licensors - or authors of the material; or -- e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or -- f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions - of it) with contractual assumptions of liability to the recipient, - for any liability that these contractual assumptions directly - impose on those licensors and authors. +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you diff --git a/crates/core/architecture.md b/crates/core/architecture.md index 0bee0e8a5..ac623c5e4 100644 --- a/crates/core/architecture.md +++ b/crates/core/architecture.md @@ -12,7 +12,7 @@ graph LR Server[Server] --> WebSocket WebSocket -->|"Messages"| ClientEvents Server -->|"ClientConnection"| ClientEvents - + %% Central Node Event Loop subgraph NodeLoop[Node Event Loop] Node[Node] @@ -52,14 +52,14 @@ graph LR ContractHandler -->|"Execute"| Executor Executor -->|"WASM"| WasmRuntime Executor -->|"State"| StateStore - + subgraph ExecutorLoop[Executor Callback Loop] ExecutorEvents[Executor Event Handler] ExecutorCallback[Callback Channel] ExecutorEvents -->|"Tx ID"| ExecutorCallback ExecutorCallback -->|"Results"| ExecutorEvents end - + Executor --> ExecutorEvents ExecutorCallback --> OpManager @@ -76,7 +76,7 @@ graph LR HandshakeHandler --> ConnManager ConnManager --> HandshakeHandler end - + NetworkBridge --> NetworkLoop NetworkLoop --> Ring NetworkLoop --> Transport @@ -89,44 +89,44 @@ graph LR %% Client Interface Layer classDef clientInterface fill:#c6dcef,stroke:#2874a6,stroke-width:1px,color:#000; class Client,WebSocket,Server,ClientEvents clientInterface; - + %% Node Core classDef nodeCore fill:#d5f5e3,stroke:#1e8449,stroke-width:1px,color:#000; class Node,EventChannelIn,EventChannelOut nodeCore; - + %% Operations classDef operations fill:#fdebd0,stroke:#d35400,stroke-width:1px,color:#000; class OpManager,OpMachines,OpChannelIn,OpChannelOut operations; - + %% Contracts classDef contracts fill:#e8daef,stroke:#8e44ad,stroke-width:1px,color:#000; class ContractHandler,Executor,WasmRuntime,StateStore,ExecutorEvents,ExecutorCallback contracts; - + %% Network - Changed to a more distinct teal color classDef network fill:#d1f2eb,stroke:#16a085,stroke-width:1px,color:#000; class NetworkBridge,HandshakeHandler,ConnManager,Ring,Transport,NetMessage,Peers network; - + %% Event Loops classDef eventLoop fill:#f9e79f,stroke:#f39c12,stroke-width:2px; class NodeLoop,OpLoop,ExecutorLoop,NetworkLoop eventLoop; - + %% Boundary classDef boundary fill:#ebf5fb,stroke:#3498db,stroke-width:2px; class Core boundary; - + %% Link Styling - Colored by SOURCE component - Fixed version %% Client Interface links (blue) linkStyle 0,1,2,3,6 stroke:#2874a6,stroke-width:2px; - + %% Node Core links (green) linkStyle 4,5,10,11,12,13 stroke:#1e8449,stroke-width:2px; - - %% Operation links (orange) + + %% Operation links (orange) linkStyle 7,14,15,16,17,18 stroke:#d35400,stroke-width:2px; - + %% Contract links (purple) linkStyle 8,19,20,21,22,23,24 stroke:#8e44ad,stroke-width:2px; - + %% Network links - Changed to teal linkStyle 9,25,26,27,28 stroke:#16a085,stroke-width:2px; ``` @@ -135,7 +135,7 @@ graph LR - **[Server](src/server/mod.rs):** Handles HTTP and WebSocket endpoints for client connections. The `ClientConnection` enum in [http_gateway.rs](src/server/http_gateway.rs) defines the interface between the server and client events system. The server manages the WebSocket API and passes client requests to the ClientEvents subsystem. -- **[Node](src/node.rs):** Central coordinator with the main event loop implemented in `run_event_loop()`. This function contains the core `tokio::select!` loop that dispatches events to appropriate handlers like `handle_network_message()`, `handle_node_event()`, and `handle_client_request()`. +- **[Node](src/node.rs):** Central coordinator with the main event loop implemented in `run_event_loop()`. This function contains the core `tokio::select!` loop that dispatches events to appropriate handlers like `handle_network_message()`, `handle_node_event()`, and `handle_client_request()`. - **[ClientEvents](src/client_events/mod.rs):** Bridges client connections to the Node system through the `ClientEventsProxy` trait in [mod.rs](src/client_events/mod.rs). The WebSocket implementation in [websocket.rs](src/client_events/websocket.rs) provides key methods like `websocket_interface()` and `process_client_request()` that handle client connections. @@ -174,34 +174,40 @@ graph LR A typical client request follows this path through the system: 1. **Client Initiation** + - Client connects to the WebSocket endpoint at `/v1/contract/command` - `websocket_commands()` in `client_events/websocket.rs` handles the connection - Client sends a `ClientRequest` (e.g., `ContractRequest::Get{key}`) 2. **Request Processing** + - `process_client_request()` deserializes the request and assigns a `ClientId` - `WebSocketProxy.recv()` wraps it in an `OpenRequest` and sends to the Node - Node receives the request in `handle_client_request()` and determines the type 3. **Operation Creation** + - For GET requests: Node calls `get::start_op()` to create a new `GetOp` - `OpManager.push()` stores the operation state in its collections - Node initiates the operation with `get::request_get()` - A unique `Transaction` ID is assigned to track this operation 4. **Network Traversal** + - `OpManager` determines the target peer based on the contract key's location - It constructs a `NetMessage::V1(NetMessageV1::Get(GetMsg::...))` - `NetworkBridge.send()` delivers this to the target peer - `P2pConnManager` sends the actual network packet via `UdpSocket.send_to()` 5. **Remote Processing** + - The receiving peer's `NetworkBridge` gets the message via `UdpSocket.recv_from()` - `P2pConnManager.process_message()` forwards to Node's event loop - Remote Node processes the Get request in its contract subsystem - If the contract exists, a response message is created and sent back 6. **Response Handling** + - Local `NetworkBridge` receives the response message - Node event loop processes it in `handle_network_message()` - Message is matched to pending `Transaction` via its ID diff --git a/crates/fdev/LICENSE.md b/crates/fdev/LICENSE.md index 434fbfa8d..c1d395a3a 100644 --- a/crates/fdev/LICENSE.md +++ b/crates/fdev/LICENSE.md @@ -1,10 +1,10 @@ # How Freenet Licensing Works While `freenet-core` is licensed under the GNU Affero General Public -License (AGPL), this does *not* mean that all software built on Freenet +License (AGPL), this does _not_ mean that all software built on Freenet must also be AGPL-licensed. -Applications that *use* Freenet—such as apps published to the network or +Applications that _use_ Freenet—such as apps published to the network or clients that connect to it—are typically built against `freenet-stdlib`, which is licensed under the more permissive LGPL. This means your app can be licensed however you choose, including under a permissive or proprietary @@ -236,23 +236,23 @@ produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: -- a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. -- b) The work must carry prominent notices stating that it is - released under this License and any conditions added under - section 7. This requirement modifies the requirement in section 4 - to "keep intact all notices". -- c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. -- d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, @@ -271,42 +271,42 @@ sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: -- a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. -- b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the Corresponding - Source from a network server at no charge. -- c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. -- d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. -- e) Convey the object code using peer-to-peer transmission, - provided you inform other peers where the object code and - Corresponding Source of the work are being offered to the general - public at no charge under subsection 6d. +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be @@ -382,23 +382,23 @@ Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: -- a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or -- b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or -- c) Prohibiting misrepresentation of the origin of that material, - or requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or -- d) Limiting the use for publicity purposes of names of licensors - or authors of the material; or -- e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or -- f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions - of it) with contractual assumptions of liability to the recipient, - for any liability that these contractual assumptions directly - impose on those licensors and authors. +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you diff --git a/crates/fdev/README.md b/crates/fdev/README.md index 23b2ac32b..75677108c 100644 --- a/crates/fdev/README.md +++ b/crates/fdev/README.md @@ -65,7 +65,7 @@ local-node local-node-cli --help ``` Once the local node is up, you can run `fdev` or a script to send commands to it. -Below is a *legacy* style example (paths/names may differ in current code): +Below is a _legacy_ style example (paths/names may differ in current code): ```bash # Example: older usage for local node exploration @@ -88,9 +88,11 @@ In newer code, you will likely use `fdev wasm-runtime`, described in a [later se - **`webapp`**: A contract container that also bundles a front-end (TypeScript/webpack by default). Example: + ```bash fdev new contract ``` + Generates Rust cargo boilerplate (and for web apps, TypeScript/webpack scaffolding too). --- @@ -123,6 +125,7 @@ fdev build \ `fdev publish` uploads a **new** contract or delegate to a node (either local or network mode). **Example: Publishing a contract**: + ```bash fdev publish \ --code path/to/my_contract.wasm \ @@ -130,11 +133,13 @@ fdev publish \ contract \ --state path/to/initial_state ``` + - **`--code`**: path to your built WASM. - **`--parameters`**: optional contract parameters file (typically binary format). - **`--state`**: optional initial state file (typically binary format). **Example: Publishing a webapp contract with pre-compressed archive**: + ```bash # First compress your webapp directory tar cf - webapp/ | xz > webapp.tar.xz @@ -147,6 +152,7 @@ fdev publish \ --webapp-archive webapp.tar.xz \ --webapp-metadata path/to/metadata.json ``` + - **`--webapp-archive`**: path to your xz-compressed tar archive containing the webapp files. The archive should contain an index.html file at the root level. - **`--webapp-metadata`**: optional path to metadata file for the webapp (can be any binary format). @@ -154,6 +160,7 @@ fdev publish \ This alternative to the TypeScript/webpack build process allows you to provide your own pre-compressed webapp archive. **Example: Publishing a delegate**: + ```bash fdev publish \ --code path/to/my_delegate.wasm \ @@ -161,6 +168,7 @@ fdev publish \ delegate \ [--nonce ... --cipher ...] ``` + - If you skip `--nonce` and `--cipher`, a default local-only encryption is used (fine for tests, not recommended for production). By default, `fdev publish` pushes in **local** mode unless you specify `--mode network` or set `MODE=network`. @@ -199,13 +207,14 @@ fdev build \ ``` Similarly, you can specify `--state` for a model-only contract: + ```bash fdev build \ --input-state-path contracts/freenet-microblogging/model/ \ --output-file contracts/freenet-microblogging-data/freenet_microblogging_model ``` -*(Adjust paths, actual flags, and config to match your usage.)* +_(Adjust paths, actual flags, and config to match your usage.)_ --- @@ -238,11 +247,13 @@ fdev wasm-runtime \ --deserialization-format binary \ --terminal-output ``` + - The tool will connect to a local Freenet node by default (see `--mode`, `--address`, `--port` if needed). - Commands you type—like `put`, `get`, `update`, or `exit`—are forwarded to the local node. - Additional command data is read from the file specified by `--input-file`. Common subcommands once inside the TUI: + ``` help # print instructions put # publish a fresh contract state @@ -280,6 +291,7 @@ fdev test \ --events 100 \ single-process ``` + - **--gateways**: number of gateway nodes - **--nodes**: number of normal nodes - **--events**: random events (contract puts, updates, etc.) @@ -292,10 +304,11 @@ fdev test \ --nodes 10 \ network ``` + - One node acts as a **supervisor** (you run `fdev test ... network --mode supervisor`). - Others run as **peers** (`--mode peer`) connecting to the supervisor. This can scale across multiple machines or containers. -*(See internal documentation or run `fdev test --help` for more detail.)* +_(See internal documentation or run `fdev test --help` for more detail.)_ --- @@ -304,6 +317,7 @@ fdev test \ ```bash fdev network-metrics-server [--log-directory path] ``` + - Launches an HTTP server (default port `55010`) for collecting or pushing network stats and event logs. - You can then visualize or store the data for debugging or simulation metrics analysis. @@ -448,7 +462,7 @@ local-node local-node-cli --help ``` Once the local node is up, you can run `fdev` or a script to send commands to it. -Below is a *legacy* style example (paths/names may differ in current code): +Below is a _legacy_ style example (paths/names may differ in current code): ```bash # Example: older usage for local node exploration @@ -471,9 +485,11 @@ In newer code, you will likely use `fdev wasm-runtime`, described in a [later se - **`webapp`**: A contract container that also bundles a front-end (TypeScript/webpack by default). Example: + ```bash fdev new contract ``` + Generates Rust cargo boilerplate (and for web apps, TypeScript/webpack scaffolding too). --- @@ -506,6 +522,7 @@ fdev build \ `fdev publish` uploads a **new** contract or delegate to a node (either local or network mode). **Example: Publishing a contract**: + ```bash fdev publish \ --code path/to/my_contract.wasm \ @@ -513,11 +530,13 @@ fdev publish \ contract \ --state path/to/initial_state.json ``` + - **`--code`**: path to your built WASM. - **`--parameters`**: optional contract parameters. - **`--state`**: optional initial state JSON or binary. **Example: Publishing a delegate**: + ```bash fdev publish \ --code path/to/my_delegate.wasm \ @@ -525,6 +544,7 @@ fdev publish \ delegate \ [--nonce ... --cipher ...] ``` + - If you skip `--nonce` and `--cipher`, a default local-only encryption is used (fine for tests, not recommended for production). By default, `fdev publish` pushes in **local** mode unless you specify `--mode network` or set `MODE=network`. @@ -563,13 +583,14 @@ fdev build \ ``` Similarly, you can specify `--state` for a model-only contract: + ```bash fdev build \ --input-state-path contracts/freenet-microblogging/model/ \ --output-file contracts/freenet-microblogging-data/freenet_microblogging_model ``` -*(Adjust paths, actual flags, and config to match your usage.)* +_(Adjust paths, actual flags, and config to match your usage.)_ --- @@ -602,11 +623,13 @@ fdev wasm-runtime \ --deserialization-format json \ --terminal-output ``` + - The tool will connect to a local Freenet node by default (see `--mode`, `--address`, `--port` if needed). - Commands you type—like `put`, `get`, `update`, or `exit`—are forwarded to the local node. - Additional command data is read from the file specified by `--input-file`. Common subcommands once inside the TUI: + ``` help # print instructions put # publish a fresh contract state @@ -644,6 +667,7 @@ fdev test \ --events 100 \ single-process ``` + - **--gateways**: number of gateway nodes - **--nodes**: number of normal nodes - **--events**: random events (contract puts, updates, etc.) @@ -656,10 +680,11 @@ fdev test \ --nodes 10 \ network ``` + - One node acts as a **supervisor** (you run `fdev test ... network --mode supervisor`). - Others run as **peers** (`--mode peer`) connecting to the supervisor. This can scale across multiple machines or containers. -*(See internal documentation or run `fdev test --help` for more detail.)* +_(See internal documentation or run `fdev test --help` for more detail.)_ --- @@ -668,6 +693,7 @@ fdev test \ ```bash fdev network-metrics-server [--log-directory path] ``` + - Launches an HTTP server (default port `55010`) for collecting or pushing network stats and event logs. - You can then visualize or store the data for debugging or simulation metrics analysis. diff --git a/issue_cleanup_summary.md b/issue_cleanup_summary.md index 623de59ea..2bd08fb03 100644 --- a/issue_cleanup_summary.md +++ b/issue_cleanup_summary.md @@ -1,6 +1,7 @@ # GitHub Issue Cleanup Summary ## Issues Already Closed (8 issues) + - #1658 - Keep-alive timer destroyed between recv() calls - **Fixed in PR #1660** - #1656 - Channel overflow causing connection timeouts - **Fixed with send() change** - #1654 - Race condition in connection manager - **Fixed by channel overflow fix** @@ -11,16 +12,20 @@ - #1559 - "fdev query" triggers Connection reset - **Fixed by transport fixes** ## Issues to Keep Open + ### Active Development (2) + - #1659 - Add simple PUT retry logic - **Awaiting developer feedback** - #1640 - Add integration tests to CI workflow - **Still needed** ### Test Issues That May Be Fixed (3) + - #1637 - Fix flaky test: test_multiple_clients_subscription - **Test is no longer ignored, monitoring** - #1624 - test_ping_partially_connected_network fails on CI - **May be fixed by transport improvements** - #1616 - Fix ignored ping tests with network topology - **May be fixed by transport improvements** ### Documentation/Feature Requests (5) + - #1634 - Automate release process with GitHub Actions - #1602 - Add a README.md to freenet crate - #1597 - Use existing Backoff utility in update.rs @@ -28,11 +33,13 @@ - #1548 - Publish Freenet versions with Github Actions ### User-Reported Issues (3) + - #1595 - Freenet node setup script issue (by shadow-glass) - #1561 - Docker Image Premade (by Merith-TK) - #1522 - Status of Docker Codebase? (by shadow-glass) ### Technical Debt (10) + - #1631 - Improve contract loading in ping app tests - #1611 - Fix simulation infrastructure bitrot in fdev - #1588 - Subscription and Update Operations Review @@ -45,6 +52,7 @@ - #1523 - Create integration test for attested contract ### Old Architecture/Long-term (8) + - #1519 - HttpGateway::attested_contracts memory leak - #1502, #1501, #1500, #1499, #1498 - Delegate-related improvements - #1497 - Create Dioxus Freenet library @@ -52,6 +60,7 @@ - #1490 - Add `freenet service enable/disable` subcommand ### Very Old Issues by Nacho (5) + - #1454 - Refactor core interfaces - #1453 - WASM executor pool - #1452 - Leverage streaming for data transfer @@ -59,7 +68,9 @@ - #1450 - Add support for update deltas ## Recommendation + We've closed 8 issues that were directly related to the recent transport layer problems. The remaining issues fall into categories: + 1. **Active work** - Keep open (#1659, #1640) 2. **Test issues** - Monitor to see if fixed (#1637, #1624, #1616) 3. **Documentation/tooling** - Keep open but low priority @@ -67,4 +78,4 @@ We've closed 8 issues that were directly related to the recent transport layer p 5. **Technical debt** - Keep open, prioritize based on impact 6. **Long-term architecture** - Keep open but low priority -Total: Closed 8, keeping ~35 open (down from 43) \ No newline at end of file +Total: Closed 8, keeping ~35 open (down from 43) diff --git a/scripts/FREENET-NODE-SETUP-GUIDE.md b/scripts/FREENET-NODE-SETUP-GUIDE.md index 4ad7dc613..809257625 100644 --- a/scripts/FREENET-NODE-SETUP-GUIDE.md +++ b/scripts/FREENET-NODE-SETUP-GUIDE.md @@ -17,7 +17,7 @@ This guide provides step-by-step instructions for setting up a **Freenet Gateway ### Network Requirements - Open ports (gateway only): - - **31337** default network api port (or alternate port if specified) + - **31337** default network api port (or alternate port if specified) ### Pre-Installed Tools