Skip to content

Commit 7091cbc

Browse files
committed
[fuzz] Use batch funding in full_stack_target
To potentially get more test coverage
1 parent a6670e8 commit 7091cbc

File tree

1 file changed

+34
-21
lines changed

1 file changed

+34
-21
lines changed

fuzz/src/full_stack.rs

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -634,33 +634,46 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
634634
}
635635
},
636636
10 => {
637-
'outer_loop: for funding_generation in pending_funding_generation.drain(..) {
638-
let mut tx = Transaction { version: 0, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
639-
value: funding_generation.2, script_pubkey: funding_generation.3,
640-
}] };
641-
let funding_output = 'search_loop: loop {
642-
let funding_txid = tx.txid();
643-
if let None = loss_detector.txids_confirmed.get(&funding_txid) {
644-
let outpoint = OutPoint { txid: funding_txid, index: 0 };
645-
for chan in channelmanager.list_channels() {
646-
if chan.funding_txo == Some(outpoint) {
647-
tx.version += 1;
648-
continue 'search_loop;
649-
}
637+
let mut tx = Transaction { version: 0, lock_time: LockTime::ZERO, input: Vec::new(), output: Vec::new() };
638+
let mut channels = Vec::new();
639+
for funding_generation in pending_funding_generation.drain(..) {
640+
let txout = TxOut {
641+
value: funding_generation.2, script_pubkey: funding_generation.3,
642+
};
643+
if !tx.output.contains(&txout) {
644+
tx.output.push(txout);
645+
channels.push((funding_generation.0, funding_generation.1));
646+
}
647+
}
648+
'search_loop: loop {
649+
if tx.version > 0xff {
650+
break;
651+
}
652+
let funding_txid = tx.txid();
653+
if loss_detector.txids_confirmed.get(&funding_txid).is_none() {
654+
let outpoint = OutPoint { txid: funding_txid, index: 0 };
655+
for chan in channelmanager.list_channels() {
656+
if chan.channel_id == outpoint.to_channel_id() {
657+
tx.version += 1;
658+
continue 'search_loop;
650659
}
651-
break outpoint;
652-
}
653-
tx.version += 1;
654-
if tx.version > 0xff {
655-
continue 'outer_loop;
656660
}
657-
};
658-
if let Err(e) = channelmanager.funding_transaction_generated(&funding_generation.0, &funding_generation.1, tx.clone()) {
661+
break;
662+
}
663+
tx.version += 1;
664+
}
665+
if tx.version <= 0xff && !channels.is_empty() {
666+
let chans = channels.iter().map(|(a, b)| (a, b)).collect::<Vec<_>>();
667+
if let Err(e) = channelmanager.batch_funding_transaction_generated(&chans, tx.clone()) {
659668
// It's possible the channel has been closed in the mean time, but any other
660669
// failure may be a bug.
661670
if let APIError::ChannelUnavailable { .. } = e { } else { panic!(); }
662671
}
663-
pending_funding_signatures.insert(funding_output, tx);
672+
let funding_txid = tx.txid();
673+
for idx in 0..tx.output.len() {
674+
let outpoint = OutPoint { txid: funding_txid, index: idx as u16 };
675+
pending_funding_signatures.insert(outpoint, tx.clone());
676+
}
664677
}
665678
},
666679
11 => {

0 commit comments

Comments
 (0)