Skip to content

Conversation

@MegaRedHand
Copy link
Collaborator

Adds structured logging improvements to make ethlambda's logs more useful for debugging and monitoring.

New Log Messages

Block Events:

INFO slot=5 proposer=5 block_root=d0fd6225 parent_root=0c3dd6a5 attestation_count=4 Received block from gossip
INFO slot=5 proposer=5 block_root=d0fd6225 parent_root=0c3dd6a5 Block imported successfully
INFO slot=5 proposer=5 block_root=d0fd6225 parent_root=0c3dd6a5 attestation_count=4 Published block to gossipsub

Attestation Events:

INFO slot=5 validator=2 head_root=a1b2c3d4 target_slot=5 target_root=e5f6g7h8 source_slot=0 source_root=i9j0k1l2 Received attestation from gossip
INFO slot=5 validator=2 target_slot=5 target_root=e5f6g7h8 source_slot=0 source_root=i9j0k1l2 Attestation processed
INFO slot=5 validator=2 target_slot=5 target_root=e5f6g7h8 source_slot=0 source_root=i9j0k1l2 Published attestation to gossipsub

Consensus Events:

INFO justified_slot=21 justified_root=f3876ca3 vote_count=5 threshold=4 Checkpoint justified
INFO finalized_slot=18 finalized_root=b7ba899b previous_finalized=12 justified_slot=21 Checkpoint finalized
INFO head_slot=26 head_root=b688cd00 previous_head_slot=24 previous_head_root=c577d911 justified_slot=21 finalized_slot=18 Fork choice head updated

Network Events:

INFO peer_id=16Uiu2HAm7TYV direction=inbound peer_count=5 their_finalized_slot=15 their_head_slot=26 Peer connected
INFO peer_id=16Uiu2HAm7TYV direction=inbound reason=remote_close peer_count=4 Peer disconnected

Changes

  • Added ShortRoot display helper for consistent 8-char root truncation
  • Enhanced block reception, import, and publication logs with consistent field ordering
  • Enhanced attestation reception, processing, and publication logs with complete root information
  • Added finalization and justification event logging
  • Added fork choice head update logging
  • Added peer count to connection logs
  • Improved error context in block processing failures
  • Standardized field ordering: temporal → identity → identifiers → context → metadata

@github-actions
Copy link

Kimi AI Code Review

This PR aims to improve log messages in the `ethlambda` Ethereum consensus client. I will review the changes focusing on code correctness, security, performance, idiomatic Rust patterns, memory safety, error handling, and maintainability.

Code Correctness and Potential Bugs

  1. Adding tracing as a dependency:

    • The tracing crate is added as a dependency, which is good for structured logging. However, it's important to ensure that all other dependencies are compatible with tracing. No issues are apparent from the diff.
  2. Use of ShortRoot:

    • The ShortRoot struct is introduced to display truncated root hashes, which is a good practice for log messages to keep them concise and readable.
    • Ensure that ShortRoot is correctly implemented and used throughout the codebase.
  3. Logging block and attestation details:

    • The PR adds more detailed logging for blocks and attestations, which is beneficial for debugging and monitoring the node's behavior.
    • Ensure that all fields logged are relevant and provide enough context without overwhelming the logs.

Security Vulnerabilities

  1. Logging sensitive information:
    • The logs do not appear to contain any sensitive information such as private keys or passwords. This is good practice for security.

Performance Implications

  1. Logging overhead:
    • The increased logging may introduce some overhead, but it should be minimal and acceptable given the benefits of improved monitoring and debugging.

Rust Best Practices and Idiomatic Patterns

  1. Use of tracing:

    • The use of tracing is idiomatic in Rust for structured logging. The PR correctly uses tracing macros like info! and warn!.
  2. Error handling:

    • The PR maintains proper error handling by logging errors and using Result types where appropriate.

Memory Safety and Proper Error Handling

  1. Memory safety:

    • The changes do not introduce any memory safety issues. The use of tracing and logging does not allocate memory in a way that could lead to unsafe behavior.
  2. Error handling:

    • The PR correctly handles errors by logging them and propagating them using Result types.

Code Readability and Maintainability

  1. Readability:

    • The logging messages are clear and provide useful information, making the code more readable and maintainable.
  2. Maintainability:

    • The introduction of ShortRoot and detailed logging makes the code more maintainable by providing better insights into the node's behavior.

Specific Suggestions

  1. Line 278 in lib.rs:

    • The proposer variable is declared but not used in the logging message. Consider using it or removing it if not needed.
  2. Line 298 in lib.rs:

    • The process_pending_children method is called without any logging or error handling. Consider adding logging to track the processing of pending children.
  3. Line 211 in store.rs:

    • The update_head function logs a message when a reorg is detected. Consider adding more context to the log message, such as the number of blocks in the new chain.

Overall, the PR looks good and improves the logging in the ethlambda Ethereum consensus client. The changes are well-implemented and follow best practices for logging in Rust.


Automated review by Kimi (Moonshot AI)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Code review by ChatGPT

"tracing",
]

[[package]]

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  • Without the full context of the changes, ensure there are no logical flaws in consensus mechanisms like fork choice and attestation processing. Verify any added logic against the eth2.0 specs.

Security Vulnerabilities

  • Fork Choice Consistency (LMD GHOST / 3SF-mini): Ensure any changes adhere strictly to the eth2.0 specifications to prevent vulnerabilities in consensus.
  • Attestation Verification: Confirm proper validation is implemented to safeguard against invalid or malicious attestations.

Performance Implications

  • Dependency Addition: The addition of tracing at line 2061 might impact performance. Ensure to use it judiciously in performance-critical paths.

Rust Best Practices and Idiomatic Patterns

  • Error Handling: Use Result and Option types consistently to handle errors gracefully.
  • Ensure all potentially failing operations (e.g., network I/O, file I/O) properly handle errors using idiomatic patterns like match or the ? operator.

Memory Safety and Proper Error Handling

  • Memory Management: Verify if any unsafe blocks are introduced and review them meticulously to prevent memory safety issues.

Code Readability and Maintainability

  • Code Documentation: Ensure new functions or modules are well-documented, especially if complex logic has been added or modified.
  • Logging and Tracing (New Dependency): Ensure that traces are meaningful and do not leak sensitive information in logs.

Consensus Layer Considerations

  • Fork Choice Correctness: Double-check any modifications in fork choice logic to ensure correctness as per specifications.
  • State Transition Functions: Confirm all state transition functions correctly implement specified behavior and handle edge cases.
  • SSZ Encoding/Decoding: Validate new data is properly serialized/deserialized without corruption.

Summary

To give a final LGTM, I suggest addressing above considerations, especially focusing on security and correctness of consensus-related logic. The introduction of tracing should be validated against performance benchmarks, and ensure that all logging respects user privacy and doesn't disclose sensitive data.

);
}
}
}

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  • The new variable proposer is correctly referenced and logged. Ensure that this field is properly initialized and validated as part of block validation outside the snippet.

Security Vulnerabilities

  • No immediate security vulnerabilities are apparent from this diff. However, consider if logging detailed block information poses any security/privacy risks (e.g., if logs are accessible to unauthorized actors).

Performance Implications

  • Logging additional data such as proposer, block_root, and parent_root will have a minor impact on performance, especially if the logging subsystem is not optimized for concurrent access or if logging is done at a very high throughput.

Rust Best Practices and Idiomatic Patterns

  • The expansion of the info! and warn! macros is idiomatic and follows Rust's convention for structured logging.

Memory Safety and Proper Error Handling

  • The current mechanism for logging errors is appropriate; however, ensure that err includes sufficient context about the error for better debugging.
  • It appears error handling on process_block is limited to logging. Ensure that in the case of an error, other system components remain consistent and secure.

Code Readability and Maintainability

  • The change improves logging detail, which aids in debugging and auditing; avoid over-logging to prevent log flooding.

Consensus-layer Considerations

  • Fork Choice (LMD GHOST / 3SF-mini): Ensure that process_block accurately updates fork choice rules, as this is critical for consensus.
  • Attestation Processing and Validation: This snippet does not include attestations, but ensure the block's inclusion respects consensus rules.
  • Justification and Finalization Logic: Critical for client consensus accuracy, make sure that justification/finalization logic outside this snippet is thorough and includes verification steps.
  • State Transition Functions (process_slots, process_block): Validate these functions for precise state updates.
  • XMSS Signature Verification and Aggregation: No changes observed; correctness depends on implementation outside this snippet.
  • SSZ Encoding/Decoding Correctness: Non-applicable for the visible diff; ensure correctness outside this snippet if applicable.

Overall, the additions concerning logging enhance observability, but attention to the broader consensus and performance impacts is essential. Consider also scrutinizing upstream and downstream code interactions not visible in this change.


Ok(())
}

Choose a reason for hiding this comment

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

  • Code Correctness and Potential Bugs:

    • The change in line 211 to clone the attestation before passing it to on_attestation prevents borrowing issues but potentially introduces unnecessary clone operations if not required, which could impact performance.
  • Security Vulnerabilities:

    • Nothing is immediately evident from this diff, but it is crucial to ensure that any input used in printf! style logging, especially from network sources, is sanitized to avoid security risks.
  • Performance Implications:

    • Cloning attestation on line 211 can lead to performance issues, especially in high-load scenarios. Consider refactoring on_attestation to either take a reference or handle copying internally when necessary.
  • Rust Best Practices and Idiomatic Patterns:

    • The use of unwrap_or(0) in old_slot and new_slot calculations could be reconsidered for better error handling to differentiate between a missing block and a genuine zero slot, if applicable for this consensus model.
  • Memory Safety and Proper Error Handling:

    • Line 211 could utilize as_ref or as_mut based on what on_attestation requires to avoid excessive cloning.
    • Ensuring safeguard against unwraps spilling panics to production code paths by using better error contextual error handling mechanisms.
  • Code Readability and Maintainability:

    • Logging structured information on line 44 to 57 is comprehensive and improves traceability. However, the same must be extended to error situations for holistic debugging.
  • Consensus-layer Considerations:

    • Fork choice logging is thorough but ensure that key state updates respect atomicity throughout the function's transactional scope.
    • No issues with attestation logging are identified, but continuously validate against consensus invariants to avoid deciding on stale state representations.

Overall, the proposed changes should consider minimizing unnecessary object cloning, closely managing slot errors, and improving debug logging for error cases.

tracing.workspace = true

[dev-dependencies]
serde.workspace = true

Choose a reason for hiding this comment

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

General Overview

The addition of a new dependency, tracing, in the workspace is a good move for improving observability and debugging, which is crucial in maintaining a consensus client.

Specific Concerns

1. Code Correctness & Potential Bugs

There is no direct code to review in the provided snippet, but adding tracing indicates possible changes elsewhere for logging. Ensure that all such changes have appropriate log levels set (e.g., trace, debug, info, warn, error) to avoid excessive logging, which can obscure critical information.

2. Security Vulnerabilities

While tracing itself does not introduce vulnerabilities, increased logging can inadvertently expose sensitive information if not properly managed. Double-check logging statements to ensure no private keys, raw transaction data, or sensitive state information are logged.

3. Performance Implications

Implementing tracing can introduce performance overhead, especially if used excessively in high-traffic code paths. Consider using conditional compilation flags to disable verbose logging in production builds.

4. Rust Best Practices & Idiomatic Patterns

Adding tracing is idiomatic to Rust's asynchronous environment. Ensure #[instrument] macros are used appropriately on functions that benefit from detailed execution context.

5. Memory Safety & Proper Error Handling

tracing does not directly affect memory safety unless incorrect log handling somehow disrupts execution flow. Ensure that log-related function calls do not swallow errors that need proper propagation.

6. Code Readability & Maintainability

Ensure that logging improves, rather than complicates, code readability. Use structured logging to maintain consistent, parseable logs that contribute to maintainability.

Consensus-layer Considerations

This addition doesn't directly affect consensus logic but can support diagnosing issues in fork choice, attestation processing, and state transitions by reproducing internal states or changes.

Actionable Suggestions

  • Review Log Levels: Audit where tracing is used and assign appropriate levels.
  • Sensitive Data: Ensure that no sensitive data is inadvertently logged.
  • Performance-Test Logging: Benchmark code with logging enabled to understand performance impact.

In conclusion, while the addition of tracing can be beneficial for the client's debugging and operational visibility, caution must be taken around what is logged, to safeguard performance and security.


// Shift window to drop finalized slots from the front
let delta = (state.latest_finalized.slot - old_finalized_slot) as usize;
justified_slots_ops::shift_window(&mut state.justified_slots, delta);

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  1. Functionality: The added logging (info!) provides useful information about checkpoint justification and finalization. However, it is crucial to ensure that logging does not impact performance or expose sensitive information. Ensure these logs are not too verbose in production environments, as they might lead to log overflow or increased I/O operations which can slow down the system.

Security Vulnerabilities

  1. Logging Sensitive Data: Consider if the justified_root and finalized_root should be treated as sensitive data. If so, logging them could expose sensitive information in log files. Proper encryption or redaction might be necessary.

Performance Implications

  1. Logging Overhead: The overhead from the newly introduced info! logging statements should be minimal, especially in a consensus client where performance is critical. Ensure that in high-frequency scenarios, this logging does not become a bottleneck.

Rust Best Practices and Idiomatic Patterns

  1. Imports Organization: The addition of ShortRoot and tracing::info is correctly following Rust's best practices for imports. Keeping imports well-organized helps maintain readability and efficiency.

Memory Safety and Error Handling

  1. Error Handling: There is no data validation before logging. Make sure that target.slot, target.root, and other params are always expected values before logging to avoid propagating invalid state information.

Code Readability and Maintainability

  1. Informative Logging: The added info! logs improve the traceability of justification and finalization logic, making it easier to diagnose issues in these critical consensus mechanisms.

  2. Code Formatting: The formatting follows Rust conventions and is clean, which aids maintainability.

Additional Notes

  • Consensus Layer Considerations: Without seeing the remainder of the consensus logic, especially around fork choice and attestation validation, it's crucial to ensure that these logs accurately reflect state transitions according to the Ethereum Beacon Chain specification.

  • Overall, the logging-related change looks like a positive addition in terms of transparency, provided that performance and security are managed appropriately.

}
Ok(())
}
}

Choose a reason for hiding this comment

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

General Feedback:

The proposed code appears to introduce a utility for displaying a shortened version of Ethereum root hashes. While the implementation is straightforward, there are a few areas that could benefit from improvement to adhere to Rust best practices and ensure future maintainability.

Code Correctness and Potential Bugs:

  • fmt::Display Implementation: The fmt function iterates over the first 4 bytes of a 32-byte array but does not handle unexpected array lengths. Ensure the input is always of length 32, or implement error handling to provide feedback when the assumption is invalid.

Security Vulnerabilities:

  • Security Considerations: Given this code pertains to display formatting, there are no direct security implications. However, be vigilant about inputs to this struct in other parts of the codebase.

Performance Implications:

  • Iteration over Bytes: The performance cost of iterating over 4 bytes is negligible in this context.

Rust Best Practices and Idiomatic Patterns:

  • Explicit Lifetimes: The use of an explicit lifetime 'a in ShortRoot<'a> is appropriate and clear.
  • Destructuring: Consider pattern matching to destructure or slice arrays directly if you're expecting precisely 32 elements.

Memory Safety and Proper Error Handling:

  • Error Handling: The write! macro uses the ? operator, which is idiomatic. Ensure calling contexts are prepared to handle potential fmt::Error results or panics.

Code Readability and Maintainability:

  • Code Documentation: Expand the doc comment to explain the use case for ShortRoot and its role or importance in the broader application context.
  • Naming: Consider renaming ShortRoot to something more self-explanatory, like TruncatedRootDisplay if its primary utility is format representation.

Consensus-layer Considerations:

  • The PR provided does not directly interface with consensus logic such as fork choice, attestation validation, or state transition functions. Ensure that inputs to this display helper are validated elsewhere.

Conclusion:

While the implementation is acceptable, addressing the identified concerns will enhance the overall robustness and maintainability of the code. Specifically, adding error handling for unexpected input sizes will prevent potential issues when used within the broader codebase. Assuming inputs are always valid can lead to future bugs when the codebase evolves.

))
.inspect_err(
|err| tracing::warn!(%slot, %proposer, %err, "Failed to publish block to gossipsub"),
);

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs:

  1. The use of ShortRoot seems appropriate but ensure ShortRoot correctly implements the necessary traits and handles the byte slice safely as printing raw bytes could lead to unexpected behaviors if not handled properly.

Security Vulnerabilities:
2. Ensure all incoming data is validated and sanitized, though this is more verbose logging and doesn't change the core of consensus logic, being vigilant with these additions is critical in blockchain. The logging could inadvertently expose sensitive info, so ensure ShortRoot only logs what is necessary.
3. In Rust, race conditions and data consistency issues should be considered. Ensure logging doesn't block any critical paths, given that these logs occur async, consideration for thread safety around blockchain.notify_new_block and blockchain.notify_new_attestation is important.

Performance Implications:
4. Using info! level logging can potentially produce a large amount of log data, this can be significant in a production environment leading to IO bottlenecks. Consider using lower verbosity levels unless necessary during normal operation.

Rust Best Practices and Idiomatic Patterns:
5. The code generally adheres to Rust's idioms, using async functions and idiomatic error handling is good practice.

Memory Safety and Proper Error Handling:
6. inspect and inspect_err are used correctly to handle success/failure cases. Ensure that any error in publishing doesn't impact state transitions/code paths negatively.

Code Readability and Maintainability:
7. Code readability is generally good, but the additional use of ShortRoot for log statements should have corresponding documentation to explain this abstraction's purpose and behavior.
8. Consider consistent logging patterns throughout the codebase, keeping format and verbosity.

Consensus-Layer Considerations:
9. No apparent logic related to fork choice, attestation processing, or justification has been altered. However, ensure that the log information properly reflects the current state without assumptions. Additional matches or guards could be included to catch edge cases not otherwise handled.
10. No changes to process_slots or process_block functions are apparent. Ensure existing logic comprehensively covers state transitions, especially when new logging or side-effects are introduced.

Overall, while the changes mostly affect logging and do not directly modify core consensus functions, thoroughly testing these additions in an integration or simulation environment is recommended to ensure they do not inadvertently introduce race conditions or reveal any sensitive operational data.

info!(%peer_id, %direction, %reason, "Peer disconnected");
}
SwarmEvent::OutgoingConnectionError { peer_id, error, .. } => {
let result = if error.to_string().to_lowercase().contains("timed out") {

Choose a reason for hiding this comment

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

Review Comments

Code Correctness and Potential Bugs

  • Line 246-262: The change from our_status to their_*_slot in the info! macro seems incorrect based on the context of sending our status to the peer. The log should reflect our_finalized_slot and our_head_slot instead of their_* unless there's a specific reason for this change.

Security Vulnerabilities

  • No critical security vulnerabilities identified in this part of code. However, ensure that peer information and error messages do not leak sensitive information that could be exploited.

Performance Implications

  • Line 249: Usage of server.connected_peers.len() on every connection and disconnection has constant time complexity since connected_peers is a HashSet. This is efficient but avoid unnecessary calls if the log line isn’t needed.

Rust Best Practices and Idiomatic Patterns

  • Line 252 & 306: Consider avoiding the to_string() method for error handling; prefer borrowing if the error is already a String, or use error.to_lowercase().contains("") directly if the lowercase conversion is necessary.

Memory Safety and Proper Error Handling

  • Line 246-315: Ensure that all unwrap() and expect() calls are handled properly to avoid panics in unexpected scenarios, though this context seems safe from visible panic causes.

Code Readability and Maintainability

  • Lines 252-254 and 297-300: The info! logs are informative but could be improved by maintaining consistency in the log message formatting for better readability and debugging.

Consistency and Fault Tolerance

  • Fork choice correctness, attestation processing, etc.: This snippet doesn't directly relate to these consensus-critical components, but ensure any changes adhere to consensus specifications in related modules.

In summary, the main concern revolves around log message correctness and the unnecessary use of to_string().to_lowercase(). The logging changes are mostly positive for insight, but caution is needed to ensure accurate information is logged.

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Jan 29, 2026

Greptile Overview

Greptile Summary

This PR enhances ethlambda's logging infrastructure with comprehensive structured logging across the consensus and networking layers.

Key Changes:

  • Added ShortRoot display helper for consistent 8-character root hash truncation across all logs
  • Enhanced block lifecycle logging (reception, import, publication) with complete contextual fields
  • Enhanced attestation lifecycle logging with full checkpoint information (head, target, source roots)
  • Added consensus event logging for justification and finalization milestones
  • Added fork choice head update logging with previous/current state comparison
  • Enhanced peer connection logs with peer count tracking
  • Standardized field ordering: temporal → identity → identifiers → context → metadata

Issues Found:

  • Field naming bug in peer connection logs (their_finalized_slot/their_head_slot display our status, not theirs)

Confidence Score: 4/5

  • Safe to merge after fixing the field naming bug in peer connection logs
  • The logging improvements are well-structured and comprehensive, but the field naming bug in peer connection logs could cause confusion during debugging
  • crates/net/p2p/src/lib.rs requires attention for the field naming issue

Important Files Changed

Filename Overview
crates/common/types/src/lib.rs Added ShortRoot helper struct for consistent 8-char root hash display formatting
crates/blockchain/state_transition/src/lib.rs Added justification and finalization event logs with detailed checkpoint information
crates/blockchain/src/store.rs Added fork choice head update logs and attestation processing logs with root information
crates/net/p2p/src/gossipsub/handler.rs Enhanced block and attestation gossipsub logs with complete checkpoint and root information
crates/net/p2p/src/lib.rs Added peer count to connection logs, but field names incorrectly label our status as theirs

Sequence Diagram

sequenceDiagram
    participant Gossip as Gossipsub Network
    participant Handler as Gossipsub Handler
    participant Blockchain as Blockchain Server
    participant Store as Fork Choice Store
    participant StateTransition as State Transition
    participant P2P as P2P Server

    Note over Gossip,P2P: Block Reception Flow
    Gossip->>Handler: Block message received
    Handler->>Handler: Log: "Received block from gossip"<br/>(slot, proposer, block_root, parent_root, attestation_count)
    Handler->>Blockchain: notify_new_block()
    Blockchain->>Blockchain: Check parent exists
    alt Parent missing
        Blockchain->>Blockchain: Store as pending block
    else Parent exists
        Blockchain->>Store: process_block()
        Store->>StateTransition: state_transition()
        StateTransition->>StateTransition: process_attestations()
        alt Checkpoint justified
            StateTransition->>StateTransition: Log: "Checkpoint justified"<br/>(justified_slot, justified_root, vote_count, threshold)
        end
        alt Checkpoint finalized
            StateTransition->>StateTransition: Log: "Checkpoint finalized"<br/>(finalized_slot, finalized_root, previous_finalized, justified_slot)
        end
        Store->>Store: update_head()
        alt Head changed
            Store->>Store: Log: "Fork choice head updated"<br/>(head_slot, head_root, previous_head_slot, previous_head_root, justified_slot, finalized_slot)
        end
        Blockchain->>Blockchain: Log: "Block imported successfully"<br/>(slot, proposer, block_root, parent_root)
    end

    Note over Gossip,P2P: Attestation Reception Flow
    Gossip->>Handler: Attestation message received
    Handler->>Handler: Log: "Received attestation from gossip"<br/>(slot, validator, head_root, target_slot, target_root, source_slot, source_root)
    Handler->>Blockchain: notify_new_attestation()
    Blockchain->>Store: on_gossip_attestation()
    Store->>Store: validate_attestation()
    Store->>Store: on_attestation()
    Store->>Store: Log: "Attestation processed"<br/>(slot, validator, target_slot, target_root, source_slot, source_root)

    Note over Gossip,P2P: Block Publication Flow
    Blockchain->>P2P: publish_block()
    P2P->>Handler: publish_block()
    Handler->>Gossip: Publish to gossipsub
    Handler->>Handler: Log: "Published block to gossipsub"<br/>(slot, proposer, block_root, parent_root, attestation_count)

    Note over Gossip,P2P: Attestation Publication Flow
    Blockchain->>P2P: publish_attestation()
    P2P->>Handler: publish_attestation()
    Handler->>Gossip: Publish to gossipsub
    Handler->>Handler: Log: "Published attestation to gossipsub"<br/>(slot, validator, target_slot, target_root, source_slot, source_root)

    Note over Gossip,P2P: Peer Connection Flow
    Gossip->>P2P: Connection established
    P2P->>P2P: Log: "Peer connected"<br/>(peer_id, direction, peer_count, their_finalized_slot, their_head_slot)
    Gossip->>P2P: Connection closed
    P2P->>P2P: Log: "Peer disconnected"<br/>(peer_id, direction, reason, peer_count)
Loading

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

5 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Code review by ChatGPT

let our_status = build_status(&server.store);
info!(%peer_id, %direction, finalized_slot=%our_status.finalized.slot, head_slot=%our_status.head.slot, "Added connection to new peer, sending status request");
info!(
peer_id = %peer_id,

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  • The code changes suggest a correction in the logging statement where variables their_finalized_slot and their_head_slot were presumably incorrectly assigned values from our_status. The correction to our_finalized_slot and our_head_slot looks correct, assuming these fields exist in our_status. Ensure these variables are not used elsewhere that rely on the previous incorrect names.

Security Vulnerabilities

  • No immediate security vulnerabilities are evident from the diff. Ensure that the logging does not inadvertently expose sensitive information that could affect the security of the consensus client.

Performance Implications

  • The changes here have nominal impact on performance as they involve logging only.

Rust Best Practices and Idiomatic Patterns

  • The code adheres to Rust's idiomatic patterns, especially utilizing structured logging. Ensure that any shared state in server managed concurrently is protected from data races.

Memory Safety and Proper Error Handling

  • The snippet does not directly show error handling. Ensure that prior to this point, events are properly validated and any potential errors are adequately handled.

Code Readability and Maintainability

  • Renaming the variables to our_finalized_slot and our_head_slot improves clarity and correctness, reflecting the actual data they represent.

Consensus-layer Considerations

  • Ensure that our_status has been accurately populated, as the consensus logic heavily leans on the correctness of this data.

The main suggestion is to ensure test coverage for these changes, especially if the original naming was causing issues with consensus. Once this is confirmed, this change seems ready for merge.

@github-actions
Copy link

Kimi AI Code Review

### Review

General Observations

The PR aims to improve log messages across various parts of the codebase. This is a good initiative as it can help with better observability and debugging. The changes include the addition of the tracing crate and the use of structured logging with tracing. The ShortRoot helper struct is also introduced to display truncated root hashes, which is a useful addition.

Specific Comments

  1. Cargo.lock and Cargo.toml Changes

    • The addition of tracing to Cargo.lock and Cargo.toml seems correct. It's important to ensure that the version of tracing is compatible with the rest of the dependencies and the project's requirements.
  2. lib.rs Changes

    • The introduction of ShortRoot for logging truncated hashes is a good practice. It improves the readability of logs.
    • The logging messages have been expanded to include more context, such as proposer, block_root, parent_root, and error details. This will be very helpful for debugging and monitoring the blockchain's behavior.
  3. store.rs Changes

    • The update_head function now logs more detailed information about the fork choice reorg, including the old and new head slots and roots. This is a significant improvement for understanding the fork choice logic.
    • The logging in on_gossip_attestation has been improved to include more context about the attestation being processed.
  4. state_transition/src/lib.rs Changes

    • The logging in process_attestations has been expanded to include information about justifications and finalizations, which is crucial for understanding the consensus process.
  5. types/src/lib.rs Changes

    • The ShortRoot struct is implemented correctly, and its use in logging is appropriate.
  6. p2p/src/gossipsub/handler.rs Changes

    • The logging in the gossipsub handler has been improved to include more context about received blocks and attestations, which will help in monitoring the network's behavior.
  7. p2p/src/lib.rs Changes

    • The logging for peer connections and disconnections has been improved to include more context, such as the direction of the connection and the reason for disconnection.

Suggestions for Improvement

  • Error Handling: In the store.rs file, the on_gossip_attestation function clones the attestation before passing it to on_attestation. This is unnecessary and could be optimized by passing a reference instead. Consider changing the function signature to accept a reference to avoid unnecessary cloning.

    // Before
    on_attestation(store, attestation.clone(), false)?;
    
    // After
    on_attestation(store, &attestation, false)?;
  • Documentation: While the code improvements are good, it would be helpful to add some documentation explaining the rationale behind the changes, especially for someone who might be unfamiliar with the tracing crate or structured logging.

  • Testing: Consider adding tests to ensure that the new logging messages are correctly formatted and that the ShortRoot struct works as expected.

Conclusion

Overall, the PR makes significant improvements to the logging throughout the codebase. The changes will help with better observability and debugging of the Ethereum consensus client. The introduction of structured logging with tracing and the ShortRoot helper are particularly noteworthy. With the suggested improvements, the PR would be even stronger.


Automated review by Kimi (Moonshot AI)

@github-actions
Copy link

Kimi AI Code Review

### General Feedback

This PR introduces improved logging throughout the ethlambda codebase. The changes are aimed at providing more detailed and informative log messages, which is crucial for debugging and monitoring the behavior of a blockchain node. Here are my specific comments and suggestions:

Cargo.lock

  • The addition of the tracing crate is correct and necessary for the improved logging. No issues here.

blockchain/src/lib.rs

  • Line 10: The introduction of ShortRoot is a good practice for logging, as it keeps the log messages concise and readable.
  • Lines 277-278 and 296-298: The updated log messages provide more context, which is helpful for debugging. The use of ShortRoot is appropriate here.
  • Line 278: The addition of the proposer field to the log message is useful for tracing the origin of blocks.

store.rs

  • Lines 14-15: The introduction of ShortRoot is consistent with other parts of the codebase.
  • Lines 43-44 and 196-197: The updated log messages in update_head provide more detailed information about the reorg, which is crucial for understanding the fork choice logic.
  • Lines 206-223: The detailed log messages in on_gossip_attestation are helpful for monitoring the processing of attestations.

state_transition/src/lib.rs

  • Lines 4-5 and 296-298: The introduction of ShortRoot and the detailed log messages in process_attestations are beneficial for understanding the state transition logic.

common/types/src/lib.rs

  • Lines 4-15: The ShortRoot struct is well-defined and implemented. It's a good utility for logging truncated hashes.

net/p2p/src/gossipsub/handler.rs

  • Lines 1-2 and 32-33: The use of ShortRoot is consistent with other parts of the codebase.
  • Lines 49-61 and 77-98: The detailed log messages in handle_gossipsub_message and publish_attestation provide more context about the gossipsub messages, which is useful for monitoring the network behavior.

net/p2p/src/lib.rs

  • Lines 246-247 and 290-300: The updated log messages in handle_swarm_event provide more detailed information about peer connections and disconnections, which is crucial for understanding the network topology.

Conclusion

The PR improves the logging throughout the ethlambda codebase, making it easier to debug and monitor the node's behavior. The changes are consistent and follow best practices for logging in Rust. The use of tracing and ShortRoot enhances the readability and usefulness of the log messages.

Overall, this PR is well-implemented and improves the codebase significantly. I approve of the changes.


Automated review by Kimi (Moonshot AI)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Code review by ChatGPT

%slot,
proposer,
block_root = %ShortRoot(&block_root.0),
parent_root = %ShortRoot(&parent_root.0),

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  • Ensure that the self.process_block(signed_block) function returns comprehensive error types that are thoroughly checked and handled. It's crucial in the context of blockchain clients to have detailed error handling for each operation.

Security Vulnerabilities

  • The logging of %err might expose sensitive error information which could potentially be used to exploit vulnerabilities. Make sure the error messages do not leak any sensitive or exploitable information.

Performance Implications

  • The changes you made do not introduce any new performance concerns. Ensure that logging does not cause performance degradation during high-throughput scenarios.

Rust Best Practices and Idiomatic Patterns

  • The change from slot = %slot to %slot is more idiomatic and concise. Well done.

Memory Safety and Proper Error Handling

  • The usage of match statements for error handling is idiomatic in Rust. However, ensure the error paths are fully tested as part of the module's test suite to catch potential uncaught exceptions.

Code Readability and Maintainability

  • The updated usage of logging macros is more readable and aligns with Rust best practices, which improves maintainability.

Consensus-layer Considerations

  • Ensure that self.process_block integrates properly with your fork choice rule and that it is correctly processing and validating attestations. Incorrect implementations can lead to consensus failure.
  • Verify compliance with the state transition function requirements of the Ethereum protocol, including slot processing and block processing logic correctness.

Overall, the PR needs further verification and explanations about how errors are handled and secured before it can be merged.

}
}
on_attestation(store, attestation, false)?;
on_attestation(store, attestation.clone(), false)?;

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  • Line 50-51: The use of unwrap_or(0) can potentially mask bugs if get_block unexpectedly returns None. It's more prudent to handle this case explicitly, perhaps with error logging, to avoid silently continuing with potentially incorrect data. Consider replacing with expect() for clearer diagnostics.

Security Vulnerabilities

  • No immediate security vulnerabilities are evident in this diff snippet. However, ensure that state access functions like get_block perform appropriate validation and error handling especially given the critical nature of consensus data.

Performance Implications

  • Lines 48-54: Fetching justified_slot and finalized_slot separately might introduce slight overhead especially in high-frequency operations. If these values are frequently accessed together, consider batching them in a single database query.

Rust Best Practices and Idiomatic Patterns

  • Usage of bindings like justified_slot and finalized_slot is more idiomatic and improves readability. Good improvement here.

Memory Safety and Proper Error Handling

  • As previously mentioned, be cautious with silent fallbacks like unwrap_or(0). Prefer clearer error propagation to prevent masking possible bugs.

Code Readability and Maintainability

  • The introduction of local bindings for computed values (e.g., justified_slot, slot) improves readability by reducing direct field accesses and inline computations within the info! macro. This makes the code easier to read and maintain.

Consensus-layer Considerations

  • Ensure that the logic handling forks and head updates withstands the LMD GHOST / 3SF-mini algorithms, maintaining correctness and adhering to specifications.
  • Always double-check attestation handling, as these contribute to potential forks. Make sure there is adequate testing to handle boundary and edge cases.

Overall, the code shows improvements by adopting more idiomatic practices but requires attention on error handling to ensure robustness in critical systems like blockchain clients.

%reason,
peer_count,
"Peer disconnected"
);

Choose a reason for hiding this comment

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

General

  • Code Correctness and Potential Bugs: While the changes seem safe regarding their immediate functionality, ensure that our_finalized_slot and our_head_slot are correctly derived values and used elsewhere in the code if necessary. This prevents potential divergence between the consensus view and stored state.

  • Security Vulnerabilities: No immediate issues spotted with the current diff, but ensure peer_id, direction, and reason are securely handled across the codebase to avoid spoofing or logging sensitive information.

Performance Implications

  • The extraction of our_finalized_slot and our_head_slot into separate variables is likely negligible in terms of performance but might slightly improve the logging efficiency by avoiding repeatedly evaluating our_status.*.slot.

Rust Best Practices and Idiomatic Patterns

  • Your updated logging syntax is more idiomatic by using short form for pattern matching with structures, (%peer_id vs peer_id = %peer_id), which is good for readability and maintainability.

Memory Safety and Proper Error Handling

  • Ensure that all interactions with server.store through build_status(&server.store) correctly handle error cases, although not directly affected by this change, generally important for memory safety.

Code Readability and Maintainability

  • The revised logging code is more concise and improves readability. However, make sure that these logging messages remain consistent across the entire codebase to maintain clarity.

Consensus-Layer Considerations

  • Fork Choice Correctness: Without more context on how the gathered slots (our_finalized_slot, our_head_slot) are used, ensure they are accurate representations from the consensus layer's fork choice.

  • Attestation Processing and Validation: Verify that peers' status provides consistent information relevant to attestation data requirements.

  • Justification and Finalization Logic: The logging improvements facilitate better monitoring, which aids quick response to forks or consensus inconsistencies.

  • State Transition Functions: Not directly impacted by the logging changes, but ensure consistency with how slots are logged in state transitions.

  • XMSS and SSZ Concerns: This diff doesn't affect signature verification or encoding logic.

In conclusion, the logging improvements are beneficial, though ensure holistic correctness and security throughout the codebase. Further context-specific analysis would solidify the assurance levels of these changes.

@github-actions
Copy link

Kimi AI Code Review

This PR introduces improved logging messages across various parts of the ethlambda codebase. Here are my detailed comments and suggestions:

General Observations

  1. Code Correctness and Potential Bugs:

    • The changes seem to be correct and do not introduce any obvious bugs. The logging statements are updated to include more contextual information, which is beneficial for debugging and monitoring.
  2. Security Vulnerabilities:

    • No security vulnerabilities are introduced by these changes. Logging improvements do not affect the security posture of the system.
  3. Performance Implications:

    • The changes should have a negligible impact on performance. Logging is typically a lightweight operation, and the additional data being logged does not significantly increase the computational or memory overhead.
  4. Rust Best Practices and Idiomatic Patterns:

    • The use of tracing for logging is idiomatic in Rust. The introduction of tracing as a dependency is appropriate for this purpose.
    • The ShortRoot struct is a good way to display truncated root hashes, making the logs more readable.
  5. Memory Safety and Proper Error Handling:

    • The changes do not affect memory safety or error handling. The logging statements are correctly formatted and do not introduce any potential memory safety issues.
  6. Code Readability and Maintainability:

    • The improved logging messages make the code more readable and maintainable. They provide more context, which is helpful for understanding the system's behavior and debugging issues.

Specific Comments

  • blockchain/src/lib.rs:

    • The introduction of proposer in the logging statement for block processing is a good addition. It provides more context about the block's origin. Line 278
    • The ShortRoot struct is used effectively to display truncated root hashes in the logs. Line 278
  • blockchain/src/store.rs:

    • The logging statement for fork choice reorg detection is improved by including the new head's slot and root. Line 44
    • The additional logging for fork choice head updates is helpful and provides more context. Line 196
  • blockchain/state_transition/src/lib.rs:

    • The logging for justified and finalized checkpoints is improved by including more details about the state transitions. Line 298 and Line 319
  • common/types/src/lib.rs:

    • The ShortRoot struct is defined and implemented correctly. It is used to display truncated root hashes in the logs. Line 4
  • net/p2p/src/gossipsub/handler.rs:

    • The logging for received blocks and attestations from gossipsub is improved by including more details about the messages. Line 32 and Line 49
  • net/p2p/src/lib.rs:

    • The logging for peer connections and disconnections is improved by including more context about the events. Line 246 and Line 290

Conclusion

The PR is well-written and improves the logging across the codebase. The changes are consistent with Rust best practices and do not introduce any performance, security, or correctness issues. The improved logging messages will be beneficial for debugging and monitoring the system.

Overall Recommendation: Approved.


Automated review by Kimi (Moonshot AI)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Code review by ChatGPT

let block_root = signed_block.message.block.tree_hash_root();
let parent_root = signed_block.message.block.parent_root;
let proposer = signed_block.message.block.proposer_index;

Choose a reason for hiding this comment

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

Here is the review for the code snippet provided:

  1. Import Ordering: The Rust community generally prefers to order imports alphabetically within each import group for consistency and readability. The recent change disrupts this ordering for ShortRoot. Line imports should look like:
    use ethlambda_types::{
        ShortRoot,
        attestation::{Attestation, AttestationData, SignedAttestation},
        block::{BlockSignatures, BlockWithAttestation, SignedBlockWithAttestation},
        primitives::TreeHash,
        signature::ValidatorSecretKey,
        state::Checkpoint,
    };
  2. Security Considerations: Without full function implementations or context, it is not possible to ensure that security best practices are followed. It's essential to ensure robust validation of blocks and attestations, especially boundary and authorization checks.
  3. Potential Bugs and Error Handling: Make sure each function and interaction, especially network or IO tasks, have appropriate error handling. Rust’s Result and Option types should be leveraged.
  4. Fork Choice Correctness: Ensure that changes do not negatively impact the fork choice rule. If this code impacts that logic, double-check against the specification.
  5. Code Readability: Although the import modifications are minor, maintaining alphabetical order contributes to readability, especially as more imports are added.
  6. Memory Safety: Rust provides guarantees for memory safety, but ensure that there are no usages of unsafe blocks unless absolutely necessary. Also, use borrowing appropriately to avoid unnecessary copies.
  7. Performance Implications: Anytime concurrency is involved, as in the usage of spawned_concurrency::tasks, evaluate the potential for performance bottlenecks, especially in a consensus-critical system.

To proceed, I suggest reordering the imports back to an alphabetically sorted list and ensure comprehensive test coverage for all consensus-critical operations discussed above. Additional context or code would allow for a deeper review.


if old_head != new_head {
let old_slot = store.get_block(&old_head).map(|b| b.slot).unwrap_or(0);
let new_slot = store.get_block(&new_head).map(|b| b.slot).unwrap_or(0);

Choose a reason for hiding this comment

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

Code Review for ethlambda PR

  1. Imports Organization:

    • The import of ShortRoot was moved. Rust groups imports alphabetically within the same module bracket. Consistency in import ordering can improve readability. Consider organizing imports alphabetically to maintain consistency.
  2. Code Correctness & Potential Bugs:

    • Without additional context on the specific changes in function implementation, it's crucial that all consensus-related functions, such as process_slots, process_block, etc., strictly follow the specifications. Any deviation or incorrect logic could lead to consensus failure.
  3. Security Vulnerabilities:

    • Ensure that any cryptographic dependency, especially concerning XMSS signature verification and aggregation, is up to date and has undergone rigorous security audits.
    • Validate inputs rigorously, especially in attestation processing, to prevent overflow attacks or invalid state transitions.
  4. Performance Implications:

    • If there are changes involving loops or recursive calls, verify the computational complexity and ensure that they operate efficiently with Ethereum's expected load.
    • Benchmark any critical path changes for performance regressions.
  5. Rust Best Practices:

    • Ensure all operations that can fail are handled using Rust’s idiomatic error handling. The Result and Option types should be used extensively, and the ? operator should be checked for potential misuse.
  6. Memory Safety & Error Handling:

    • Ensure that all pointers (e.g., if using raw pointers or unsafe code) are handled with utmost care to avoid memory leaks or undefined behavior.
    • Validate that lifetimes are correctly used and there are no unnecessary clones that could lead to performance overhead.
  7. Code Readability & Maintainability:

    • Comment critical sections of the code, especially where fork choice logic or state transitions are implemented, to enhance clarity for future maintainers.
  8. Consensus-layer Considerations:

    • Ensure that fork choice rule implementation (LMD GHOST / 3SF-mini) aligns with the Ethereum specification.
    • Attestation handling should account for all edge cases, ensuring that they are both timely and correctly incorporated into the fork choice.
    • Review any alterations in state transition functions (e.g., process_slots, process_block) to guarantee correctness in state updates.
    • Validate SSZ encoding/decoding—ensure it handles the Ethereum consensus requirements fully and correctly.

Conclusion

There are concerns around ensuring consistent import order, strict correctness in state management and processing logic, and a strong emphasis on security practices. It's recommended to address these considerations before proceeding with the merge.

@@ -49,7 +63,16 @@

Choose a reason for hiding this comment

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

Code Correctness and Potential Bugs

  • Line 133-143: The closure passed to .inspect() should not contain side effects such as logging; instead, consider using .for_each() for such purposes. inspect() is generally used for observing values without causing side effects, and using it for logging might cause unexpected behavior in asynchronous executions where the closure is lazily evaluated.

Security Vulnerabilities

  • Ensure that Libp2p's gossipsub implementation and the input data (signed_block) are robust against known vulnerabilities such as malformed inputs, replay attacks, or denial-of-service vectors at the consensus layer.

Performance Implications

  • Encoding and Compression: If compressed involves heavy computation, consider if it can be optimized or offloaded to another async task, especially if it's within a hot path.

Rust Best Practices and Idiomatic Patterns

  • Import Statements: The refactoring of imports is more idiomatic in Rust as it groups similar items together, though it does not impact performance or safety directly.

Memory Safety and Proper Error Handling

  • The current use of inspect_err is appropriate to handle errors by logging warnings, but ensure processing logic adequately handles such errors (e.g., retry logic or state updates to reflect publishing failure).

Code Readability and Maintainability

  • The code's readability is generally good, especially with the logging details provided. However, consider adding comments or documentation to clarify the larger context of what publish_block is intended to accomplish.

Consensus-Layer Considerations

  • Fork Choice: Ensure LMD GHOST and 3SF-mini implementations are correctly integrated with the publishing logic to critically affect consensus.
  • Attestation Processing and Validation: If attestation data is involved in publish_block, ensure prior validation and error-handling paths are robust.

Given the potential misuse of .inspect() and the need for further checks around consensus logic, this PR requires additional fixing.

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

LGTM 👍

@github-actions
Copy link

Kimi AI Code Review

This PR aims to improve log messages in the ethlambda project. Here are my detailed review comments:
  1. Use of tracing library:

    • The PR introduces the use of the tracing library for logging. This is a good choice as tracing provides more flexibility and structured logging capabilities compared to the standard log crate.
    • Ensure that all dependencies are correctly updated to include tracing in Cargo.toml files.
  2. Logging patterns:

    • The PR provides guidelines for using tracing shorthand syntax, standardized field ordering, and root hash truncation. These are good practices for improving log readability and consistency.
    • The examples provided in the CLAUDE.md file are clear and demonstrate the intended usage patterns.
  3. Code changes:

    • The changes in lib.rs files to use tracing and the new logging patterns look good. The use of %slot, proposer, block_root = %ShortRoot(&block_root.0), etc., follows the recommended patterns.
    • The introduction of ShortRoot for truncating root hashes to 8 characters is a good idea for consistency in log messages.
  4. Error handling:

    • The PR updates error logging to include more context, such as %slot, proposer, and block_root. This will help in debugging issues more effectively.
  5. Performance implications:

    • The changes in logging should not have a significant impact on performance. However, it's essential to ensure that logging levels (e.g., info, warn, error) are used appropriately to avoid unnecessary logging overhead.
  6. Security considerations:

    • The logging changes do not introduce any security vulnerabilities. However, it's crucial to ensure that sensitive information is not accidentally logged.
  7. Code readability and maintainability:

    • The changes improve the readability of log messages by following a consistent pattern and including relevant context.
    • The use of tracing macros and structured logging makes the code more maintainable.
  8. Memory safety:

    • The logging changes do not introduce any memory safety issues.

Overall, the PR looks good and improves the logging in the ethlambda project. The changes follow best practices for using tracing and structured logging. I would approve this PR with a minor suggestion:

  • In the CLAUDE.md file, consider adding a section on logging levels (e.g., info, warn, error) and when to use each level. This will help ensure that logging is used effectively and does not introduce unnecessary overhead.

One minor nit:

  • In crates/net/p2p/src/gossipsub/handler.rs, the inspect_err block for publishing attestations and blocks should use warn! instead of error! to indicate that the failure is non-critical and does not prevent the node from functioning. This will help in distinguishing between critical and non-critical issues in the logs.
.inspect_err(|err| {
    tracing::warn!(%slot, %validator, %err, "Failed to publish attestation to gossipsub")
});

With these changes, the PR is ready to merge. Good work on improving the logging in the ethlambda project!


Automated review by Kimi (Moonshot AI)

@MegaRedHand MegaRedHand merged commit c276928 into main Jan 29, 2026
4 of 5 checks passed
@MegaRedHand MegaRedHand deleted the improve-logs branch January 29, 2026 22:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants