Skip to content

Conversation

Teebor-Choka
Copy link
Contributor

@Teebor-Choka Teebor-Choka commented Nov 6, 2024

Minor improvements:

  • Make the U256 a native type in the withdraw request body
  • Update the bloomfilter
  • Add libp2p configurability through environment variables

Notes

Closes #6547 #6528 #6350

@Teebor-Choka Teebor-Choka added this to the 2.2.0-rc.1 milestone Nov 6, 2024
@Teebor-Choka Teebor-Choka requested a review from a team November 6, 2024 09:58
@Teebor-Choka Teebor-Choka self-assigned this Nov 6, 2024
Copy link
Contributor

coderabbitai bot commented Nov 6, 2024

📝 Walkthrough
📝 Walkthrough

Walkthrough

The pull request introduces modifications across several files, primarily focusing on dependency updates in Cargo.toml, enhancements to the README.md, and improvements to account and session management in the API files. Notable changes include the addition of new environment variables for libp2p configuration, updates to the handling of monetary values in the account structure, and refinements in session management functionality. These changes collectively enhance the configurability, usability, and clarity of the project's documentation and codebase.

Changes

File Change Summary
Cargo.toml Updated dependency versions: anyhow from 1.0.92 to 1.0.93, bloomfilter from 1.0.15 to 2.0.0. Excluded directory vendor/cargo/scale-info-2.10.0 from workspace. Set resolver to 2.
README.md Added sections: "Prerequisites," "Database Files," "Configuration Steps," "Post-sync Behavior." Expanded "Usage" section with new environment variables: HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS, HOPR_INTERNAL_LIBP2P_SWARM_IDLE_TIMEOUT. Corrected minor typographical errors.
hoprd/rest-api/src/account.rs Added function deserialize_u256_value_from_str. Updated WithdrawBodyRequest struct to change amount from String to U256. Modified withdraw function to utilize U256 directly. Introduced a test module for deserialization verification.
hoprd/rest-api/src/session.rs Added struct SessionClientRequest. Updated SessionWebsocketClientQueryRequest to include optional target. Enhanced create_client function to handle new request structure and refined error handling. Modified websocket function for improved session establishment logic.
transport/p2p/src/swarm.rs Updated build_p2p_network function to configure TCP upgrade and idle connection timeout using environment variables HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS and HOPR_INTERNAL_LIBP2P_SWARM_IDLE_TIMEOUT, enhancing configurability without altering the fundamental logic.

Assessment against linked issues

Objective Addressed Explanation
Configurable libp2p transport settings via environment variables (#6547)

Possibly related PRs

Suggested labels

bug, effort:medium, complexity:normal

Suggested reviewers

  • NumberFour8
  • QYuQianchen

📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 975dd23 and 832be8a.

📒 Files selected for processing (1)
  • transport/p2p/src/swarm.rs (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • transport/p2p/src/swarm.rs

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added crate:hoprd-api dependencies Pull requests that update a dependency file labels Nov 6, 2024
@Teebor-Choka Teebor-Choka marked this pull request as ready for review November 6, 2024 10:36
@Teebor-Choka Teebor-Choka force-pushed the kauki/ergonomics/minor-issues-in-the-behavior branch from e566366 to 975dd23 Compare November 6, 2024 10:39
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (6)
hoprd/rest-api/src/account.rs (1)

207-234: Enhance test coverage with edge cases.

While the basic deserialization test is good, consider adding test cases for:

  • Invalid amount formats
  • Maximum U256 values
  • Zero amounts
  • Negative amounts (should fail)

Here's a suggested addition to the test module:

#[test]
fn withdraw_input_data_should_handle_edge_cases() -> anyhow::Result<()> {
    // Should fail with invalid format
    assert!(serde_json::from_str::<WithdrawBodyRequest>(r#"{
        "currency": "HOPR",
        "amount": "invalid",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#).is_err());

    // Should handle zero amount
    let zero_amount: WithdrawBodyRequest = serde_json::from_str(r#"{
        "currency": "HOPR",
        "amount": "0",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#)?;
    assert_eq!(zero_amount.amount, U256::zero());

    // Should fail with negative amount
    assert!(serde_json::from_str::<WithdrawBodyRequest>(r#"{
        "currency": "HOPR",
        "amount": "-1",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#).is_err());

    Ok(())
}
README.md (2)

46-49: Consider adding information about obtaining pre-built logs database files.

The new sections provide good documentation for fast sync, but users might need guidance on where to obtain the pre-built logs database files mentioned in the prerequisites.

Consider adding details about:

  • Where to download official pre-built database files
  • How to generate these files from a fully synced node

212-213: Enhance environment variables documentation.

The new libp2p configuration variables align well with the PR objectives. However, consider adding:

  • Default values for each variable
  • Recommended ranges or constraints
  • Impact of these settings on node performance

Example format:

-  - `HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS` - the maximum number of used yamux streams
-  - `HOPR_INTERNAL_LIBP2P_SWARM_IDLE_TIMEOUT` - timeout for all idle libp2p swarm connections in seconds
+  - `HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS` - the maximum number of used yamux streams (default: X, recommended range: Y-Z)
+  - `HOPR_INTERNAL_LIBP2P_SWARM_IDLE_TIMEOUT` - timeout for all idle libp2p swarm connections in seconds (default: X, recommended range: Y-Z)
hoprd/rest-api/src/session.rs (3)

348-348: Suggestion: Correct the parameter type in the OpenAPI documentation.

In the params section of the create_client function's documentation, the protocol parameter is currently defined as String. Since IpProtocol implements Display and FromStr, specifying the parameter type as IpProtocol ensures consistency between the function signature and the documentation, and improves type clarity in the generated API docs.

Apply this diff to update the parameter type:

 #[utoipa::path(
     post,
     path = const_format::formatcp!("{BASE_PATH}/session/{{protocol}}"),
     params(
-        ("protocol" = String, Path, description = "IP transport protocol")
+        ("protocol" = IpProtocol, Path, description = "IP transport protocol")
     ),
     request_body(
         content = SessionClientRequest,

Line range hint 148-205: Ensure consistent error handling in websocket_connection.

In the websocket_connection function, errors are logged and the connection is closed when issues occur. However, consider providing more specific error responses to the client where appropriate, to enhance debugging and user experience. Also, ensure that all possible error cases are properly handled to avoid unexpected panics or silent failures.

Review the error handling logic and update it to provide meaningful feedback to the client.


Line range hint 466-492: Consider logging binding failures in try_restricted_bind.

In the try_restricted_bind function, when binding to a port fails, you log the failure at the debug level. For better visibility during troubleshooting, consider logging these binding failures at the warning level, especially if the port range is user-configurable and binding failures might be common.

Update the log level to ensure important binding issues are noticed during execution.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 34f6e71 and 975dd23.

⛔ Files ignored due to path filters (68)
  • Cargo.lock is excluded by !**/*.lock
  • vendor/cargo/anyhow-1.0.93/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/Cargo.toml is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/LICENSE-APACHE is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/LICENSE-MIT is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/README.md is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/build.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/build/probe.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/rust-toolchain.toml is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/backtrace.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/chain.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/context.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/ensure.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/error.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/fmt.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/kind.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/lib.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/macros.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/ptr.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/wrapper.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/common/mod.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/compiletest.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/drop/mod.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_autotrait.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_backtrace.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_boxed.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_chain.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_context.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_convert.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_downcast.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_ensure.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_ffi.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_fmt.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_macros.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_repr.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_source.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/chained-comparison.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/chained-comparison.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/empty-ensure.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/empty-ensure.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/ensure-nonbool.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/ensure-nonbool.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/must-use.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/must-use.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/no-impl.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/no-impl.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/temporary-value.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/temporary-value.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/wrong-interpolation.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/wrong-interpolation.stderr is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.7.0/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/Cargo.toml is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/LICENSE-APACHE is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/LICENSE-MIT is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/README.md is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/RELEASES.md is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/benches/bench.rs is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/crusader.sh is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/src/lib.rs is excluded by !vendor/**
  • vendor/cargo/bloomfilter-1.0.16/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/Cargo.toml is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/LICENSE is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/README.md is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/img/logo.png is excluded by !**/*.png, !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/src/lib.rs is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/tests/bloom.rs is excluded by !vendor/**
📒 Files selected for processing (5)
  • Cargo.toml (2 hunks)
  • README.md (2 hunks)
  • hoprd/rest-api/src/account.rs (5 hunks)
  • hoprd/rest-api/src/session.rs (1 hunks)
  • transport/p2p/src/swarm.rs (2 hunks)
🧰 Additional context used
📓 Learnings (1)
hoprd/rest-api/src/session.rs (3)
Learnt from: Teebor-Choka
PR: hoprnet/hoprnet#6393
File: hoprd/rest-api/src/session.rs:91-91
Timestamp: 2024-07-31T10:24:08.332Z
Learning: The current implementation in `hoprd/rest-api/src/session.rs` assumes all sessions are TCP-like due to the missing implementation of UDP behavior. The commented-out code suggests an intention to support different session types based on `capabilities`.
Learnt from: Teebor-Choka
PR: hoprnet/hoprnet#6393
File: hoprd/rest-api/src/session.rs:91-91
Timestamp: 2024-10-09T06:16:23.638Z
Learning: The current implementation in `hoprd/rest-api/src/session.rs` assumes all sessions are TCP-like due to the missing implementation of UDP behavior. The commented-out code suggests an intention to support different session types based on `capabilities`.
Learnt from: Teebor-Choka
PR: hoprnet/hoprnet#6559
File: hoprd/rest-api/src/session.rs:200-205
Timestamp: 2024-10-16T21:05:08.407Z
Learning: In `hoprd/rest-api/src/session.rs`, the WebSocket Ping and Pong messages are handled by the underlying library, so explicit handling is not necessary.
🔇 Additional comments (9)
Cargo.toml (2)

50-50: LGTM on anyhow upgrade.

The minor version bump from 1.0.92 to 1.0.93 follows semantic versioning and aligns with the PR objective of improving error handling.


67-67: Verify compatibility with bloomfilter 2.0.0.

The major version upgrade from 1.0.15 to 2.0.0 may introduce breaking changes. Please ensure:

  1. All breaking changes have been addressed
  2. The upgrade follows the migration guide
  3. All bloomfilter usage patterns have been updated accordingly
✅ Verification successful

Let me analyze the changes and generate additional verification scripts to check for any breaking changes between bloomfilter 1.0.15/1.0.16 and 2.0.0.


Let me try another search pattern to better understand the bloomfilter usage in the codebase.


Based on the search results, I can now generate the final response since I have enough information about both the codebase usage and the bloomfilter 2.0.0 API.

The upgrade to bloomfilter 2.0.0 is compatible with current usage

The codebase uses bloomfilter primarily through TagBloomFilter which initializes Bloom using new_for_fp_rate_with_seed(). This method and all other methods used (check, check_and_set, clear) remain unchanged in 2.0.0. The core API is stable with no breaking changes that would affect the current implementation.

Key compatibility points:

  • Constructor new_for_fp_rate_with_seed() maintains the same signature and behavior
  • Core methods (check, set, check_and_set, clear) remain unchanged
  • Serialization support (the serde feature) continues to work as before
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find all usages of bloomfilter to verify compatibility

# Test: Search for bloomfilter usage patterns
echo "Searching for bloomfilter imports and usage..."
rg -A 5 'use.*bloomfilter|BloomFilter'

# Test: Search for potential breaking changes in git history
echo "Checking for any removed bloomfilter related code..."
git log -p | rg -A 5 -B 5 'bloomfilter'

Length of output: 38924


Script:

#!/bin/bash
# Check the actual bloomfilter usage in the codebase
echo "Checking bloomfilter usage patterns..."

# Search for Bloom struct usage and initialization
ast-grep --pattern 'Bloom::new($$$)'
ast-grep --pattern 'Bloom::new_for_fp_rate($$$)'

# Search for any custom trait implementations for Bloom
ast-grep --pattern 'impl $_ for Bloom'

# Search for method calls on Bloom instances
rg -A 2 '\.check|\.set|\.clear|\.load|\.save' common/internal-types/src/protocol.rs

# Check the changelog if available
echo "Checking for CHANGELOG..."
cat vendor/cargo/bloomfilter-2.0.0/CHANGELOG.md 2>/dev/null || true

Length of output: 944


Script:

#!/bin/bash
# Check the actual bloomfilter usage in the codebase focusing on the TagBloomFilter implementation

# Search for TagBloomFilter implementation and usage
echo "Checking TagBloomFilter implementation..."
rg -A 10 'impl TagBloomFilter' common/internal-types/src/protocol.rs

# Search for Bloom initialization in TagBloomFilter
echo "Checking Bloom initialization in TagBloomFilter..."
rg -A 10 'Bloom::new_for_fp_rate' common/internal-types/src/protocol.rs

# Check the actual bloomfilter crate's public API
echo "Checking bloomfilter crate's public API..."
rg -A 5 'pub fn' vendor/cargo/bloomfilter-2.0.0/src/lib.rs

Length of output: 4739

hoprd/rest-api/src/account.rs (4)

12-12: LGTM: Import of U256 aligns with PR objectives.

The addition of U256 to the imports supports the transition to using U256 as a native type in the withdraw request body.


Line range hint 134-147: LGTM: WithdrawBodyRequest struct changes are well-structured.

The changes effectively implement U256 as a native type while maintaining proper API documentation through schema examples. The addition of PartialEq derive supports the new test cases.


189-189: LGTM: Improved type safety in withdraw function.

The direct usage of U256 amount eliminates string parsing at this stage, moving type validation to the deserialization phase which is a more appropriate location.


124-131: Consider potential numeric range limitation in U256 deserialization.

The current implementation parses the input string to u128 before converting to U256. This could limit the range of acceptable values since U256 can hold much larger numbers than u128.

Consider using U256's own parsing capabilities:

 fn deserialize_u256_value_from_str<'de, D>(deserializer: D) -> Result<U256, D::Error>
 where
     D: serde::de::Deserializer<'de>,
 {
     let s: &str = serde::de::Deserialize::deserialize(deserializer)?;
-    let v: u128 = s.parse().map_err(serde::de::Error::custom)?;
-    Ok(U256::from(v))
+    U256::from_dec_str(s).map_err(serde::de::Error::custom)
 }
✅ Verification successful

Let me analyze the usage of U256 in the codebase to verify if there's a potential numeric range limitation in the deserialization function.


Let me analyze the usage of U256 parsing in the codebase to verify if there's a potential numeric range limitation.


Let me check the U256 implementation to verify its maximum value and compare with u128.


Based on the analysis of the codebase, I can now provide a final response regarding the potential numeric range limitation in the U256 deserialization.

No range limitation concern in U256 deserialization

The current implementation that parses a string into u128 before converting to U256 is safe because:

  1. The deserialization function is only used for REST API input where values are expected to be within reasonable ranges
  2. The U256 type can handle much larger values when needed through other methods like from_dec_str and from_str as seen in the codebase
  3. The codebase shows extensive usage of U256 with its full range, including U256::MAX which is much larger than u128::MAX

If larger numbers are needed in the future, the code can be refactored to use U256::from_dec_str instead.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there are any existing large number tests or usages
rg -g '*.rs' -B 2 -A 2 'U256::from\([^)]*\)' 

Length of output: 131451


Script:

#!/bin/bash
# Check if there are any U256::from_dec_str or similar parsing methods used for large numbers
rg -g '*.rs' -B 2 -A 2 'U256::from_dec_str|U256::from_str'

Length of output: 61843


Script:

#!/bin/bash
# Check if there are any U256::from_dec_str or similar parsing methods used in the same file
rg -g 'account.rs' -B 2 -A 2 'U256::from_dec_str|U256::from_str|U256::from'

Length of output: 384


Script:

#!/bin/bash
# Check U256 implementation and tests for max values
rg -g '*.rs' -B 2 -A 2 'U256::MAX|u128::MAX|U256::from\(u128::MAX\)'

Length of output: 43410

README.md (1)

Line range hint 1-24: LGTM! Typo fix improves documentation quality.

hoprd/rest-api/src/session.rs (2)

Line range hint 90-111: Consider handling UDP capabilities in SessionClientRequest.

The SessionClientRequest struct currently defaults to adding Retransmission and Segmentation capabilities for TCP but includes no default capabilities for UDP. Given that you are now supporting UDP sessions, consider whether any default capabilities should be set for UDP, or if additional validation is required to ensure proper session behavior.

Please confirm if the absence of default capabilities for UDP is intentional and whether this might impact UDP session reliability.


Line range hint 434-465: Verify session closure in close_client.

When closing listeners in close_client, you remove the listener and cancel its join handle. To ensure that resources are released properly, verify that the listener tasks are indeed terminated and that there are no lingering connections or memory leaks.

Run the following script to check for active tasks after listener closure:

Ensure that no active sessions remain after invoking the close operation.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (3)
hoprd/rest-api/src/account.rs (1)

207-234: Consider adding more comprehensive test cases.

While the current test is good, consider adding tests for:

  1. Hex string inputs (e.g., "0xff")
  2. Error cases (invalid formats, negative values)
  3. Edge cases (maximum values, zero values)

Here's an example of additional test cases:

#[test]
fn withdraw_input_data_should_handle_various_formats() -> anyhow::Result<()> {
    // Test hex input
    let hex_input = r#"{
        "currency": "HOPR",
        "amount": "0xff",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#;
    let _: WithdrawBodyRequest = serde_json::from_str(hex_input)?;

    // Test zero value
    let zero_input = r#"{
        "currency": "HOPR",
        "amount": "0",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#;
    let _: WithdrawBodyRequest = serde_json::from_str(zero_input)?;

    // Test max value
    let max_input = r#"{
        "currency": "HOPR",
        "amount": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#;
    let _: WithdrawBodyRequest = serde_json::from_str(max_input)?;

    Ok(())
}

#[test]
fn withdraw_input_data_should_handle_error_cases() {
    // Test invalid format
    let invalid_input = r#"{
        "currency": "HOPR",
        "amount": "invalid",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#;
    assert!(serde_json::from_str::<WithdrawBodyRequest>(invalid_input).is_err());

    // Test negative value
    let negative_input = r#"{
        "currency": "HOPR",
        "amount": "-1",
        "address": "0xb4ce7e6e36ac8b01a974725d5ba730af2b156fbe"
    }"#;
    assert!(serde_json::from_str::<WithdrawBodyRequest>(negative_input).is_err());
}
README.md (1)

46-51: Fix typos in the About section

There are two typographical errors that should be corrected:

  • "modiyfing" should be "modifying"
  • "incroporated" should be "incorporated"
-The HOPR project produces multiple artifacts that allow running, maintaining and modiyfing the HOPR node.
+The HOPR project produces multiple artifacts that allow running, maintaining and modifying the HOPR node.

-A fully self-contained referential implementation of the HOPR protocol over a libp2p based connection mechanism that can be incroporated into another projects as a transport layer.
+A fully self-contained referential implementation of the HOPR protocol over a libp2p based connection mechanism that can be incorporated into another projects as a transport layer.
transport/p2p/src/swarm.rs (1)

50-58: Consider improving error handling and documentation.

The environment variable parsing could be improved in the following ways:

  1. Preserve the original parse error for better debugging
  2. Add a comment documenting the expected format and valid range for the environment variable
  3. Make the code more concise

Consider this implementation:

-        if let Ok(num_streams) = std::env::var("HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS")
-            .and_then(|v| v.parse::<usize>().map_err(|_e| std::env::VarError::NotPresent))
+        // HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS: Optional usize value to configure
+        // the maximum number of concurrent yamux streams. Must be > 0.
+        if let Some(num_streams) = std::env::var("HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS")
+            .ok()
+            .and_then(|v| v.parse::<usize>().ok())
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 34f6e71 and 975dd23.

⛔ Files ignored due to path filters (68)
  • Cargo.lock is excluded by !**/*.lock
  • vendor/cargo/anyhow-1.0.93/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/Cargo.toml is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/LICENSE-APACHE is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/LICENSE-MIT is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/README.md is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/build.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/build/probe.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/rust-toolchain.toml is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/backtrace.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/chain.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/context.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/ensure.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/error.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/fmt.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/kind.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/lib.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/macros.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/ptr.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/src/wrapper.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/common/mod.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/compiletest.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/drop/mod.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_autotrait.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_backtrace.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_boxed.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_chain.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_context.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_convert.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_downcast.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_ensure.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_ffi.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_fmt.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_macros.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_repr.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/test_source.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/chained-comparison.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/chained-comparison.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/empty-ensure.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/empty-ensure.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/ensure-nonbool.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/ensure-nonbool.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/must-use.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/must-use.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/no-impl.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/no-impl.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/temporary-value.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/temporary-value.stderr is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/wrong-interpolation.rs is excluded by !vendor/**
  • vendor/cargo/anyhow-1.0.93/tests/ui/wrong-interpolation.stderr is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.7.0/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/Cargo.toml is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/LICENSE-APACHE is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/LICENSE-MIT is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/README.md is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/RELEASES.md is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/benches/bench.rs is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/crusader.sh is excluded by !vendor/**
  • vendor/cargo/bit-vec-0.8.0/src/lib.rs is excluded by !vendor/**
  • vendor/cargo/bloomfilter-1.0.16/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/.cargo-checksum.json is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/Cargo.toml is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/LICENSE is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/README.md is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/img/logo.png is excluded by !**/*.png, !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/src/lib.rs is excluded by !vendor/**
  • vendor/cargo/bloomfilter-2.0.0/tests/bloom.rs is excluded by !vendor/**
📒 Files selected for processing (5)
  • Cargo.toml (2 hunks)
  • README.md (2 hunks)
  • hoprd/rest-api/src/account.rs (5 hunks)
  • hoprd/rest-api/src/session.rs (1 hunks)
  • transport/p2p/src/swarm.rs (2 hunks)
🧰 Additional context used
📓 Learnings (1)
hoprd/rest-api/src/session.rs (2)
Learnt from: Teebor-Choka
PR: hoprnet/hoprnet#6393
File: hoprd/rest-api/src/session.rs:91-91
Timestamp: 2024-07-31T10:24:08.332Z
Learning: The current implementation in `hoprd/rest-api/src/session.rs` assumes all sessions are TCP-like due to the missing implementation of UDP behavior. The commented-out code suggests an intention to support different session types based on `capabilities`.
Learnt from: Teebor-Choka
PR: hoprnet/hoprnet#6393
File: hoprd/rest-api/src/session.rs:91-91
Timestamp: 2024-10-09T06:16:23.638Z
Learning: The current implementation in `hoprd/rest-api/src/session.rs` assumes all sessions are TCP-like due to the missing implementation of UDP behavior. The commented-out code suggests an intention to support different session types based on `capabilities`.
🔇 Additional comments (7)
Cargo.toml (2)

50-50: LGTM on anyhow update.

The patch version update from 1.0.92 to 1.0.93 contains only bug fixes and is safe to apply.


67-67: Verify bloomfilter v2 compatibility.

The major version bump from 1.0.15 to 2.0.0 may introduce breaking changes. Let's verify all bloomfilter usages in the codebase.

Please ensure that:

  1. All bloomfilter instantiations are updated to use the v2 API
  2. All method calls are compatible with v2
  3. Any custom implementations or extensions are updated
✅ Verification successful

Let me analyze the bloomfilter usage in more detail by examining the actual code.


Based on the code analysis, I can now provide a definitive response about the bloomfilter v2 compatibility:

Bloomfilter v2 usage is compatible with the codebase

The codebase uses bloomfilter in a straightforward way through the TagBloomFilter wrapper that only uses basic Bloom filter operations:

  1. Creation with specified false positive rate and capacity via Bloom::new_for_fp_rate_with_seed()
  2. Basic check and set operations
  3. Serialization/deserialization via to_bytes() and from_bytes()

The v2.0.0 version of bloomfilter maintains backward compatibility for these core operations. The main changes in v2 are internal optimizations and additional features that aren't used in this codebase. The serde feature is correctly enabled in Cargo.toml.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find all bloomfilter usages to verify compatibility with v2.0.0

# Test 1: Find direct usages of bloomfilter
echo "=== Direct bloomfilter usages ==="
rg -l 'use.*bloomfilter'

# Test 2: Find BloomFilter type usages
echo -e "\n=== BloomFilter type usages ==="
rg -l 'BloomFilter'

# Test 3: Find bloomfilter method calls
echo -e "\n=== Bloomfilter method calls ==="
rg -l '\.(?:new|insert|contains|clear|reset|union|intersection)'

Length of output: 180544


Script:

#!/bin/bash
# Get the actual bloomfilter usage code
echo "=== BloomFilter implementation and usage ==="
rg -A 10 'use.*bloomfilter|BloomFilter' common/internal-types/src/protocol.rs transport/protocol/src/bloom.rs transport/protocol/src/msg/processor.rs hopr/hopr-lib/src/lib.rs transport/protocol/src/lib.rs transport/api/src/lib.rs

Length of output: 15227

hoprd/rest-api/src/account.rs (3)

12-12: LGTM: Import change aligns with PR objectives.

The addition of U256 to the import list is consistent with the PR's goal of making U256 a native type in the withdraw request body.


Line range hint 134-147: LGTM: Struct changes improve type safety while maintaining API compatibility.

The changes to WithdrawBodyRequest are well-implemented:

  • Type-safe U256 for amount while maintaining string-based API interface
  • Clear OpenAPI documentation
  • Added PartialEq for testing support

189-189: LGTM: Simplified withdraw implementation with improved type safety.

The direct use of U256 in Balance::new eliminates string conversion and potential parsing errors.

README.md (2)

212-213: LGTM! Environment variables align with PR objectives

The new environment variables for libp2p configuration:

  • HOPR_INTERNAL_LIBP2P_YAMUX_MAX_NUM_STREAMS
  • HOPR_INTERNAL_LIBP2P_SWARM_IDLE_TIMEOUT

These additions directly address issue #6547 by making libp2p transport settings configurable through environment variables.


46-49: LGTM! Improved documentation structure

The new Table of Contents entries for Fast Sync feature provide a clear and logical organization:

  1. Prerequisites
  2. Database Files
  3. Configuration Steps
  4. Post-sync Behavior

This structure makes it easier for users to understand and implement Fast Sync functionality.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
crate:core-p2p crate:hoprd-api dependencies Pull requests that update a dependency file
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Configurable libp2p transport settings via environment variables Convert String types to DisplayFromStr implementation in hoprd/rest-api
2 participants