Skip to content

Commit f418234

Browse files
committed
Add basic OutputSweeper test in BP
.. we simply check that the `OutputSweeper` generates a spending tx and that the `TrackedSpendableOutput` is pruned once it reaches `ANTI_REORG_DELAY`.
1 parent 6c73829 commit f418234

File tree

1 file changed

+45
-4
lines changed
  • lightning-background-processor/src

1 file changed

+45
-4
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -918,14 +918,16 @@ impl Drop for BackgroundProcessor {
918918

919919
#[cfg(all(feature = "std", test))]
920920
mod tests {
921+
use bitcoin::ScriptBuf;
921922
use bitcoin::blockdata::constants::{genesis_block, ChainHash};
922923
use bitcoin::blockdata::locktime::absolute::LockTime;
923924
use bitcoin::blockdata::transaction::{Transaction, TxOut};
924925
use bitcoin::network::constants::Network;
925926
use bitcoin::secp256k1::{SecretKey, PublicKey, Secp256k1};
926-
use lightning::chain::{BestBlock, Confirm, chainmonitor};
927+
use lightning::chain::{BestBlock, Confirm, chainmonitor, Filter};
927928
use lightning::chain::channelmonitor::ANTI_REORG_DELAY;
928-
use lightning::sign::{InMemorySigner, KeysManager};
929+
use lightning::chain::chaininterface::{ConfirmationTarget, FeeEstimator};
930+
use lightning::sign::{InMemorySigner, KeysManager, SpendableOutputDescriptor};
929931
use lightning::chain::transaction::OutPoint;
930932
use lightning::events::{Event, PathFailure, MessageSendEventsProvider, MessageSendEvent};
931933
use lightning::{get_event_msg, get_event};
@@ -946,6 +948,7 @@ mod tests {
946948
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE, CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE, CHANNEL_MANAGER_PERSISTENCE_KEY,
947949
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_KEY,
948950
SCORER_PERSISTENCE_PRIMARY_NAMESPACE, SCORER_PERSISTENCE_SECONDARY_NAMESPACE, SCORER_PERSISTENCE_KEY};
951+
use lightning::util::sweep::OutputSweeper;
949952
use lightning_persister::fs_store::FilesystemStore;
950953
use std::collections::VecDeque;
951954
use std::{fs, env};
@@ -1007,6 +1010,7 @@ mod tests {
10071010
logger: Arc<test_utils::TestLogger>,
10081011
best_block: BestBlock,
10091012
scorer: Arc<LockingWrapper<TestScorer>>,
1013+
sweeper: Arc<OutputSweeper<Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<dyn Filter + Sync + Send>, Arc<FilesystemStore>, Arc<test_utils::TestLogger>>>,
10101014
}
10111015

10121016
impl Node {
@@ -1269,10 +1273,29 @@ mod tests {
12691273
let kv_store = Arc::new(FilesystemStore::new(format!("{}_persister_{}", &persist_dir, i).into()));
12701274
let now = Duration::from_secs(genesis_block.header.time as u64);
12711275
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
1276+
12721277
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), kv_store.clone()));
12731278
let best_block = BestBlock::from_network(network);
12741279
let params = ChainParameters { network, best_block };
12751280
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), router.clone(), logger.clone(), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), UserConfig::default(), params, genesis_block.header.time));
1281+
1282+
let spend_fee_estimator = Arc::clone(&fee_estimator);
1283+
let spend_keys_manager = Arc::clone(&keys_manager);
1284+
let spend_outputs_callback = move |output_descriptors: &[&SpendableOutputDescriptor]| {
1285+
let fee_rate = spend_fee_estimator
1286+
.get_est_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
1287+
spend_keys_manager.spend_spendable_outputs(
1288+
output_descriptors,
1289+
Vec::new(),
1290+
ScriptBuf::new(),
1291+
fee_rate,
1292+
None,
1293+
&Secp256k1::new(),
1294+
)
1295+
};
1296+
let sweeper = Arc::new(OutputSweeper::new(Arc::clone(&tx_broadcaster),
1297+
Arc::clone(&keys_manager), Arc::clone(&kv_store), best_block,
1298+
None::<Arc<dyn Filter + Sync + Send>>, Arc::clone(&logger), None, spend_outputs_callback));
12761299
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
12771300
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone(), logger.clone()));
12781301
let msg_handler = MessageHandler {
@@ -1281,7 +1304,7 @@ mod tests {
12811304
onion_message_handler: IgnoringMessageHandler{}, custom_message_handler: IgnoringMessageHandler{}
12821305
};
12831306
let peer_manager = Arc::new(PeerManager::new(msg_handler, 0, &seed, logger.clone(), keys_manager.clone()));
1284-
let node = Node { node: manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, kv_store, tx_broadcaster, network_graph, logger, best_block, scorer };
1307+
let node = Node { node: manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, kv_store, tx_broadcaster, network_graph, logger, best_block, scorer, sweeper };
12851308
nodes.push(node);
12861309
}
12871310

@@ -1350,15 +1373,18 @@ mod tests {
13501373
1 => {
13511374
node.node.transactions_confirmed(&header, &txdata, height);
13521375
node.chain_monitor.transactions_confirmed(&header, &txdata, height);
1376+
node.sweeper.transactions_confirmed(&header, &txdata, height);
13531377
},
13541378
x if x == depth => {
13551379
node.node.best_block_updated(&header, height);
13561380
node.chain_monitor.best_block_updated(&header, height);
1381+
node.sweeper.best_block_updated(&header, height);
13571382
},
13581383
_ => {},
13591384
}
13601385
}
13611386
}
1387+
13621388
fn confirm_transaction(node: &mut Node, tx: &Transaction) {
13631389
confirm_transaction_depth(node, tx, ANTI_REORG_DELAY);
13641390
}
@@ -1590,6 +1616,9 @@ mod tests {
15901616
let _as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
15911617
nodes[1].node.handle_channel_ready(&nodes[0].node.get_our_node_id(), &as_funding);
15921618
let _bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
1619+
let broadcast_funding = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
1620+
assert_eq!(broadcast_funding.txid(), funding_tx.txid());
1621+
assert!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().is_empty());
15931622

15941623
if !std::thread::panicking() {
15951624
bg_processor.stop().unwrap();
@@ -1615,10 +1644,22 @@ mod tests {
16151644
.recv_timeout(Duration::from_secs(EVENT_DEADLINE))
16161645
.expect("Events not handled within deadline");
16171646
match event {
1618-
Event::SpendableOutputs { .. } => {},
1647+
Event::SpendableOutputs { outputs, channel_id } => {
1648+
nodes[0].sweeper.track_spendable_outputs(outputs, channel_id, false);
1649+
},
16191650
_ => panic!("Unexpected event: {:?}", event),
16201651
}
16211652

1653+
assert_eq!(nodes[0].sweeper.tracked_spendable_outputs().len(), 1);
1654+
let tracked_output = nodes[0].sweeper.tracked_spendable_outputs().first().unwrap().clone();
1655+
let sweep_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
1656+
assert_eq!(sweep_tx.txid(), tracked_output.latest_spending_tx.as_ref().unwrap().txid());
1657+
1658+
confirm_transaction_depth(&mut nodes[0], &sweep_tx, 5);
1659+
assert_eq!(nodes[0].sweeper.tracked_spendable_outputs().len(), 1);
1660+
confirm_transaction_depth(&mut nodes[0], &sweep_tx, ANTI_REORG_DELAY);
1661+
assert_eq!(nodes[0].sweeper.tracked_spendable_outputs().len(), 0);
1662+
16221663
if !std::thread::panicking() {
16231664
bg_processor.stop().unwrap();
16241665
}

0 commit comments

Comments
 (0)