Re-enable signer op for one channel at a time in chanmon_consistency
What changed, and why it matters
This change only modifies an internal fuzz-testing harness. It splits a test control so that a simulated signer can be re-enabled for one channel at a time instead of all channels at once, purely to improve fuzzing coverage. There is no change to production code, no user-facing behavior, and no security fix.
No action needed; this is a test-harness-only change. Reviewers can verify that the new filter tuples match the intended channel IDs and peer node IDs.
Security signals we found
No strong security signals were identified.
Evidence from the diff
In fuzz/src/chanmon_consistency.rs, the fuzzer input opcodes 0xc4-0xcb are expanded to 0xc4-0xce. For node B, which has two channels (chan_a_id with node A and chan_b_id with node C), the signer-unblocking calls now pass an explicit (peer_node_id, channel_id) filter rather than None. This lets the fuzzer place each channel’s signer operations in different states, increasing state-space coverage. Node A and node C still use None because they each have only one channel. The production signer logic is untouched.
Changed components
fuzz/src/chanmon_consistency.rsInspect captured patch +27 / −9
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index 2200689..53591ad 100644
--- a/fuzz/src/chanmon_consistency.rs
+++ b/fuzz/src/chanmon_consistency.rs
@@ -2496,33 +2496,51 @@ pub fn do_test<Out: Output + MaybeSend + MaybeSync>(
},
0xc4 => {
keys_manager_b.enable_op_for_all_signers(SignerOp::SignCounterpartyCommitment);
- nodes[1].signer_unblocked(None);
+ let filter = Some((nodes[0].get_our_node_id(), chan_a_id));
+ nodes[1].signer_unblocked(filter);
},
0xc5 => {
+ keys_manager_b.enable_op_for_all_signers(SignerOp::SignCounterpartyCommitment);
+ let filter = Some((nodes[2].get_our_node_id(), chan_b_id));
+ nodes[1].signer_unblocked(filter);
+ },
+ 0xc6 => {
keys_manager_c.enable_op_for_all_signers(SignerOp::SignCounterpartyCommitment);
nodes[2].signer_unblocked(None);
},
- 0xc6 => {
+ 0xc7 => {
keys_manager_a.enable_op_for_all_signers(SignerOp::GetPerCommitmentPoint);
nodes[0].signer_unblocked(None);
},
- 0xc7 => {
+ 0xc8 => {
keys_manager_b.enable_op_for_all_signers(SignerOp::GetPerCommitmentPoint);
- nodes[1].signer_unblocked(None);
+ let filter = Some((nodes[0].get_our_node_id(), chan_a_id));
+ nodes[1].signer_unblocked(filter);
},
- 0xc8 => {
+ 0xc9 => {
+ keys_manager_b.enable_op_for_all_signers(SignerOp::GetPerCommitmentPoint);
+ let filter = Some((nodes[2].get_our_node_id(), chan_b_id));
+ nodes[1].signer_unblocked(filter);
+ },
+ 0xca => {
keys_manager_c.enable_op_for_all_signers(SignerOp::GetPerCommitmentPoint);
nodes[2].signer_unblocked(None);
},
- 0xc9 => {
+ 0xcb => {
keys_manager_a.enable_op_for_all_signers(SignerOp::ReleaseCommitmentSecret);
nodes[0].signer_unblocked(None);
},
- 0xca => {
+ 0xcc => {
keys_manager_b.enable_op_for_all_signers(SignerOp::ReleaseCommitmentSecret);
- nodes[1].signer_unblocked(None);
+ let filter = Some((nodes[0].get_our_node_id(), chan_a_id));
+ nodes[1].signer_unblocked(filter);
},
- 0xcb => {
+ 0xcd => {
+ keys_manager_b.enable_op_for_all_signers(SignerOp::ReleaseCommitmentSecret);
+ let filter = Some((nodes[2].get_our_node_id(), chan_b_id));
+ nodes[1].signer_unblocked(filter);
+ },
+ 0xce => {
keys_manager_c.enable_op_for_all_signers(SignerOp::ReleaseCommitmentSecret);
nodes[2].signer_unblocked(None);
},
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.