Skip to content

Commit 8a7f214

Browse files
author
Antoine Riard
committed
Integrate UtxoPool
This commit integrates UtxoPool in the test framework and codebase.
1 parent d9e6971 commit 8a7f214

File tree

6 files changed

+106
-39
lines changed

6 files changed

+106
-39
lines changed

lightning-net-tokio/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
//! type FeeEstimator = dyn lightning::chain::chaininterface::FeeEstimator;
3636
//! type Logger = dyn lightning::util::logger::Logger;
3737
//! type ChainWatchInterface = dyn lightning::chain::chaininterface::ChainWatchInterface;
38-
//! type ChannelMonitor = lightning::ln::channelmonitor::SimpleManyChannelMonitor<lightning::chain::transaction::OutPoint, lightning::chain::keysinterface::InMemoryChannelKeys, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>, Arc<ChainWatchInterface>>;
38+
//! type UtxoPool = dyn lightning::chain::utxointerface::UtxoPool;
39+
//! type ChannelMonitor = lightning::ln::channelmonitor::SimpleManyChannelMonitor<lightning::chain::transaction::OutPoint, lightning::chain::keysinterface::InMemoryChannelKeys, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>, Arc<ChainWatchInterface>, Arc<UtxoPool>>;
3940
//! type ChannelManager = lightning::ln::channelmanager::SimpleArcChannelManager<ChannelMonitor, TxBroadcaster, FeeEstimator, Logger>;
4041
//! type PeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChannelMonitor, TxBroadcaster, FeeEstimator, ChainWatchInterface, Logger>;
4142
//!

lightning/src/ln/channelmonitor.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use ln::onchain_utils::{InputDescriptors, PackageTemplate, OnchainRequest, BumpS
4343
use chain::chaininterface::{ChainListener, ChainWatchInterface, BroadcasterInterface, FeeEstimator};
4444
use chain::transaction::OutPoint;
4545
use chain::keysinterface::{SpendableOutputDescriptor, ChannelKeys};
46+
use chain::utxointerface::UtxoPool;
4647
use util::logger::Logger;
4748
use util::ser::{Readable, MaybeReadable, Writer, Writeable, U48};
4849
use util::{byte_utils, events};
@@ -188,35 +189,37 @@ impl_writeable!(HTLCUpdate, 0, { payment_hash, payment_preimage, source });
188189
///
189190
/// If you're using this for local monitoring of your own channels, you probably want to use
190191
/// `OutPoint` as the key, which will give you a ManyChannelMonitor implementation.
191-
///
192192
/// (C-not exported) due to an unconstrained generic in `Key`
193-
pub struct SimpleManyChannelMonitor<Key, ChanSigner: ChannelKeys, T: Deref, F: Deref, L: Deref, C: Deref>
193+
pub struct SimpleManyChannelMonitor<Key, ChanSigner: ChannelKeys, T: Deref, F: Deref, L: Deref, C: Deref, U: Deref>
194194
where T::Target: BroadcasterInterface,
195195
F::Target: FeeEstimator,
196196
L::Target: Logger,
197197
C::Target: ChainWatchInterface,
198+
U::Target: UtxoPool,
198199
{
199200
/// The monitors
200201
pub monitors: Mutex<HashMap<Key, ChannelMonitor<ChanSigner>>>,
201202
chain_monitor: C,
202203
broadcaster: T,
203204
logger: L,
204-
fee_estimator: F
205+
fee_estimator: F,
206+
utxo_pool: U,
205207
}
206208

207-
impl<Key : Send + cmp::Eq + hash::Hash, ChanSigner: ChannelKeys, T: Deref + Sync + Send, F: Deref + Sync + Send, L: Deref + Sync + Send, C: Deref + Sync + Send>
208-
ChainListener for SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C>
209+
impl<Key : Send + cmp::Eq + hash::Hash, ChanSigner: ChannelKeys, T: Deref + Sync + Send, F: Deref + Sync + Send, L: Deref + Sync + Send, C: Deref + Sync + Send, U: Deref + Sync + Send>
210+
ChainListener for SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C, U>
209211
where T::Target: BroadcasterInterface,
210212
F::Target: FeeEstimator,
211213
L::Target: Logger,
212214
C::Target: ChainWatchInterface,
215+
U::Target: UtxoPool
213216
{
214217
fn block_connected(&self, header: &BlockHeader, height: u32, txn_matched: &[&Transaction], _indexes_of_txn_matched: &[usize]) {
215218
let block_hash = header.block_hash();
216219
{
217220
let mut monitors = self.monitors.lock().unwrap();
218221
for monitor in monitors.values_mut() {
219-
let txn_outputs = monitor.block_connected(txn_matched, height, &block_hash, &*self.broadcaster, &*self.fee_estimator, &*self.logger);
222+
let txn_outputs = monitor.block_connected(txn_matched, height, &block_hash, &*self.broadcaster, &*self.fee_estimator, &*self.logger, &*self.utxo_pool);
220223

221224
for (ref txid, ref outputs) in txn_outputs {
222225
for (idx, output) in outputs.iter().enumerate() {
@@ -231,26 +234,28 @@ impl<Key : Send + cmp::Eq + hash::Hash, ChanSigner: ChannelKeys, T: Deref + Sync
231234
let block_hash = header.block_hash();
232235
let mut monitors = self.monitors.lock().unwrap();
233236
for monitor in monitors.values_mut() {
234-
monitor.block_disconnected(disconnected_height, &block_hash, &*self.broadcaster, &*self.fee_estimator, &*self.logger);
237+
monitor.block_disconnected(disconnected_height, &block_hash, &*self.broadcaster, &*self.fee_estimator, &*self.logger, &*self.utxo_pool);
235238
}
236239
}
237240
}
238241

239-
impl<Key : Send + cmp::Eq + hash::Hash + 'static, ChanSigner: ChannelKeys, T: Deref, F: Deref, L: Deref, C: Deref> SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C>
242+
impl<Key : Send + cmp::Eq + hash::Hash + 'static, ChanSigner: ChannelKeys, T: Deref, F: Deref, L: Deref, C: Deref, U: Deref> SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C, U>
240243
where T::Target: BroadcasterInterface,
241244
F::Target: FeeEstimator,
242245
L::Target: Logger,
243246
C::Target: ChainWatchInterface,
247+
U::Target: UtxoPool
244248
{
245249
/// Creates a new object which can be used to monitor several channels given the chain
246250
/// interface with which to register to receive notifications.
247-
pub fn new(chain_monitor: C, broadcaster: T, logger: L, feeest: F) -> SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C> {
251+
pub fn new(chain_monitor: C, broadcaster: T, logger: L, feeest: F, utxo_pool: U) -> SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C, U> {
248252
let res = SimpleManyChannelMonitor {
249253
monitors: Mutex::new(HashMap::new()),
250254
chain_monitor,
251255
broadcaster,
252256
logger,
253257
fee_estimator: feeest,
258+
utxo_pool,
254259
};
255260

256261
res
@@ -291,11 +296,12 @@ impl<Key : Send + cmp::Eq + hash::Hash + 'static, ChanSigner: ChannelKeys, T: De
291296
}
292297
}
293298

294-
impl<ChanSigner: ChannelKeys, T: Deref + Sync + Send, F: Deref + Sync + Send, L: Deref + Sync + Send, C: Deref + Sync + Send> ManyChannelMonitor for SimpleManyChannelMonitor<OutPoint, ChanSigner, T, F, L, C>
299+
impl<ChanSigner: ChannelKeys, T: Deref + Sync + Send, F: Deref + Sync + Send, L: Deref + Sync + Send, C: Deref + Sync + Send, U: Deref + Sync + Send> ManyChannelMonitor for SimpleManyChannelMonitor<OutPoint, ChanSigner, T, F, L, C, U>
295300
where T::Target: BroadcasterInterface,
296301
F::Target: FeeEstimator,
297302
L::Target: Logger,
298303
C::Target: ChainWatchInterface,
304+
U::Target: UtxoPool
299305
{
300306
type Keys = ChanSigner;
301307

@@ -322,11 +328,12 @@ impl<ChanSigner: ChannelKeys, T: Deref + Sync + Send, F: Deref + Sync + Send, L:
322328
}
323329
}
324330

325-
impl<Key : Send + cmp::Eq + hash::Hash, ChanSigner: ChannelKeys, T: Deref, F: Deref, L: Deref, C: Deref> events::EventsProvider for SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C>
331+
impl<Key : Send + cmp::Eq + hash::Hash, ChanSigner: ChannelKeys, T: Deref, F: Deref, L: Deref, C: Deref, U: Deref> events::EventsProvider for SimpleManyChannelMonitor<Key, ChanSigner, T, F, L, C, U>
326332
where T::Target: BroadcasterInterface,
327333
F::Target: FeeEstimator,
328334
L::Target: Logger,
329335
C::Target: ChainWatchInterface,
336+
U::Target: UtxoPool
330337
{
331338
fn get_and_clear_pending_events(&self) -> Vec<Event> {
332339
let mut pending_events = Vec::new();
@@ -1736,10 +1743,11 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
17361743
/// Eventually this should be pub and, roughly, implement ChainListener, however this requires
17371744
/// &mut self, as well as returns new spendable outputs and outpoints to watch for spending of
17381745
/// on-chain.
1739-
fn block_connected<B: Deref, F: Deref, L: Deref>(&mut self, txn_matched: &[&Transaction], height: u32, block_hash: &BlockHash, broadcaster: B, fee_estimator: F, logger: L)-> Vec<(Txid, Vec<TxOut>)>
1746+
fn block_connected<B: Deref, F: Deref, L: Deref, U: Deref>(&mut self, txn_matched: &[&Transaction], height: u32, block_hash: &BlockHash, broadcaster: B, fee_estimator: F, logger: L, utxo_pool: U)-> Vec<(Txid, Vec<TxOut>)>
17401747
where B::Target: BroadcasterInterface,
17411748
F::Target: FeeEstimator,
17421749
L::Target: Logger,
1750+
U::Target: UtxoPool
17431751
{
17441752
for tx in txn_matched {
17451753
let mut output_val = 0;
@@ -1828,8 +1836,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
18281836
}
18291837
}
18301838
}
1831-
1832-
self.onchain_tx_handler.block_connected(txn_matched, claimable_outpoints, height, &*broadcaster, &*fee_estimator, &*logger);
1839+
self.onchain_tx_handler.block_connected(txn_matched, claimable_outpoints, height, &*broadcaster, &*fee_estimator, &*logger, &*utxo_pool);
18331840

18341841
self.last_block_hash = block_hash.clone();
18351842
for &(ref txid, ref output_scripts) in watch_outputs.iter() {
@@ -1839,10 +1846,11 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
18391846
watch_outputs
18401847
}
18411848

1842-
fn block_disconnected<B: Deref, F: Deref, L: Deref>(&mut self, height: u32, block_hash: &BlockHash, broadcaster: B, fee_estimator: F, logger: L)
1849+
fn block_disconnected<B: Deref, F: Deref, L: Deref, U: Deref>(&mut self, height: u32, block_hash: &BlockHash, broadcaster: B, fee_estimator: F, logger: L, utxo_pool: U)
18431850
where B::Target: BroadcasterInterface,
18441851
F::Target: FeeEstimator,
18451852
L::Target: Logger,
1853+
U::Target: UtxoPool
18461854
{
18471855
log_trace!(logger, "Block {} at height {} disconnected", block_hash, height);
18481856
if let Some(_) = self.onchain_events_waiting_threshold_conf.remove(&(height + ANTI_REORG_DELAY - 1)) {
@@ -1851,7 +1859,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
18511859
//- maturing spendable output has transaction paying us has been disconnected
18521860
}
18531861

1854-
self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger);
1862+
self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger, utxo_pool);
18551863

18561864
self.last_block_hash = block_hash.clone();
18571865
}

lightning/src/ln/functional_test_utils.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub struct TestChanMonCfg {
6969
pub fee_estimator: test_utils::TestFeeEstimator,
7070
pub chain_monitor: chaininterface::ChainWatchInterfaceUtil,
7171
pub logger: test_utils::TestLogger,
72+
pub utxo_pool: test_utils::TestPool,
7273
}
7374

7475
pub struct NodeCfg<'a> {
@@ -173,7 +174,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
173174
}
174175

175176
let chain_watch = chaininterface::ChainWatchInterfaceUtil::new(Network::Testnet);
176-
let channel_monitor = test_utils::TestChannelMonitor::new(&chain_watch, self.tx_broadcaster.clone(), &self.logger, &feeest);
177+
let utxo_pool = test_utils::TestPool::new();
178+
let channel_monitor = test_utils::TestChannelMonitor::new(&chain_watch, self.tx_broadcaster.clone(), &self.logger, &feeest, &utxo_pool);
177179
for deserialized_monitor in deserialized_monitors.drain(..) {
178180
if let Err(_) = channel_monitor.add_monitor(deserialized_monitor.get_funding_txo().0, deserialized_monitor) {
179181
panic!();
@@ -1069,7 +1071,8 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
10691071
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
10701072
let chain_monitor = chaininterface::ChainWatchInterfaceUtil::new(Network::Testnet);
10711073
let logger = test_utils::TestLogger::with_id(format!("node {}", i));
1072-
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator, chain_monitor, logger });
1074+
let utxo_pool = test_utils::TestPool::new();
1075+
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator, chain_monitor, logger, utxo_pool });
10731076
}
10741077

10751078
chan_mon_cfgs
@@ -1081,7 +1084,7 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
10811084
for i in 0..node_count {
10821085
let seed = [i as u8; 32];
10831086
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
1084-
let chan_monitor = test_utils::TestChannelMonitor::new(&chanmon_cfgs[i].chain_monitor, &chanmon_cfgs[i].tx_broadcaster, &chanmon_cfgs[i].logger, &chanmon_cfgs[i].fee_estimator);
1087+
let chan_monitor = test_utils::TestChannelMonitor::new(&chanmon_cfgs[i].chain_monitor, &chanmon_cfgs[i].tx_broadcaster, &chanmon_cfgs[i].logger, &chanmon_cfgs[i].fee_estimator, &chanmon_cfgs[i].utxo_pool);
10851088
nodes.push(NodeCfg { chain_monitor: &chanmon_cfgs[i].chain_monitor, logger: &chanmon_cfgs[i].logger, tx_broadcaster: &chanmon_cfgs[i].tx_broadcaster, fee_estimator: &chanmon_cfgs[i].fee_estimator, chan_monitor, keys_manager, node_seed: seed });
10861089
}
10871090

0 commit comments

Comments
 (0)