Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Review of #690 by @olshansk #699

Conversation

Olshansk
Copy link
Member

@Olshansk Olshansk commented Jul 20, 2024

Summary by CodeRabbit

  • New Features

    • Introduced a new relay difficulty management system based on target hashes instead of minimum difficulty bits, enhancing flexibility and precision in relay mining.
    • Added detailed telemetry and logging improvements for relay mining difficulty metrics.
    • Implemented a scaling function for relay difficulty target hashes, allowing for dynamic adjustments based on performance.
  • Bug Fixes

    • Enhanced validation logic for relay difficulty parameters to ensure correctness in processing and updating values.
  • Tests

    • Comprehensive updates to existing tests to align with the new relay difficulty target hash system, ensuring accuracy in functionality and behavior verification.

@Olshansk Olshansk added miner Changes related to the Miner code health Cleans up some code labels Jul 20, 2024
@Olshansk Olshansk self-assigned this Jul 20, 2024
Copy link

coderabbitai bot commented Jul 20, 2024

Walkthrough

The changes significantly revamp the relay difficulty management in the system. The previous numerical representation of minimum relay difficulty has been replaced with a more flexible byte array, allowing for complex hashing mechanisms. This update impacts various components, including parameter validation, mining logic, and testing frameworks, ensuring a robust and adaptable approach to relay mining dynamics.

Changes

Files Change Summary
api/poktroll/proof/params.pulsar.go, pkg/client/interface.go, proto/poktroll/proof/params.proto, x/proof/types/params.go Replaced MinRelayDifficultyBits with RelayDifficultyTargetHash of type []byte, updating associated methods and validation logic accordingly.
pkg/crypto/protocol/difficulty.go, pkg/crypto/protocol/difficulty_test.go, pkg/crypto/protocol/hash.go, pkg/crypto/protocol/hasher.go, pkg/relayer/miner/miner.go, pkg/relayer/miner/miner_test.go, x/proof/keeper/msg_server_submit_proof.go, x/proof/types/message_update_param.go, x/proof/types/message_update_param_test.go Introduced new hash-based mechanisms and functions, shifting the focus from numerical difficulty bits to hash comparisons, enhancing flexibility and validation.
e2e/tests/parse_params_test.go, e2e/tests/update_params.feature, e2e/tests/update_params_test.go, x/tokenomics/keeper/update_relay_mining_difficulty.go, x/tokenomics/keeper/update_relay_mining_difficulty_test.go, x/tokenomics/module/abci.go Reflected new parameter structures in tests and updated logic for computing relay mining difficulty, emphasizing hash-based targets and improving test clarity.
x/tokenomics/keeper/scale_difficulty_test.go, x/tokenomics/keeper/settle_pending_claims.go, pkg/crypto/rand/integer.go, pkg/relayer/miner/gen/gen_fixtures.go, pkg/relayer/miner/options.go, telemetry/event_counters.go, testutil/testrelayer/relays.go Various updates and comments for future improvements without altering core functionalities, focusing on consistency and maintainability.

Sequence Diagram(s)

sequenceDiagram
    participant A as Miner
    participant B as Params
    participant C as Difficulty Protocol
    participant D as Relay

    A->>B: Request RelayDifficultyTargetHash
    B-->>A: RelayDifficultyTargetHash
    A->>C: Validate RelayDifficulty with Hash
    C-->>A: Validation Result
    A->>D: Adjust Mining Difficulty
Loading

🐇 In a world of bytes and hashes,
I hop and leap through data clashes.
Relay targets now in sight,
With clever hashes, we take flight!
A new dawn for mining plays,
Hooray for changes, hip-hip hoorays! 🎉


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:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @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 as 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.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

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.

@Olshansk Olshansk changed the base branch from main to refactor/difficulty/target-hash July 20, 2024 00:01
Copy link

@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.

Caution

Inline review comments failed to post

Actionable comments posted: 5

Outside diff range, codebase verification and nitpick comments (6)
pkg/crypto/protocol/hash.go (1)

6-14: Inconsistent error handling for hasher.Write.

The error handling for hasher.Write is inconsistent across the codebase. In some instances, errors are ignored, while in others, they are handled by returning or panicking.

  • Ignored errors:

    • pkg/crypto/protocol/hash.go (lines 6-14)
  • Handled errors:

    • pkg/relayer/miner/gen/gen_fixtures.go (lines 6-10)
    • pkg/crypto/protocol/proof_path.go (lines 6-10)

Please ensure consistent error handling to follow best practices.

Analysis chain

Verify the error handling.

Ensure that ignoring the error from hasher.Write is intentional and follows best practices.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the error handling in the codebase.

# Test: Search for the usage of hasher.Write. Expect: Error handling is consistent and follows best practices.
rg --type go -A 5 $'hasher.Write'

Length of output: 1384

proto/poktroll/proof/params.proto (1)

15-17: The field min_relay_difficulty_bits has not been fully replaced by relay_difficulty_target_hash.

The following files still contain references to the old field min_relay_difficulty_bits and need to be updated:

  • tools/scripts/params/proof_all.json
  • tools/scripts/params/proof_min_relay_difficulty_bits.json
  • e2e/tests/update_params.feature
  • docusaurus/docs/develop/developer_guide/adding_params.md
  • Makefile
  • docs/static/openapi.yml

Please ensure that all references to min_relay_difficulty_bits are updated to relay_difficulty_target_hash.

Analysis chain

Verify the usage of the new field relay_difficulty_target_hash.

Ensure that all references to the old field min_relay_difficulty_bits are updated to use the new field relay_difficulty_target_hash.


Verify the usage of the new field relay_difficulty_target_hash.

Ensure that all references to the old field min_relay_difficulty_bits are updated to use the new field relay_difficulty_target_hash.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all references to the old field `min_relay_difficulty_bits` are updated to use the new field `relay_difficulty_target_hash`.

# Test: Search for the field usage. Expect: Only occurances of the new field.
rg --type proto 'min_relay_difficulty_bits|relay_difficulty_target_hash'

Length of output: 104


Script:

#!/bin/bash
# Description: Verify all references to the old field `min_relay_difficulty_bits` are updated to use the new field `relay_difficulty_target_hash`.

# Test: Search for the field usage. Expect: Only occurrences of the new field.
rg 'min_relay_difficulty_bits|relay_difficulty_target_hash'

Length of output: 4453

x/tokenomics/keeper/scale_difficulty_test.go (1)

18-23: Consider adding more descriptive test case names.

The current test case descriptions are brief and might not provide enough context. Consider adding more descriptive names to make the test cases clearer.

- desc: "Scale by 0.5"
+ desc: "Scale maximum target hash by 0.5"
x/proof/keeper/params_test.go (1)

24-25: Ensure proper type for relayDifficultyTargetHash.

The type any is used for relayDifficultyTargetHash. To improve type safety and consistency across the codebase, consider changing the type to []byte.

  • File: x/proof/keeper/params_test.go
  • Lines: 24-25
Analysis chain

Ensure proper type for relayDifficultyTargetHash.

The type any is used for relayDifficultyTargetHash. Consider using a more specific type if possible to improve type safety.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all occurrences of `relayDifficultyTargetHash` in the codebase to ensure proper type usage.

# Test: Search for the variable usage. Expect: Proper type usage.
rg --type go -A 5 $'relayDifficultyTargetHash'

Length of output: 7019

x/tokenomics/keeper/update_relay_mining_difficulty_test.go (1)

131-132: Ensure consistent use of leading zero bits.

The target hash is now set to ensure at least 8 leading zero bits in one instance. This change should be consistently applied across all relevant tests.

  • x/tokenomics/keeper/update_relay_mining_difficulty_test.go: Ensure similar changes are applied to other relevant test cases.
Analysis chain

Ensure consistent use of leading zero bits.

The target hash is now set to ensure at least 8 leading zero bits. This change should be consistently applied across all relevant tests.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 $'[]byte{0b00000000}'

Length of output: 121


Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 '[]byte{0b00000000}'

Length of output: 121


Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 '\[\]byte{0b00000000}'

Length of output: 136


Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 '\[\]byte\{0b00000000\}'

Length of output: 506

api/poktroll/proof/params.pulsar.go (1)

221-222: Add tests for relay_difficulty_target_hash in the codebase.

The current tests do not verify the correct handling of relay_difficulty_target_hash. Please add tests to ensure its correct handling.

  • Add tests in message_update_param_test.go or other relevant test files to verify the correct handling of relay_difficulty_target_hash.
Analysis chain

Ensure correct handling of relay_difficulty_target_hash in Set method.

The updated Set method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.


Verify the usage and testing of relay_difficulty_target_hash in the codebase.

To ensure the correct handling of relay_difficulty_target_hash in the Set method, we need to verify if this parameter is used and tested elsewhere in the codebase.


Verify the tests for relay_difficulty_target_hash in message_update_param_test.go.

To ensure the correct handling of relay_difficulty_target_hash, we need to verify the tests in message_update_param_test.go.


Verify the presence of tests for relay_difficulty_target_hash in other test files.

To ensure the correct handling of relay_difficulty_target_hash, we need to verify if there are tests in other files.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correct usage of the `Set` method in the codebase.

# Test: Search for the usage of the `Set` method. Expect: Correct usage in the codebase.
rg --type go 'Set'

Length of output: 183428


Script:

#!/bin/bash
# Description: Verify the usage of `relay_difficulty_target_hash` in the codebase.

# Test: Search for the usage of `relay_difficulty_target_hash`. Expect: Usage in the codebase.
rg --type go 'relay_difficulty_target_hash'

Length of output: 1989


Script:

#!/bin/bash
# Description: Verify the tests for `relay_difficulty_target_hash` in `message_update_param_test.go`.

# Test: Search for the usage of `relay_difficulty_target_hash` in `message_update_param_test.go`. Expect: Tests related to this parameter.
rg --type go 'relay_difficulty_target_hash' x/proof/types/message_update_param_test.go

Length of output: 139


Script:

#!/bin/bash
# Description: Verify the tests for `relay_difficulty_target_hash` in the codebase.

# Test: Search for the usage of `relay_difficulty_target_hash` in test files. Expect: Tests related to this parameter.
rg --type go --glob '*_test.go' 'relay_difficulty_target_hash'

Length of output: 158

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 1d75111 and a5f9b61.

Files ignored due to path filters (1)
  • x/proof/types/params.pb.go is excluded by !**/*.pb.go
Files selected for processing (34)
  • api/poktroll/proof/params.pulsar.go (15 hunks)
  • e2e/tests/parse_params_test.go (2 hunks)
  • e2e/tests/update_params.feature (2 hunks)
  • e2e/tests/update_params_test.go (2 hunks)
  • pkg/client/interface.go (1 hunks)
  • pkg/crypto/protocol/difficulty.go (1 hunks)
  • pkg/crypto/protocol/difficulty_test.go (1 hunks)
  • pkg/crypto/protocol/hash.go (1 hunks)
  • pkg/crypto/protocol/hasher.go (1 hunks)
  • pkg/crypto/rand/integer.go (1 hunks)
  • pkg/relayer/miner/gen/gen_fixtures.go (1 hunks)
  • pkg/relayer/miner/miner.go (4 hunks)
  • pkg/relayer/miner/miner_test.go (3 hunks)
  • pkg/relayer/miner/options.go (1 hunks)
  • proto/poktroll/proof/params.proto (1 hunks)
  • telemetry/event_counters.go (1 hunks)
  • tests/integration/tokenomics/relay_mining_difficulty_test.go (1 hunks)
  • testutil/testrelayer/relays.go (3 hunks)
  • x/proof/keeper/msg_server_submit_proof.go (3 hunks)
  • x/proof/keeper/msg_server_submit_proof_test.go (8 hunks)
  • x/proof/keeper/msg_server_update_param.go (1 hunks)
  • x/proof/keeper/msg_server_update_param_test.go (2 hunks)
  • x/proof/keeper/msg_update_params_test.go (1 hunks)
  • x/proof/keeper/params_test.go (1 hunks)
  • x/proof/types/message_update_param.go (2 hunks)
  • x/proof/types/message_update_param_test.go (2 hunks)
  • x/proof/types/params.go (6 hunks)
  • x/service/types/relay.go (2 hunks)
  • x/tokenomics/keeper/msg_server_update_param_test.go (1 hunks)
  • x/tokenomics/keeper/scale_difficulty_test.go (1 hunks)
  • x/tokenomics/keeper/settle_pending_claims.go (1 hunks)
  • x/tokenomics/keeper/update_relay_mining_difficulty.go (5 hunks)
  • x/tokenomics/keeper/update_relay_mining_difficulty_test.go (7 hunks)
  • x/tokenomics/module/abci.go (5 hunks)
Files skipped from review due to trivial changes (3)
  • pkg/relayer/miner/gen/gen_fixtures.go
  • x/tokenomics/keeper/msg_server_update_param_test.go
  • x/tokenomics/keeper/settle_pending_claims.go
Additional context used
GitHub Check: go-test
tests/integration/tokenomics/relay_mining_difficulty_test.go

[failure] 122-122:
undefined: prooftypes.DefaultRelayDifficultyTargetHashHex


[failure] 123-123:
undefined: prooftypes.DefaultRelayDifficultyTargetHashHex (typecheck)

Additional comments not posted (80)
pkg/relayer/miner/options.go (2)

5-8: LGTM!

The function WithRelayDifficultyTargetHash is correctly implemented.


5-8: Verify the type assertion.

Ensure that the type assertion mnr.(*miner) is safe and doesn't cause runtime errors. Consider adding a type check or handling the potential panic.

Verification successful

Verify the type assertion.

Ensure that the type assertion mnr.(*miner) is safe and doesn't cause runtime errors. Consider adding a type check or handling the potential panic.


Verify the type assertion.

Ensure that the type assertion mnr.(*miner) is safe and doesn't cause runtime errors. Consider adding a type check or handling the potential panic.


Verify the type assertion.

Ensure that the type assertion mnr.(*miner) is safe and doesn't cause runtime errors. Consider adding a type check or handling the potential panic.


Verify the type assertion.

The type assertion mnr.(*miner) is safe as the miner struct implements the relayer.Miner interface, evidenced by the presence of the MinedRelays method.

  • pkg/relayer/miner/miner.go: Methods like MinedRelays confirm that miner implements the relayer.Miner interface.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the type assertion for miner in the codebase.

# Test: Search for the miner type definition. Expect: miner type is correctly defined and used.
rg --type go -A 5 $'type miner'

Length of output: 442


Script:

#!/bin/bash
# Description: Verify if the miner struct implements the relayer.Miner interface.

# Test: Search for the relayer.Miner interface definition and check if miner implements it.
rg --type go -A 10 'type Miner interface'
rg --type go -A 10 'func (m *miner)'

Length of output: 688


Script:

#!/bin/bash
# Description: Verify if the miner struct implements the relayer.Miner interface by checking implemented methods.

# Test: Search for methods implemented by *miner and compare with relayer.Miner interface methods.
rg --type go 'func (m *miner)' -A 5

Length of output: 37


Script:

#!/bin/bash
# Description: Verify if the miner struct implements the relayer.Miner interface by checking implemented methods.

# Test: Search for all methods in the pkg/relayer/miner package.
rg --type go 'func ' pkg/relayer/miner/

Length of output: 1469

pkg/crypto/protocol/hasher.go (2)

6-6: LGTM!

The new constant RelayHasherSize is correctly defined.


14-15: LGTM!

The new variable NewRelayHasher is correctly declared and grouped with NewTrieHasher.

pkg/crypto/protocol/hash.go (1)

6-14: LGTM!

The function GetRelayHashFromBytes is correctly implemented.

pkg/crypto/rand/integer.go (1)

21-29: Important considerations for future improvements.

The comments highlight crucial issues regarding language-agnosticism and precision loss in the pseudo-random number generator. These are important considerations for future improvements to ensure compatibility and robustness.

x/proof/keeper/msg_update_params_test.go (1)

45-46: Enhanced test coverage with new field RelayDifficultyTargetHash.

The addition of RelayDifficultyTargetHash to the Params struct in the test case improves the test coverage and ensures that the new parameter is properly validated.

x/proof/types/message_update_param_test.go (3)

31-31: Updated test case for invalid parameter name.

The change from "WRONG_min_relay_difficulty_bits" to "WRONG_relay_difficulty_target_hash" reflects the new focus of parameter validation. Ensure that this aligns with the updated validation logic.


40-40: Updated test case for incorrect parameter type.

The change from ParamMinRelayDifficultyBits to ParamRelayDifficultyTargetHash and the type from MsgUpdateParam_AsInt64 to MsgUpdateParam_AsBytes reflects the new parameter validation logic. Ensure that this aligns with the updated validation logic.


48-49: Updated test case for valid parameter.

The change to ParamRelayDifficultyTargetHash and the type to MsgUpdateParam_AsBytes reflects the new expected data type for the parameter being validated. Ensure that this aligns with the updated validation logic.

pkg/crypto/protocol/difficulty.go (4)

4-6: LGTM! New imports are necessary for the new functionality.

The added imports bytes, encoding/hex, and math/big are required for the new hash difficulty calculations.


9-21: LGTM! New global variable is necessary for baseline difficulty calculations.

The global variable BaseRelayDifficultyHashBz is defined as a decoded hexadecimal string representing the "highest" target hash, establishing a baseline for difficulty calculations.


24-33: LGTM! New function for calculating hash difficulty is well-implemented.

The GetDifficultyFromHash function calculates the difficulty of a given hash relative to the baseline difficulty hash using the math/big package for precise calculations.


35-43: LGTM! New function for determining relay volume applicability is well-implemented.

The IsRelayVolumeApplicable function determines if a relay's hash is less than a specified target hash using the bytes.Compare method.

x/proof/keeper/msg_server_update_param.go (1)

26-37: LGTM! But verify the usage of the new parameter ParamRelayDifficultyTargetHash.

The changes to the UpdateParam function are well-implemented.

However, ensure that all references to the old parameter ParamMinRelayDifficultyBits are updated to use the new parameter ParamRelayDifficultyTargetHash.

Verification successful

Verified! All references to the old parameter ParamMinRelayDifficultyBits have been updated to use the new parameter ParamRelayDifficultyTargetHash.

The changes are consistently applied throughout the codebase.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all references to the old parameter `ParamMinRelayDifficultyBits` are updated to use the new parameter `ParamRelayDifficultyTargetHash`.

# Test: Search for the parameter usage. Expect: Only occurances of the new parameter.
rg --type go 'ParamMinRelayDifficultyBits|ParamRelayDifficultyTargetHash'

Length of output: 815

x/proof/types/message_update_param.go (2)

63-73: LGTM!

The method paramTypeIsBytes correctly checks if the parameter type is a byte slice.


50-51: Ensure consistent usage of paramTypeIsBytes.

The change to validate ParamRelayDifficultyTargetHash using paramTypeIsBytes appears correct. Ensure that this new validation method is consistently used throughout the codebase where applicable.

Verification successful

Ensure consistent usage of paramTypeIsBytes.

The change to validate ParamRelayDifficultyTargetHash using paramTypeIsBytes appears correct and is consistently applied across the codebase where applicable. The validation logic in x/proof/keeper/msg_server_update_param.go is equivalent to paramTypeIsBytes.

  • x/proof/keeper/msg_server_update_param.go: Validation ensures the value is of type *types.MsgUpdateParam_AsBytes.
  • x/proof/types/message_update_param.go: Uses paramTypeIsBytes directly.
  • x/proof/types/params.go: Contains definitions without validation logic.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of `paramTypeIsBytes`.

# Test: Search for the usage of `paramTypeIsBytes`. Expect: Consistent usage throughout the codebase.
rg --type go 'paramTypeIsBytes'

Length of output: 324


Script:

#!/bin/bash
# Description: Verify if `ParamRelayDifficultyTargetHash` is used elsewhere in the codebase and check for consistent validation.

# Test: Search for the usage of `ParamRelayDifficultyTargetHash`. Expect: Identify all instances and check if `paramTypeIsBytes` is used for validation.
rg --type go 'ParamRelayDifficultyTargetHash'

Length of output: 785


Script:

#!/bin/bash
# Description: Verify if `paramTypeIsBytes` or equivalent validation is used in all relevant instances of `ParamRelayDifficultyTargetHash`.

# Test: Search for the usage of `ParamRelayDifficultyTargetHash` in non-test files and examine the context for validation logic.
rg --type go 'ParamRelayDifficultyTargetHash' -g '!*_test.go' -A 5 -B 5

Length of output: 2624

x/tokenomics/module/abci.go (4)

30-34: Relocate logging to reflect final state.

The logging of settled and expired claims has been moved to a more appropriate location after the claims have been settled. This change ensures that the logged values reflect the final state of the process.


Line range hint 36-54:
Defer telemetry calls to reference final values.

The telemetry calls have been deferred to ensure that they reference the final values of relevant variables. This change emphasizes the importance of accurate telemetry reporting.


84-93: Enhance telemetry for relay mining difficulty.

The loop that emits telemetry for each service's relay mining difficulty has been updated to include the new variable newRelayMiningTargetHash. This change enhances the clarity and accuracy of the telemetry data being reported.


8-8: Ensure the new import is necessary.

The new import statement for the protocol package indicates the integration of additional cryptographic functionality. Verify that this new import is necessary and used appropriately.

Verification successful

The new import is necessary.

The protocol package is utilized within the file x/tokenomics/module/abci.go, confirming the necessity of the import statement.

  • x/tokenomics/module/abci.go: Lines where protocol is used:
    • var newRelayMiningTargetHash [protocol.RelayHasherSize]byte
    • difficulty := protocol.GetDifficultyFromHash(newRelayMiningTargetHash)
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the necessity of the new import statement for the `protocol` package.

# Test: Search for the usage of the `protocol` package. Expect: Appropriate usage throughout the codebase.
rg --type go 'protocol'

Length of output: 11463

pkg/crypto/protocol/difficulty_test.go (3)

11-36: Refactor improves readability and clarity.

The refactor of the TestGetDifficultyFromHash function improves readability and clarity by using descriptive test case fields and hexadecimal string representations.


56-102: LGTM!

The addition of the TestIsRelayVolumeApplicable function enhances the test coverage by checking if the relay hash is applicable to the target hash based on various conditions.


39-53: Ensure comprehensive test coverage.

The test cases cover multiple scenarios for different difficulty levels. Ensure that all relevant scenarios are covered and that the test cases are comprehensive.

Verification successful

Comprehensive test coverage verified.

The test cases in difficulty_test.go cover multiple scenarios for different difficulty levels, and GetDifficultyFromHash is also used within the proof submission logic tested in msg_server_submit_proof_test.go. The test coverage appears to be comprehensive.

  • pkg/crypto/protocol/difficulty_test.go: Contains detailed test cases for GetDifficultyFromHash.
  • x/proof/keeper/msg_server_submit_proof_test.go: Tests the usage of GetDifficultyFromHash within proof submission logic.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify comprehensive test coverage for `TestGetDifficultyFromHash`.

# Test: Search for additional test cases for `GetDifficultyFromHash`. Expect: Comprehensive test coverage.
rg --type go 'GetDifficultyFromHash'

Length of output: 1099


Script:

#!/bin/bash
# Extract test cases from difficulty_test.go
rg --type go -A 10 'func Test' pkg/crypto/protocol/difficulty_test.go

# Extract test cases from msg_server_submit_proof_test.go
rg --type go -A 10 'func Test' x/proof/keeper/msg_server_submit_proof_test.go

Length of output: 2239

pkg/relayer/miner/miner.go (4)

97-98: LGTM! But verify the usage of the new field.

The code changes are approved.

However, ensure that all instances of relayDifficultyTargetHash in the codebase are correctly updated.


120-120: LGTM! But verify the usage of the new method.

The code changes are approved.

However, ensure that all instances of IsRelayVolumeApplicable in the codebase are correctly updated.

Verification successful

Verification Successful!

The IsRelayVolumeApplicable method is correctly updated and consistently used across the codebase.

  • x/proof/keeper/msg_server_submit_proof.go
  • pkg/relayer/miner/miner.go
  • pkg/crypto/protocol/difficulty.go
  • pkg/crypto/protocol/difficulty_test.go
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all instances of `IsRelayVolumeApplicable` are correctly updated.

# Test: Search for the method usage. Expect: Only occurances of the new method.
rg --type go -A 5 $'IsRelayVolumeApplicable'

Length of output: 2545


28-33: LGTM! But verify the usage of the new field.

The code changes are approved.

However, ensure that all instances of relayDifficultyTargetHash in the codebase are correctly updated.

Verification successful

LGTM! The usage of relayDifficultyTargetHash is correctly integrated across the codebase.

The field relayDifficultyTargetHash has been appropriately added and utilized in various parts of the codebase, including tests, protobuf definitions, and other Go files. There are no discrepancies or missing updates related to this field.

  • e2e/tests/update_params_test.go
  • x/proof/types/params.go
  • x/proof/types/params.pb.go
  • x/proof/keeper/msg_server_update_param.go
  • x/proof/keeper/params_test.go
  • pkg/relayer/miner/options.go
  • pkg/relayer/miner/miner.go
  • api/poktroll/proof/params.pulsar.go
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all instances of `relayDifficultyTargetHash` are correctly updated.

# Test: Search for the field usage. Expect: Only occurances of the new field.
rg --type go -A 5 $'relayDifficultyTargetHash'

Length of output: 7019


43-43: LGTM! But verify the usage of the new option.

The code changes are approved.

However, ensure that all instances of NewMiner in the codebase use the new WithRelayDifficultyTargetHash option.

pkg/relayer/miner/miner_test.go (2)

46-46: LGTM! But verify the usage of the new option.

The code changes are approved.

However, ensure that all instances of WithRelayDifficultyTargetHash in the test code are correctly updated.

Verification successful

LGTM! But verify the usage of the new option.

The code changes are approved.

  • The WithRelayDifficultyTargetHash option is correctly updated and used in the test code.
  • No outdated or incorrect usages were found.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all instances of `WithRelayDifficultyTargetHash` are correctly updated.

# Test: Search for the option usage. Expect: Only occurances of the new option.
rg --type go -A 5 $'WithRelayDifficultyTargetHash'

Length of output: 1205


26-26: LGTM! But verify the usage of the new variable.

The code changes are approved.

However, ensure that all instances of testRelayMiningTargetHash in the test code are correctly updated.

Verification successful

Verification Successful: No issues found.

The variable testRelayMiningTargetHash has been correctly introduced and all instances of the old variable testDifficulty have been removed. The changes are properly implemented.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all instances of `testRelayMiningTargetHash` are correctly updated.

# Test: Search for the variable usage. Expect: Only occurances of the new variable.
rg --type go -A 5 $'testRelayMiningTargetHash'

Length of output: 1018


Script:

#!/bin/bash
# Description: Verify that all instances of the old variable `testDifficulty` have been replaced.

# Test: Search for the old variable usage. Expect: No occurrences of the old variable.
rg --type go -A 5 $'testDifficulty'

Length of output: 34

x/proof/keeper/params_test.go (1)

33-34: Add validation for DefaultRelayDifficultyTargetHash.

Ensure that DefaultRelayDifficultyTargetHash is properly validated in the test case.

Verification successful

Validation for DefaultRelayDifficultyTargetHash is already present and sufficient.

The ValidateRelayDifficultyTargetHash function in x/proof/types/params.go ensures that the relay difficulty target hash is of the correct type and length. The test cases in x/proof/keeper/params_test.go already include calls to this validation function, ensuring the integrity of DefaultRelayDifficultyTargetHash.

  • The function ValidateRelayDifficultyTargetHash verifies the type and length of the target hash.
  • Test cases in params_test.go indirectly validate DefaultRelayDifficultyTargetHash by using this function.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the value and validation of `DefaultRelayDifficultyTargetHash`.

# Test: Search for the variable usage. Expect: Proper validation.
rg --type go -A 5 $'DefaultRelayDifficultyTargetHash'

Length of output: 4936


Script:

#!/bin/bash
# Description: Inspect test cases for validation of `DefaultRelayDifficultyTargetHash`.

# Search for test cases involving `DefaultRelayDifficultyTargetHash` in `params_test.go` and `update_relay_mining_difficulty_test.go`.
rg --type go -A 10 'DefaultRelayDifficultyTargetHash' x/proof/keeper/params_test.go x/tokenomics/keeper/update_relay_mining_difficulty_test.go

Length of output: 2071


Script:

#!/bin/bash
# Description: Verify the implementation and usage of `ValidateRelayDifficultyTargetHash`.

# Search for the implementation of `ValidateRelayDifficultyTargetHash`.
rg --type go 'func ValidateRelayDifficultyTargetHash' 

# Search for test cases that use `ValidateRelayDifficultyTargetHash` in `params_test.go`.
rg --type go 'ValidateRelayDifficultyTargetHash' x/proof/keeper/params_test.go

Length of output: 305


Script:

#!/bin/bash
# Description: Inspect the implementation of `ValidateRelayDifficultyTargetHash`.

# Display the implementation of `ValidateRelayDifficultyTargetHash` in `params.go`.
rg --type go -A 10 'func ValidateRelayDifficultyTargetHash' x/proof/types/params.go

Length of output: 443

x/service/types/relay.go (3)

14-20: Ensure proper handling of protocol.RelayHasherSize.

The function GetHash now uses protocol.RelayHasherSize. Ensure that protocol.RelayHasherSize is properly defined and used consistently.

Verification successful

Verified: Proper handling of protocol.RelayHasherSize.

The function GetHash uses protocol.RelayHasherSize, which is consistently defined and used across the codebase. The definition in pkg/crypto/protocol/hasher.go confirms that it is set to the SHA-256 hash size, ensuring correctness.

  • pkg/crypto/protocol/hasher.go:
    • RelayHasherSize = sha256.Size
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the definition and usage of `protocol.RelayHasherSize`.

# Test: Search for the variable usage. Expect: Proper definition and consistent usage.
rg --type go -A 5 $'RelayHasherSize'

Length of output: 6589


26-37: Ensure proper handling of protocol.RelayHasherSize in RelayRequest.

The function GetSignableBytesHash for RelayRequest now uses protocol.RelayHasherSize. Ensure that protocol.RelayHasherSize is properly defined and used consistently.

Verification successful

Ensure proper handling of protocol.RelayHasherSize in RelayRequest.

The function GetSignableBytesHash for RelayRequest uses protocol.RelayHasherSize, which is properly defined as sha256.Size in pkg/crypto/protocol/hasher.go and used consistently across the codebase.

  • pkg/crypto/protocol/hasher.go: RelayHasherSize = sha256.Size
  • x/service/types/relay.go: Multiple functions including GetSignableBytesHash, GetHash, etc.
  • Other files: x/tokenomics/module/abci.go, x/proof/keeper/msg_server_submit_proof.go, x/proof/types/params.go, etc.

This confirms that protocol.RelayHasherSize is properly defined and used consistently.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the definition and usage of `protocol.RelayHasherSize` in `RelayRequest`.

# Test: Search for the variable usage. Expect: Proper definition and consistent usage.
rg --type go -A 5 $'RelayHasherSize'

Length of output: 6589


68-79: Ensure proper handling of protocol.RelayHasherSize in RelayResponse.

The function GetSignableBytesHash for RelayResponse now uses protocol.RelayHasherSize. Ensure that protocol.RelayHasherSize is properly defined and used consistently.

Verification successful

Ensure proper handling of protocol.RelayHasherSize in RelayResponse.

The function GetSignableBytesHash for RelayResponse now uses protocol.RelayHasherSize. The definition and usage of protocol.RelayHasherSize are consistent and correct across the codebase.

  • pkg/crypto/protocol/hasher.go: RelayHasherSize is defined as sha256.Size.
  • Consistent usage in x/service/types/relay.go, x/tokenomics/module/abci.go, x/proof/keeper/msg_server_submit_proof.go, and other related files.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the definition and usage of `protocol.RelayHasherSize` in `RelayResponse`.

# Test: Search for the variable usage. Expect: Proper definition and consistent usage.
rg --type go -A 5 $'RelayHasherSize'

Length of output: 6589

x/proof/keeper/msg_server_update_param_test.go (4)

19-19: Ensure proper decoding of expectedRelayDifficultyTargetHash.

The variable expectedRelayDifficultyTargetHash is decoded from a hexadecimal string. Ensure that the decoding is correct and consistent with the expected hash.

Verification successful

The decoding of expectedRelayDifficultyTargetHash is correct and consistently used.

  • The variable is properly decoded from the hexadecimal string.
  • It is used to verify the relay difficulty target hash before and after the update.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the decoding of `expectedRelayDifficultyTargetHash`.

# Test: Search for the variable usage. Expect: Proper decoding and consistent usage.
rg --type go -A 5 $'expectedRelayDifficultyTargetHash'

Length of output: 2331


38-39: Ensure proper validation of updated parameters.

The test case validates the updated relay difficulty target hash. Ensure that the validation is properly handled and consistent with the expected hash.

Verification successful

Proper validation of updated parameters is ensured.

The validation of the RelayDifficultyTargetHash parameter is properly handled in the codebase. The test case verifies that the updated relay difficulty target hash matches the expected value, and the validation logic is correctly implemented in the code.

  • The function types.ValidateRelayDifficultyTargetHash is used to validate the RelayDifficultyTargetHash.
  • The implementation of ValidateRelayDifficultyTargetHash in x/proof/types/params.go performs the necessary validation checks.
  • Multiple test cases confirm the validation logic.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the validation of updated parameters.

# Test: Search for the validation usage. Expect: Proper handling and validation.
rg --type go -A 5 $'RelayDifficultyTargetHash'

Length of output: 27661


32-33: Ensure proper update of relay difficulty target hash.

The test case updates the relay difficulty target hash. Ensure that the update is properly handled and validated.

Verification successful

Ensure proper update of relay difficulty target hash.

The update of the relay difficulty target hash is properly handled and validated in the following locations:

  • Parameter Definition:
    • x/proof/types/params.go
  • Handling in UpdateParam Method:
    • x/proof/keeper/msg_server_update_param.go
  • Test Cases:
    • x/proof/keeper/msg_server_update_param_test.go
    • x/proof/types/message_update_param_test.go

These locations confirm that the parameter is correctly defined, handled, and validated through various test scenarios.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the update of relay difficulty target hash.

# Test: Search for the update parameter usage. Expect: Proper handling and validation.
rg --type go -A 5 $'ParamRelayDifficultyTargetHash'

Length of output: 4203


27-27: Ensure proper validation of default parameters.

The test case ensures that the default relay difficulty target hash is different from the expected hash. Ensure that the default parameters are properly validated.

Verification successful

Proper validation of default parameters is ensured.

The DefaultParams function and corresponding validation functions across different modules confirm that default parameters are validated correctly.

  • Various DefaultParams functions are defined in multiple modules.
  • Validation functions for specific parameters are present and ensure the validity of default parameters.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the validation of default parameters.

# Test: Search for the default parameter usage. Expect: Proper validation.
rg --type go -A 5 $'DefaultParams'

Length of output: 85665


Script:

#!/bin/bash
# Description: Gather more specific information about the definition and usage of DefaultParams function.

# Search for the definition of DefaultParams function in Go files.
rg --type go 'func DefaultParams()'

# Search for validation functions related to parameters.
rg --type go 'func Validate' -A 5

Length of output: 5551

telemetry/event_counters.go (1)

150-161: LGTM! But verify the function usage in the codebase.

The code changes are approved.

However, ensure that all function calls to RelayMiningDifficultyGauge match the new signature.

Verification successful

Function usage verified successfully.

All function calls to RelayMiningDifficultyGauge match the new signature.

  • x/tokenomics/module/abci.go: telemetry.RelayMiningDifficultyGauge(difficulty, serviceId)
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `RelayMiningDifficultyGauge` match the new signature.

# Test: Search for the function usage. Expect: Only occurances of the new signature.
rg --type go -A 5 $'RelayMiningDifficultyGauge'

Length of output: 1028

x/proof/types/params.go (6)

20-21: LGTM!

The changes are straightforward and correctly replace KeyMinRelayDifficultyBits with KeyRelayDifficultyTargetHash.


22-22: LGTM!

The changes are straightforward and correctly introduce DefaultRelayDifficultyTargetHash with a default value derived from a hexadecimal string.


44-50: LGTM!

The changes are straightforward and correctly update the NewParams function to accept relayDifficultyTargetHash instead of minRelayDifficultyBits.


60-60: LGTM!

The changes are straightforward and correctly update the DefaultParams function to return the new default for RelayDifficultyTargetHash.


71-73: LGTM!

The changes are straightforward and correctly update the ParamSetPairs function to include the new parameter RelayDifficultyTargetHash and its corresponding validation function.


117-131: LGTM!

The changes are straightforward and correctly introduce the ValidateRelayDifficultyTargetHash function to replace ValidateMinRelayDifficultyBits.

e2e/tests/update_params.feature (2)

40-44: LGTM!

The changes are straightforward and correctly update the test scenario to replace min_relay_difficulty_bits with relay_difficulty_target_hash.


92-93: LGTM!

The changes are straightforward and correctly update the test scenario to replace min_relay_difficulty_bits with proof_request_probability.

testutil/testrelayer/relays.go (2)

114-114: Verify the correctness of the new hashing method.

The hash computation logic has been updated to use protocol.GetRelayHashFromBytes. Ensure this new method is correctly implemented and tested.


60-60: Verify the correctness of the new hashing method.

The hash computation logic has been updated to use protocol.GetRelayHashFromBytes. Ensure this new method is correctly implemented and tested.

x/tokenomics/keeper/update_relay_mining_difficulty.go (5)

34-34: LGTM! Enhanced precision for smoothing factor.

The change to use math/big for emaSmoothingFactor enhances the precision of the smoothing factor calculation.


60-60: LGTM! Improved accuracy for relay mining difficulty calculations.

The changes to use precision arithmetic for EMA calculations and relay mining difficulty updates enhance the accuracy and adaptability of the calculations.


122-142: LGTM! Dynamic approach for difficulty target calculation.

The changes to accept a prevTargetHash parameter and use precision arithmetic improve the dynamic approach to setting the difficulty target based on actual relay performance.


145-174: LGTM! New function for scaling difficulty target hash.

The new function scaleDifficultyTargetHash ensures the scaled target hash maintains the correct length and does not exceed predefined limits.


183-190: LGTM! Improved accuracy for EMA calculations.

The changes to use precision arithmetic for EMA calculations enhance the accuracy of the calculations.

tests/integration/tokenomics/relay_mining_difficulty_test.go (1)

122-123: LGTM! Improved maintainability of test assertions.

The changes to use prooftypes.DefaultRelayDifficultyTargetHashHex instead of hardcoded hexadecimal string values improve the maintainability and clarity of the test.

However, ensure that prooftypes.DefaultRelayDifficultyTargetHashHex is correctly defined and accessible.

Tools
GitHub Check: go-test

[failure] 122-122:
undefined: prooftypes.DefaultRelayDifficultyTargetHashHex


[failure] 123-123:
undefined: prooftypes.DefaultRelayDifficultyTargetHashHex (typecheck)

x/tokenomics/keeper/update_relay_mining_difficulty_test.go (4)

146-157: Refined assertions for target hash comparison.

The assertions have been refined to explicitly check if the new relay difficulty's target hash is less than or equal to the expected target hash. This change improves clarity and correctness.


164-167: Renamed variables for clarity.

The expected output variable has been renamed from expectedDifficultyHash to expectedRelayDifficultyHash. This change enhances clarity and consistency across the test suite.


221-228: Refined assertions for target hash comparison.

The assertions have been refined to explicitly check if the new relay difficulty's target hash is less than or equal to the expected target hash. This change improves clarity and correctness.


Line range hint 185-194:
Ensure consistent use of leading zero bits.

The target hash is now set to ensure at least 8 leading zero bits. This change should be consistently applied across all relevant tests.

Verification successful

Verification successful: Consistent use of leading zero bits in target hash.

The target hash is consistently set to ensure at least 8 leading zero bits across the relevant tests.

  • Instances found in x/tokenomics/keeper/update_relay_mining_difficulty_test.go:
    • []byte{0b00000000}, // at least 8 leading 0 bits
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 $'[]byte{0b00001111}'

Length of output: 121


Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 '\[\]byte{0b00001111}'

Length of output: 136


Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for the target hash initialization. Expect: Consistent use of leading zero bits.
rg --type go -A 5 '\[\]byte\{0b00001111\}'

Length of output: 520


Script:

#!/bin/bash
# Description: Verify consistent use of leading zero bits in target hash across all tests.

# Test: Search for various target hash initializations with leading zero bits.
for i in {0..15}; do
  rg --type go -A 5 "\[\]byte\{0b$(printf '%08d' $(echo "obase=2;$i" | bc))\}"
done

Length of output: 10229

e2e/tests/parse_params_test.go (1)

136-137: Ensure correct decoding of hex string.

The logic now decodes a hex string from the paramValue and assigns it to msgUpdateParams.Params.RelayDifficultyTargetHash. Ensure that the hex string is correctly decoded and assigned.

Verification successful

Ensure correct decoding of hex string.

The logic decodes a hex string from paramValue and assigns it to msgUpdateParams.Params.RelayDifficultyTargetHash. The decoding appears correct, but ensure that paramValue.value is a valid byte slice and that tests validate this behavior.

  • e2e/tests/parse_params_test.go
  • e2e/tests/update_params_test.go
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify correct decoding of hex string for RelayDifficultyTargetHash.

# Test: Search for the hex decoding logic. Expect: Correct decoding and assignment.
rg --type go -A 5 $'hex.DecodeString'

Length of output: 8311

pkg/client/interface.go (1)

338-338: Updated method signature in ProofParams interface.

The method signature has been changed from GetMinRelayDifficultyBits to GetRelayDifficultyTargetHash, reflecting a shift from numeric representation to a byte array. Ensure that all implementations of this interface are updated accordingly.

Verification successful

Updated method signature in ProofParams interface verified.

The method signature has been successfully updated from GetMinRelayDifficultyBits to GetRelayDifficultyTargetHash, and there are no remaining references to the old method.

  • api/poktroll/proof/params.pulsar.go
  • x/proof/types/params.pb.go
  • pkg/client/interface.go
  • pkg/relayer/miner/miner.go
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all implementations of `ProofParams` interface are updated.

# Test: Search for the implementations of `ProofParams` interface. Expect: Updated method signature.
rg --type go -A 5 $'GetRelayDifficultyTargetHash'

Length of output: 1297


Script:

#!/bin/bash
# Description: Verify no remaining references to the old method `GetMinRelayDifficultyBits`.

# Test: Search for any occurrences of `GetMinRelayDifficultyBits`. Expect: No results.
rg --type go $'GetMinRelayDifficultyBits'

Length of output: 40

e2e/tests/update_params_test.go (1)

374-376: Ensure correct decoding of relayDifficultyTargetHash.

The logic to decode relayDifficultyTargetHash from a byte slice to a hexadecimal string looks correct. Verify that the relayDifficultyTargetHash is correctly encoded elsewhere in the codebase.

x/proof/keeper/msg_server_submit_proof.go (3)

211-211: LGTM! But verify the function usage in the codebase.

The code changes are approved.

However, ensure that all function calls to validateRelayDifficulty match the new signature.

Verification successful

Function usage verified.

The function validateRelayDifficulty is only called within the same file where it is defined, and all instances match the new signature.

  • x/proof/keeper/msg_server_submit_proof.go
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `validateRelayDifficulty` match the new signature.

# Test: Search for the function usage. Expect: Only occurrences of the new signature.
rg --type go 'validateRelayDifficulty'

Length of output: 407


207-211: Ensure correct retrieval of relay difficulty parameters.

The TODO comment suggests a follow-up to get the difficulty associated with the service. Verify that the parameters are correctly retrieved and used in the validation.

Verification successful

Ensure correct retrieval of relay difficulty parameters.

The GetParams function in x/proof/keeper/params.go correctly retrieves and unmarshals the parameters from the store, ensuring that the relay difficulty parameters are correctly retrieved and used in the validation logic.

  • x/proof/keeper/params.go:
    • func (k Keeper) GetParams(ctx context.Context) (params types.Params)
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correct retrieval of relay difficulty parameters in the codebase.

# Test: Search for the retrieval logic. Expect: Correct retrieval logic for relay difficulty parameters.
rg --type go 'GetParams'

Length of output: 16632


Script:

#!/bin/bash
# Description: Locate and examine the GetParams function definition in x/proof/keeper/params.go.

# Locate the GetParams function definition in the proof module.
ast-grep --lang go --pattern 'func (k Keeper) GetParams(ctx context.Context) (params types.Params) { $$$ }'

Length of output: 4909


446-473: Ensure correct validation of relay difficulty.

The new validateRelayDifficulty function includes logic to handle relay hash and target hash validation. Verify the correctness of the logic and the error messages.

Verification successful

Ensure correct validation of relay difficulty.

The validateRelayDifficulty function correctly utilizes the protocol.GetRelayHashFromBytes and protocol.GetDifficultyFromHash functions. The logic and error handling in the function are consistent with the intended purpose of validating relay difficulty.

  • protocol.GetRelayHashFromBytes correctly converts a byte slice to a fixed-size array using a hasher.
  • protocol.GetDifficultyFromHash accurately calculates the difficulty by dividing a base difficulty hash by the given hash.

The validation logic and error messages in validateRelayDifficulty are appropriately implemented.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of the relay difficulty validation logic.

# Test: Search for the usage of `protocol.GetRelayHashFromBytes` and `protocol.GetDifficultyFromHash`. Expect: Correct usage in the validation logic.
rg --type go 'protocol.GetRelayHashFromBytes|protocol.GetDifficultyFromHash'

Length of output: 1310


Script:

#!/bin/bash
# Extract the implementation of `protocol.GetRelayHashFromBytes` and `protocol.GetDifficultyFromHash` to verify their correctness.

# Search for the implementation of `GetRelayHashFromBytes` function in the protocol package.
ast-grep --lang go --pattern 'func GetRelayHashFromBytes($_) $_' 

# Search for the implementation of `GetDifficultyFromHash` function in the protocol package.
ast-grep --lang go --pattern 'func GetDifficultyFromHash($_) $_' 

Length of output: 1350

api/poktroll/proof/params.pulsar.go (10)

189-191: Ensure correct handling of relay_difficulty_target_hash in Get method.

The updated Get method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.


Line range hint 476-508: Ensure correct handling of relay_difficulty_target_hash in unmarshal logic.

The updated unmarshal logic correctly handles relay_difficulty_target_hash. Verify that the logic is correctly used elsewhere in the codebase.


Line range hint 629-672: Ensure correct handling of relay_difficulty_target_hash in Params structure.

The updated Params structure correctly includes relay_difficulty_target_hash. Verify that the structure is correctly used elsewhere in the codebase.


165-166: Ensure correct handling of relay_difficulty_target_hash in Clear method.

The updated Clear method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.


254-255: Ensure correct handling of relay_difficulty_target_hash in Mutable method.

The updated Mutable method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.


21-31: Ensure correct field descriptors for Params.

The updated field descriptors for relay_difficulty_target_hash look correct. Verify that the descriptors are correctly used elsewhere in the codebase.

Verification successful

Let's review the context around the usage of fd_Params_relay_difficulty_target_hash to confirm its correctness. Specifically, we need to check the conditional statement to ensure it is used appropriately.


Field descriptor fd_Params_relay_difficulty_target_hash is correctly used.

The field descriptor fd_Params_relay_difficulty_target_hash is correctly defined, initialized, and used within the Range function of fastReflection_Params to handle the RelayDifficultyTargetHash field.

  • api/poktroll/proof/params.pulsar.go: Correctly defines and initializes fd_Params_relay_difficulty_target_hash.
  • api/poktroll/proof/params.pulsar.go: Correctly uses fd_Params_relay_difficulty_target_hash within the Range function.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correct usage of field descriptors for `Params` in the codebase.

# Test: Search for the usage of `fd_Params_relay_difficulty_target_hash`. Expect: Correct usage in the codebase.
rg --type go 'fd_Params_relay_difficulty_target_hash'

Length of output: 387


Script:

#!/bin/bash
# Description: Extract surrounding lines to understand the context of `fd_Params_relay_difficulty_target_hash` usage.

# Extracting lines around the usage of `fd_Params_relay_difficulty_target_hash` to understand the context.
rg --type go -A 5 -B 5 'fd_Params_relay_difficulty_target_hash'

Length of output: 2613


141-142: Ensure correct handling of relay_difficulty_target_hash in Has method.

The updated Has method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.

Verification successful

Verification successful for handling relay_difficulty_target_hash in Has method.

The Has method in api/poktroll/proof/params.pulsar.go correctly handles relay_difficulty_target_hash. No issues were found.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correct usage of the `Has` method in the codebase.

# Test: Search for the usage of the `Has` method. Expect: Correct usage in the codebase.
rg --type go 'Has'

Length of output: 121676


Script:

#!/bin/bash
# Description: Verify the correct usage of the `Has` method specifically in `api/poktroll/proof/params.pulsar.go`.

# Test: Search for the usage of the `Has` method in `api/poktroll/proof/params.pulsar.go`.
rg --type go 'Has' api/poktroll/proof/params.pulsar.go

Length of output: 1426


273-274: Ensure correct handling of relay_difficulty_target_hash in NewField method.

The updated NewField method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.

Verification successful

Ensure correct handling of relay_difficulty_target_hash in NewField method.

The updated NewField method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.


The NewField method correctly handles relay_difficulty_target_hash in api/poktroll/proof/params.pulsar.go.

  • The method implementation includes a switch case for poktroll.proof.Params.relay_difficulty_target_hash and returns protoreflect.ValueOfBytes(nil), which is consistent with the handling of other fields.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correct usage of the `NewField` method in the codebase.

# Test: Search for the usage of the `NewField` method. Expect: Correct usage in the codebase.
rg --type go 'NewField'

Length of output: 35240


Script:

#!/bin/bash
# Description: Verify the implementation of the `NewField` method in `api/poktroll/proof/params.pulsar.go`.

# Test: Extract the implementation of the `NewField` method in `api/poktroll/proof/params.pulsar.go`.
ast-grep --lang go --pattern $'func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
  $$$
}' api/poktroll/proof/params.pulsar.go

Length of output: 1690


Line range hint 351-424: Ensure correct handling of relay_difficulty_target_hash in ProtoMethods.

The updated ProtoMethods correctly handle relay_difficulty_target_hash. Verify that the methods are correctly used elsewhere in the codebase.

Verification successful

To verify the correct handling of relay_difficulty_target_hash in ProtoMethods, we need to inspect the implementation in api/poktroll/proof/params.pulsar.go and compare it with similar implementations in other files.


Handling of relay_difficulty_target_hash in ProtoMethods is correct and consistent.

The implementation in api/poktroll/proof/params.pulsar.go correctly calculates the size of the relay_difficulty_target_hash field and adds it to the total size, consistent with other ProtoMethods implementations.

  • api/poktroll/proof/params.pulsar.go: Correctly handles relay_difficulty_target_hash in ProtoMethods.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correct usage of `ProtoMethods` in the codebase.

# Test: Search for the usage of `ProtoMethods`. Expect: Correct usage in the codebase.
rg --type go 'ProtoMethods'

Length of output: 36531


Script:

#!/bin/bash
# Description: Verify the correct handling of `relay_difficulty_target_hash` in `ProtoMethods`.

# Search for the implementation of `ProtoMethods` in the specified file.
rg --type go 'ProtoMethods' -A 20 api/poktroll/proof/params.pulsar.go

# Search for the implementation of `ProtoMethods` in other relevant files for comparison.
rg --type go 'ProtoMethods' -A 20 api/poktroll/tokenomics/query.pulsar.go
rg --type go 'ProtoMethods' -A 20 api/poktroll/shared/params.pulsar.go

Length of output: 7595


102-104: Ensure correct handling of relay_difficulty_target_hash in Range method.

The updated Range method correctly handles relay_difficulty_target_hash. Verify that the method is correctly used elsewhere in the codebase.

x/proof/keeper/msg_server_submit_proof_test.go (5)

5-5: Note the addition of the encoding/hex import.

The encoding/hex package is used for encoding and decoding hexadecimal strings, indicating that such operations are now required in the tests.


48-52: Update to testProofParams initialization.

The MinRelayDifficultyBits has been replaced with RelayDifficultyTargetHash, shifting the focus from a bit-based difficulty representation to a hash-based one. This aligns with the new logic for relay difficulty.


569-573: Addition of lowTargetHash and highExpectedTargetDifficulty.

The lowTargetHash is decoded from a hexadecimal string, and highExpectedTargetDifficulty is computed using protocol.GetDifficultyFromHash. These variables are used to set and compute the relay difficulty target hash for the tests.


Line range hint 1028-1052:
Modification of test case to set RelayDifficultyTargetHash and validate relay difficulty.

The test case now sets the RelayDifficultyTargetHash to lowTargetHash and validates that the relay difficulty is greater than or equal to the target difficulty. This ensures that the new hash-based difficulty logic is correctly tested.


Line range hint 1409-1431:
Renaming and modification of getClosestRelayDifficultyBits to getClosestRelayDifficulty.

The function now returns an int64 instead of a uint64 and uses protocol.GetDifficultyFromHash to compute the difficulty from the relay hash. This aligns with the new hash-based difficulty logic.

Comments failed to post (5)
proto/poktroll/proof/params.proto

15-15: Reminder: Follow-up task for renaming the field.

The TODO comment indicates a follow-up task regarding the naming of the new field relay_difficulty_target_hash.

Do you want me to open a GitHub issue to track this task?

x/tokenomics/keeper/scale_difficulty_test.go

16-16: Reminder: Follow up on the TODO comment.

The TODO comment indicates a need to ensure that the ratio corresponds to the probability of a relay being accepted. This should be addressed or explained.

Do you want me to help address this TODO or open a GitHub issue to track this task?


86-100: Improve the test structure for better readability.

The test structure can be improved by separating the setup, execution, and verification phases more clearly.

for _, test := range tests {
	t.Run(test.desc, func(t *testing.T) {
		// Setup
		targetHashBz, targetErr := hex.DecodeString(test.targetHashHex)
		require.NoError(t, targetErr)

		expectedHashBz, expectedErr := hex.DecodeString(test.expectedHashHex)
		require.NoError(t, expectedErr)

		// Execution
		scaledDifficultyHash := scaleDifficultyTargetHash(targetHashBz, new(big.Float).SetFloat64(test.ratio))

		// Verification
		assert.Equal(t, len(scaledDifficultyHash), len(targetHashBz))
		require.Zero(t, bytes.Compare(expectedHashBz, scaledDifficultyHash),
			"expected difficulty hash %x, but got %x", expectedHashBz, scaledDifficultyHash)
	})
}
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

	for _, test := range tests {
		t.Run(test.desc, func(t *testing.T) {
			// Setup
			targetHashBz, targetErr := hex.DecodeString(test.targetHashHex)
			require.NoError(t, targetErr)

			expectedHashBz, expectedErr := hex.DecodeString(test.expectedHashHex)
			require.NoError(t, expectedErr)

			// Execution
			scaledDifficultyHash := scaleDifficultyTargetHash(targetHashBz, new(big.Float).SetFloat64(test.ratio))

			// Verification
			assert.Equal(t, len(scaledDifficultyHash), len(targetHashBz))
			require.Zero(t, bytes.Compare(expectedHashBz, scaledDifficultyHash),
				"expected difficulty hash %x, but got %x", expectedHashBz, scaledDifficultyHash)
		})
	}
x/proof/keeper/params_test.go

23-25: Update function name to reflect new parameter.

The function name TestParams_ValidateMinRelayDifficulty should be updated to reflect the new parameter relayDifficultyTargetHash.

- func TestParams_ValidateMinRelayDifficulty(t *testing.T) {
+ func TestParams_ValidateRelayDifficultyTargetHash(t *testing.T) {
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

- func TestParams_ValidateMinRelayDifficulty(t *testing.T) {
+ func TestParams_ValidateRelayDifficultyTargetHash(t *testing.T) {

28-30: Ensure comprehensive test coverage for invalid types.

The test case for the invalid type should cover more scenarios, such as other invalid types besides int64.

		{
			desc:                      "invalid type (int64)",
			relayDifficultyTargetHash: int64(-1),
			expectedErr:               prooftypes.ErrProofParamInvalid.Wrapf("invalid parameter type: int64"),
		},
		{
			desc:                      "invalid type (string)",
			relayDifficultyTargetHash: "invalid",
			expectedErr:               prooftypes.ErrProofParamInvalid.Wrapf("invalid parameter type: string"),
		},
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

			desc:                      "invalid type",
			relayDifficultyTargetHash: int64(-1),
			expectedErr:               prooftypes.ErrProofParamInvalid.Wrapf("invalid parameter type: int64"),
		},
		{
			desc:                      "invalid type (string)",
			relayDifficultyTargetHash: "invalid",
			expectedErr:               prooftypes.ErrProofParamInvalid.Wrapf("invalid parameter type: string"),

@Olshansk
Copy link
Member Author

@bryanchriswhite @red-0ne Just FYI. Going to merge this in so we can get #690 over the finish line.

@Olshansk Olshansk requested a review from red-0ne July 22, 2024 19:42
Copy link
Contributor

@red-0ne red-0ne left a comment

Choose a reason for hiding this comment

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

Great improvements,

Left some comments, some NITs but mostly questions.

pkg/crypto/protocol/difficulty.go Show resolved Hide resolved
pkg/crypto/protocol/hasher.go Show resolved Hide resolved
pkg/relayer/miner/miner.go Show resolved Hide resolved
@@ -12,6 +12,7 @@ message Params {
option (amino.name) = "poktroll/x/proof/Params";
option (gogoproto.equal) = true;

// TODO_FOLLOWUP(@olshansk, #690): Either delete this or change it to be named "minimum"
Copy link
Contributor

Choose a reason for hiding this comment

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

Could you explain why this can be deleted?

Copy link
Contributor

Choose a reason for hiding this comment

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

I see now. Could this be a map of serviceId to difficulty target hash (string->bytes)?

Copy link
Member Author

Choose a reason for hiding this comment

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

That's what the RelayMiningDifficulty on-chain type already is. See /Users/olshansky/workspace/pocket/poktroll3/x/tokenomics/keeper/update_relay_mining_difficulty.go.

type RelayMiningDifficulty struct {
	ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	BlockHeight int64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"`
	NumRelaysEma uint64 `protobuf:"varint,3,opt,name=num_relays_ema,json=numRelaysEma,proto3" json:"num_relays_ema,omitempty"`
	TargetHash []byte `protobuf:"bytes,4,opt,name=target_hash,json=targetHash,proto3" json:"target_hash,omitempty"`
}

The baseline is just fffff.

Having an on-chain parameter for just extra overhead and context.

testutil/network/network.go Outdated Show resolved Hide resolved
@@ -104,6 +104,7 @@ func (k Keeper) SettlePendingClaims(ctx sdk.Context) (
expiredResult.NumComputeUnits += numClaimComputeUnits
continue
}
// TODO_FOLLOWUP(@olshansk, #690): Document the potential changes needed here.
Copy link
Contributor

Choose a reason for hiding this comment

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

👀

Copy link
Member Author

Choose a reason for hiding this comment

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

x/tokenomics/module/abci.go Show resolved Hide resolved
@Olshansk Olshansk requested a review from red-0ne July 23, 2024 20:24
Copy link
Contributor

@red-0ne red-0ne left a comment

Choose a reason for hiding this comment

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

Let's merge it in! 🚀

@Olshansk Olshansk merged commit 99783a8 into refactor/difficulty/target-hash Jul 24, 2024
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
code health Cleans up some code miner Changes related to the Miner
Projects
Status: ✅ Done
Development

Successfully merging this pull request may close these issues.

3 participants