Skip to content

fuzz: add chanmon holder signer fuzz ops#4660

Open
joostjager wants to merge 1 commit into
lightningdevkit:mainfrom
joostjager:fuzz-chanmon-holder-signer-ops
Open

fuzz: add chanmon holder signer fuzz ops#4660
joostjager wants to merge 1 commit into
lightningdevkit:mainfrom
joostjager:fuzz-chanmon-holder-signer-ops

Conversation

@joostjager
Copy link
Copy Markdown
Contributor

Allow chanmon consistency inputs to block and later unblock holder-side signing operations. This lets focused force-close fuzzing reuse the signer-op machinery without carrying the larger mining and settlement model.

I split this out ahead of the broader force-close fuzzing work so we can review the signer-op modeling independently. The main question is whether these holder-side unblock actions are worth spending dedicated chanmon consistency opcodes on, or whether we should keep the opcode surface smaller and rely on final cleanup to re-enable them.

@ldk-reviews-bot
Copy link
Copy Markdown

ldk-reviews-bot commented Jun 4, 2026

👋 Thanks for assigning @TheBlueMatt as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@joostjager joostjager force-pushed the fuzz-chanmon-holder-signer-ops branch from 994d779 to ba0e4c5 Compare June 4, 2026 11:58
@joostjager joostjager marked this pull request as ready for review June 4, 2026 14:44
@joostjager joostjager self-assigned this Jun 4, 2026
@ldk-claude-review-bot
Copy link
Copy Markdown
Collaborator

ldk-claude-review-bot commented Jun 4, 2026

Good - the fuzzer uses _test_utils, so the is_signer_available checks are active.

I've now thoroughly reviewed the entire diff. The changes are correct:

  1. SUPPORTED_SIGNER_OPS expansion: Array correctly updated from 4 to 6 with consistent size annotation.
  2. enable_holder_signer_ops(): Correctly only calls monitor.signer_unblocked() (not node.signer_unblocked()) since SignHolderCommitment and SignHolderHtlcTransaction are exclusively used in chain monitor / on-chain claim paths.
  3. settle_all(): Correctly adds monitor.signer_unblocked() alongside existing signer_unblocked() to ensure both live-channel and on-chain claim retries happen during finalization.
  4. New opcodes 0xd3-0xd5: Follow the established pattern for per-node signer op toggling.
  5. Disable/enable lifecycle: disable_supported_ops_for_all_signers iterates the same SUPPORTED_SIGNER_OPS array, so all 6 ops are consistently disabled and can be individually re-enabled.

No issues found.

Copy link
Copy Markdown
Contributor

@valentinewallace valentinewallace left a comment

Choose a reason for hiding this comment

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

Are there any heuristics on when to save vs spend fuzz opcodes? I'm not sure how to make that call, probably @TheBlueMatt should take a look. We can always update post-merge though, I suppose.

Comment thread fuzz/src/chanmon_consistency.rs Outdated
Comment on lines +3406 to +3407
// Keep holder signer unblocks adjacent to the existing signer op
// bytes. The helper re-enables both holder-side operations for
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Adjacent" makes me think these bytes should be 0xd3..d5, so I find that a bit confusing.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hm yes they were adjacent in an earlier version of this. Moved.

Comment thread fuzz/src/chanmon_consistency.rs Outdated
self.node.timer_tick_occurred();
}

// Re-enables holder-side signer operations and asks the chain monitor to
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think the commit message could be improved. It references a larger refactor, which I'm not sure is helpful as someone without much context, and I don't think it explains the "why" of the diff as it is stand-alone.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Also a left-over from cherry-picking these changes, fixed.

Comment thread fuzz/src/chanmon_consistency.rs Outdated
// bytes. The helper re-enables both holder-side operations for
// every signer owned by the selected node, matching the existing
// key-manager-wide blocking model.
0xe4 => harness.nodes[0].enable_holder_signer_ops(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Other bytes of this fuzzer seem much more granular and enable/unblock on a per-op and per-channel basis. Maybe we could document why we're taking a more sweeping approach here? Also "the existing key-manager-wide blocking model" -- what does that mean?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It's to save fuzz opcode byte space. Also not sure which trade-off is right here.

"the existing key-manager-wide blocking model" refers to signing being disabled for all channels at once, and enabling mirroring that. Improved comment.

@ldk-reviews-bot
Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

Allow chanmon consistency fuzz inputs to block holder-side signer
operations and later retry monitor-driven claim signing. This gives
force-close sequences a way to cover local on-chain claim
construction while reusing the harness' existing signer-op blocking
machinery.
@joostjager joostjager force-pushed the fuzz-chanmon-holder-signer-ops branch from ba0e4c5 to 633aff4 Compare June 8, 2026 07:36
@joostjager joostjager requested a review from TheBlueMatt June 8, 2026 07:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

4 participants