Skip to content

Commit dc0340e

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 43a0c6c commit dc0340e

File tree

1 file changed

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

1 file changed

+45
-5
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -918,17 +918,18 @@ 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};
931-
use lightning::{get_event_msg, get_event};
932933
use lightning::ln::PaymentHash;
933934
use lightning::ln::channelmanager;
934935
use lightning::ln::channelmanager::{BREAKDOWN_TIMEOUT, ChainParameters, MIN_CLTV_EXPIRY_DELTA, PaymentId};
@@ -946,6 +947,7 @@ mod tests {
946947
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE, CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE, CHANNEL_MANAGER_PERSISTENCE_KEY,
947948
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_KEY,
948949
SCORER_PERSISTENCE_PRIMARY_NAMESPACE, SCORER_PERSISTENCE_SECONDARY_NAMESPACE, SCORER_PERSISTENCE_KEY};
950+
use lightning::util::sweep::OutputSweeper;
949951
use lightning_persister::fs_store::FilesystemStore;
950952
use std::collections::VecDeque;
951953
use std::{fs, env};
@@ -1007,6 +1009,7 @@ mod tests {
10071009
logger: Arc<test_utils::TestLogger>,
10081010
best_block: BestBlock,
10091011
scorer: Arc<LockingWrapper<TestScorer>>,
1012+
sweeper: Arc<OutputSweeper<Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<dyn Filter>, Arc<FilesystemStore>, Arc<test_utils::TestLogger>>>,
10101013
}
10111014

10121015
impl Node {
@@ -1269,10 +1272,29 @@ mod tests {
12691272
let kv_store = Arc::new(FilesystemStore::new(format!("{}_persister_{}", &persist_dir, i).into()));
12701273
let now = Duration::from_secs(genesis_block.header.time as u64);
12711274
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
1275+
12721276
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), kv_store.clone()));
12731277
let best_block = BestBlock::from_network(network);
12741278
let params = ChainParameters { network, best_block };
12751279
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));
1280+
1281+
let spend_fee_estimator = Arc::clone(&fee_estimator);
1282+
let spend_keys_manager = Arc::clone(&keys_manager);
1283+
let spend_outputs_callback = move |output_descriptors: &[&SpendableOutputDescriptor]| {
1284+
let fee_rate = spend_fee_estimator
1285+
.get_est_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
1286+
spend_keys_manager.spend_spendable_outputs(
1287+
output_descriptors,
1288+
Vec::new(),
1289+
ScriptBuf::new(),
1290+
fee_rate,
1291+
None,
1292+
&Secp256k1::new(),
1293+
)
1294+
};
1295+
let sweeper = Arc::new(OutputSweeper::new(Arc::clone(&tx_broadcaster),
1296+
Arc::clone(&keys_manager), Arc::clone(&kv_store), best_block,
1297+
None::<Arc<dyn Filter>>, Arc::clone(&logger), None, spend_outputs_callback));
12761298
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
12771299
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone(), logger.clone()));
12781300
let msg_handler = MessageHandler {
@@ -1281,7 +1303,7 @@ mod tests {
12811303
onion_message_handler: IgnoringMessageHandler{}, custom_message_handler: IgnoringMessageHandler{}
12821304
};
12831305
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 };
1306+
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 };
12851307
nodes.push(node);
12861308
}
12871309

@@ -1350,15 +1372,18 @@ mod tests {
13501372
1 => {
13511373
node.node.transactions_confirmed(&header, &txdata, height);
13521374
node.chain_monitor.transactions_confirmed(&header, &txdata, height);
1375+
node.sweeper.transactions_confirmed(&header, &txdata, height);
13531376
},
13541377
x if x == depth => {
13551378
node.node.best_block_updated(&header, height);
13561379
node.chain_monitor.best_block_updated(&header, height);
1380+
node.sweeper.best_block_updated(&header, height);
13571381
},
13581382
_ => {},
13591383
}
13601384
}
13611385
}
1386+
13621387
fn confirm_transaction(node: &mut Node, tx: &Transaction) {
13631388
confirm_transaction_depth(node, tx, ANTI_REORG_DELAY);
13641389
}
@@ -1590,6 +1615,9 @@ mod tests {
15901615
let _as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
15911616
nodes[1].node.handle_channel_ready(&nodes[0].node.get_our_node_id(), &as_funding);
15921617
let _bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
1618+
let broadcast_funding = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
1619+
assert_eq!(broadcast_funding.txid(), funding_tx.txid());
1620+
assert!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().is_empty());
15931621

15941622
if !std::thread::panicking() {
15951623
bg_processor.stop().unwrap();
@@ -1615,10 +1643,22 @@ mod tests {
16151643
.recv_timeout(Duration::from_secs(EVENT_DEADLINE))
16161644
.expect("Events not handled within deadline");
16171645
match event {
1618-
Event::SpendableOutputs { .. } => {},
1646+
Event::SpendableOutputs { outputs, channel_id } => {
1647+
nodes[0].sweeper.track_spendable_outputs(outputs, channel_id, false);
1648+
},
16191649
_ => panic!("Unexpected event: {:?}", event),
16201650
}
16211651

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

0 commit comments

Comments
 (0)