Skip to content

Commit aaadeec

Browse files
committed
wip fuzz coverage
1 parent b1a27f2 commit aaadeec

File tree

2 files changed

+75
-28
lines changed

2 files changed

+75
-28
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 75 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,15 @@ impl chain::Watch<TestChannelSigner> for TestChainMonitor {
168168
}
169169
}
170170

171+
struct SignerState {
172+
enforcement: Arc<Mutex<EnforcementState>>,
173+
unavailable: Arc<Mutex<u32>>,
174+
}
175+
171176
struct KeyProvider {
172177
node_secret: SecretKey,
173178
rand_bytes_id: atomic::AtomicU32,
174-
enforcement_states: Mutex<HashMap<[u8;32], Arc<Mutex<EnforcementState>>>>,
179+
enforcement_states: Mutex<HashMap<[u8;32], SignerState>>,
175180
}
176181

177182
impl EntropySource for KeyProvider {
@@ -253,22 +258,19 @@ impl SignerProvider for KeyProvider {
253258
channel_keys_id,
254259
channel_keys_id,
255260
);
256-
let revoked_commitment = self.make_enforcement_state_cell(keys.commitment_seed);
257-
TestChannelSigner::new_with_revoked(keys, revoked_commitment, false)
261+
let mut revoked_commitments = self.enforcement_states.lock().unwrap();
262+
let new_state = revoked_commitments.entry(keys.commitment_seed)
263+
.or_insert(SignerState {
264+
enforcement: Arc::new(Mutex::new(EnforcementState::new())),
265+
unavailable: Arc::new(Mutex::new(0)),
266+
});
267+
let mut ret = TestChannelSigner::new_with_revoked(keys, Arc::clone(&new_state.enforcement), false);
268+
ret.unavailable = Arc::clone(&new_state.unavailable);
269+
ret
258270
}
259271

260-
fn read_chan_signer(&self, buffer: &[u8]) -> Result<Self::Signer, DecodeError> {
261-
let mut reader = std::io::Cursor::new(buffer);
262-
263-
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self)?;
264-
let state = self.make_enforcement_state_cell(inner.commitment_seed);
265-
266-
Ok(TestChannelSigner {
267-
inner,
268-
state,
269-
disable_revocation_policy_check: false,
270-
unavailable: Arc::new(Mutex::new(0)),
271-
})
272+
fn read_chan_signer(&self, _buffer: &[u8]) -> Result<Self::Signer, DecodeError> {
273+
unreachable!();
272274
}
273275

274276
fn get_destination_script(&self) -> Result<Script, ()> {
@@ -286,17 +288,6 @@ impl SignerProvider for KeyProvider {
286288
}
287289
}
288290

289-
impl KeyProvider {
290-
fn make_enforcement_state_cell(&self, commitment_seed: [u8; 32]) -> Arc<Mutex<EnforcementState>> {
291-
let mut revoked_commitments = self.enforcement_states.lock().unwrap();
292-
if !revoked_commitments.contains_key(&commitment_seed) {
293-
revoked_commitments.insert(commitment_seed, Arc::new(Mutex::new(EnforcementState::new())));
294-
}
295-
let cell = revoked_commitments.get(&commitment_seed).unwrap();
296-
Arc::clone(cell)
297-
}
298-
}
299-
300291
#[inline]
301292
fn check_api_err(api_err: APIError, sendable_bounds_violated: bool) {
302293
match api_err {
@@ -1259,6 +1250,51 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
12591250
},
12601251
0x89 => { fee_est_c.ret_val.store(253, atomic::Ordering::Release); nodes[2].maybe_update_chan_fees(); },
12611252

1253+
0xa0 => {
1254+
let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1255+
assert_eq!(signer_states.len(), 1);
1256+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = u32::max_value();
1257+
}
1258+
0xa1 => {
1259+
let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1260+
assert_eq!(signer_states.len(), 1);
1261+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = 0;
1262+
nodes[0].signer_unblocked(None);
1263+
}
1264+
/*0xa2 => {
1265+
let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1266+
assert_eq!(signer_states.len(), 1);
1267+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = true;
1268+
}
1269+
0xa3 => {
1270+
let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1271+
assert_eq!(signer_states.len(), 1);
1272+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = false;
1273+
nodes[0].signer_unblocked(None);
1274+
}
1275+
0xa4 => {
1276+
let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1277+
assert_eq!(signer_states.len(), 1);
1278+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = true;
1279+
}
1280+
0xa5 => {
1281+
let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1282+
assert_eq!(signer_states.len(), 1);
1283+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = false;
1284+
nodes[0].signer_unblocked(None);
1285+
}*/
1286+
0xa6 => {
1287+
let signer_states = keys_manager_c.enforcement_states.lock().unwrap();
1288+
assert_eq!(signer_states.len(), 1);
1289+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = u32::max_value();
1290+
}
1291+
0xa7 => {
1292+
let signer_states = keys_manager_c.enforcement_states.lock().unwrap();
1293+
assert_eq!(signer_states.len(), 1);
1294+
*signer_states.values().next().unwrap().unavailable.lock().unwrap() = 0;
1295+
nodes[2].signer_unblocked(None);
1296+
}
1297+
12621298
0xff => {
12631299
// Test that no channel is in a stuck state where neither party can send funds even
12641300
// after we resolve all pending events.
@@ -1268,6 +1304,19 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
12681304
*monitor_b.persister.update_ret.lock().unwrap() = ChannelMonitorUpdateStatus::Completed;
12691305
*monitor_c.persister.update_ret.lock().unwrap() = ChannelMonitorUpdateStatus::Completed;
12701306

1307+
for signer_state in keys_manager_a.enforcement_states.lock().unwrap().values() {
1308+
*signer_state.unavailable.lock().unwrap() = 0;
1309+
}
1310+
for signer_state in keys_manager_b.enforcement_states.lock().unwrap().values() {
1311+
*signer_state.unavailable.lock().unwrap() = 0;
1312+
}
1313+
for signer_state in keys_manager_c.enforcement_states.lock().unwrap().values() {
1314+
*signer_state.unavailable.lock().unwrap() = 0;
1315+
}
1316+
nodes[0].signer_unblocked(None);
1317+
nodes[1].signer_unblocked(None);
1318+
nodes[2].signer_unblocked(None);
1319+
12711320
if let Some((id, _)) = monitor_a.latest_monitors.lock().unwrap().get(&chan_1_funding) {
12721321
monitor_a.chain_monitor.force_channel_monitor_updated(chan_1_funding, *id);
12731322
nodes[0].process_monitor_events();

lightning/src/ln/channelmanager.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7278,8 +7278,6 @@ where
72787278
/// attempted in every channel, or in the specifically provided channel.
72797279
///
72807280
/// [`ChannelSigner`]: crate::sign::ChannelSigner
7281-
#[cfg(test)] // This is only implemented for one signer method, and should be private until we
7282-
// actually finish implementing it fully.
72837281
pub fn signer_unblocked(&self, channel_opt: Option<(PublicKey, ChannelId)>) {
72847282
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
72857283

0 commit comments

Comments
 (0)