Skip to content

Commit 5e4b218

Browse files
committed
f - Move ChainListener to lightning crate and implement there
1 parent a9aeeb2 commit 5e4b218

File tree

6 files changed

+132
-112
lines changed

6 files changed

+132
-112
lines changed

Diff for: lightning-block-sync/src/init.rs

+8-84
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
1-
use crate::{BlockSource, BlockSourceResult, Cache, ChainListener, ChainNotifier};
1+
use crate::{BlockSource, BlockSourceResult, Cache, ChainNotifier};
22
use crate::poll::{ChainPoller, Validate, ValidatedBlockHeader};
33

44
use bitcoin::blockdata::block::{Block, BlockHeader};
55
use bitcoin::hash_types::BlockHash;
66
use bitcoin::network::constants::Network;
77

8-
use lightning::chain;
9-
use lightning::chain::chainmonitor::ChainMonitor;
10-
use lightning::chain::chaininterface;
11-
use lightning::chain::channelmonitor;
12-
use lightning::chain::channelmonitor::ChannelMonitor;
13-
use lightning::chain::keysinterface;
14-
use lightning::ln::channelmanager::ChannelManager;
15-
use lightning::util::logger;
16-
17-
use std::cell::RefCell;
18-
use std::ops::Deref;
8+
use lightning::chain::ChainListener;
199

2010
/// Performs a one-time sync of chain listeners using a single *trusted* block source, bringing each
2111
/// listener's view of the chain from its paired block hash to `block_source`'s best chain tip.
@@ -32,6 +22,7 @@ use std::ops::Deref;
3222
/// use bitcoin::network::constants::Network;
3323
///
3424
/// use lightning::chain;
25+
/// use lightning::chain::ChainListener;
3526
/// use lightning::chain::Watch;
3627
/// use lightning::chain::chainmonitor::ChainMonitor;
3728
/// use lightning::chain::channelmonitor;
@@ -90,11 +81,11 @@ use std::ops::Deref;
9081
/// };
9182
///
9283
/// let mut cache = UnboundedCache::new();
93-
/// let mut monitor_listener = (RefCell::new(monitor), tx_broadcaster, fee_estimator, logger);
94-
/// let mut manager_listener = &manager;
84+
/// let mut monitor_listener = (RefCell::new(monitor), &*tx_broadcaster, &*fee_estimator, &*logger);
85+
/// let mut manager_listener = &mut manager;
9586
/// let listeners = vec![
9687
/// (monitor_block_hash, &mut monitor_listener as &mut dyn ChainListener),
97-
/// (manager_block_hash, &mut manager_listener as &mut dyn ChainListener),
88+
/// (manager_block_hash, manager_listener as &mut dyn ChainListener),
9889
/// ];
9990
/// let chain_tip =
10091
/// init::sync_listeners(block_source, Network::Bitcoin, &mut cache, listeners).await.unwrap();
@@ -103,8 +94,8 @@ use std::ops::Deref;
10394
/// chain_monitor.watch_channel(monitor.get_funding_txo().0, monitor);
10495
///
10596
/// let chain_poller = poll::ChainPoller::new(block_source, Network::Bitcoin);
106-
/// let chain_listener = (&chain_monitor, &manager_listener);
107-
/// let spv_client = SpvClient::new(chain_tip, chain_poller, &mut cache, chain_listener);
97+
/// let mut chain_listener = (chain_monitor, manager_listener);
98+
/// let spv_client = SpvClient::new(chain_tip, chain_poller, &mut cache, &chain_listener);
10899
/// }
109100
/// ```
110101
///
@@ -223,73 +214,6 @@ impl<'a> ChainListener for ChainListenerSet<'a> {
223214
}
224215
}
225216

226-
impl<S, B: Deref, F: Deref, L: Deref> ChainListener for (RefCell<ChannelMonitor<S>>, B, F, L)
227-
where
228-
S: keysinterface::Sign,
229-
B::Target: chaininterface::BroadcasterInterface,
230-
F::Target: chaininterface::FeeEstimator,
231-
L::Target: logger::Logger,
232-
{
233-
fn block_connected(&self, block: &Block, height: u32) {
234-
let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
235-
self.0.borrow_mut().block_connected(&block.header, &txdata, height, &*self.1, &*self.2, &*self.3);
236-
}
237-
238-
fn block_disconnected(&self, header: &BlockHeader, height: u32) {
239-
self.0.borrow_mut().block_disconnected(header, height, &*self.1, &*self.2, &*self.3);
240-
}
241-
}
242-
243-
impl<S, M: Deref, B: Deref, K: Deref, F: Deref, L: Deref> ChainListener for &ChannelManager<S, M, B, K, F, L>
244-
where
245-
S: keysinterface::Sign,
246-
M::Target: chain::Watch<S>,
247-
B::Target: chaininterface::BroadcasterInterface,
248-
K::Target: keysinterface::KeysInterface<Signer = S>,
249-
F::Target: chaininterface::FeeEstimator,
250-
L::Target: logger::Logger,
251-
{
252-
fn block_connected(&self, block: &Block, height: u32) {
253-
let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
254-
ChannelManager::block_connected(self, &block.header, &txdata, height);
255-
}
256-
257-
fn block_disconnected(&self, header: &BlockHeader, _height: u32) {
258-
ChannelManager::block_disconnected(self, header);
259-
}
260-
}
261-
262-
impl<S, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> ChainListener for &ChainMonitor<S, C, T, F, L, P>
263-
where
264-
S: keysinterface::Sign,
265-
C::Target: chain::Filter,
266-
T::Target: chaininterface::BroadcasterInterface,
267-
F::Target: chaininterface::FeeEstimator,
268-
L::Target: logger::Logger,
269-
P::Target: channelmonitor::Persist<S>,
270-
{
271-
fn block_connected(&self, block: &Block, height: u32) {
272-
let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
273-
ChainMonitor::block_connected(self, &block.header, &txdata, height);
274-
}
275-
276-
fn block_disconnected(&self, header: &BlockHeader, height: u32) {
277-
ChainMonitor::block_disconnected(self, header, height);
278-
}
279-
}
280-
281-
impl<T: ChainListener, U: ChainListener> ChainListener for (&T, &U) {
282-
fn block_connected(&self, block: &Block, height: u32) {
283-
self.0.block_connected(block, height);
284-
self.1.block_connected(block, height);
285-
}
286-
287-
fn block_disconnected(&self, header: &BlockHeader, height: u32) {
288-
self.0.block_disconnected(header, height);
289-
self.1.block_disconnected(header, height);
290-
}
291-
}
292-
293217
#[cfg(test)]
294218
mod tests {
295219
use crate::test_utils::{Blockchain, MockChainListener};

Diff for: lightning-block-sync/src/lib.rs

+25-25
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ use bitcoin::blockdata::block::{Block, BlockHeader};
4343
use bitcoin::hash_types::BlockHash;
4444
use bitcoin::util::uint::Uint256;
4545

46+
use lightning::chain::ChainListener;
47+
4648
use std::future::Future;
49+
use std::ops::Deref;
4750
use std::pin::Pin;
4851

4952
/// Abstract type for retrieving block headers and data.
@@ -155,24 +158,14 @@ pub struct BlockHeaderData {
155158
/// custom cache eviction policy. This offers flexibility to those sensitive to resource usage.
156159
/// Hence, there is a trade-off between a lower memory footprint and potentially increased network
157160
/// I/O as headers are re-fetched during fork detection.
158-
pub struct SpvClient<'a, P: Poll, C: Cache, L: ChainListener> {
161+
pub struct SpvClient<'a, P: Poll, C: Cache, L: Deref>
162+
where L::Target: ChainListener {
159163
chain_tip: ValidatedBlockHeader,
160164
chain_poller: P,
161165
chain_notifier: ChainNotifier<'a, C>,
162166
chain_listener: L,
163167
}
164168

165-
/// Adaptor used for notifying when blocks have been connected or disconnected from the chain.
166-
///
167-
/// Used when needing to replay chain data upon startup or as new chain events occur.
168-
pub trait ChainListener {
169-
/// Notifies the listener that a block was added at the given height.
170-
fn block_connected(&self, block: &Block, height: u32);
171-
172-
/// Notifies the listener that a block was removed at the given height.
173-
fn block_disconnected(&self, header: &BlockHeader, height: u32);
174-
}
175-
176169
/// The `Cache` trait defines behavior for managing a block header cache, where block headers are
177170
/// keyed by block hash.
178171
///
@@ -215,7 +208,8 @@ impl Cache for UnboundedCache {
215208
}
216209
}
217210

218-
impl<'a, P: Poll, C: Cache, L: ChainListener> SpvClient<'a, P, C, L> {
211+
impl<'a, P: Poll, C: Cache, L: Deref> SpvClient<'a, P, C, L>
212+
where L::Target: ChainListener {
219213
/// Creates a new SPV client using `chain_tip` as the best known chain tip.
220214
///
221215
/// Subsequent calls to [`poll_best_tip`] will poll for the best chain tip using the given chain
@@ -241,7 +235,7 @@ impl<'a, P: Poll, C: Cache, L: ChainListener> SpvClient<'a, P, C, L> {
241235
///
242236
/// Returns the best polled chain tip relative to the previous best known tip and whether any
243237
/// blocks were indeed connected or disconnected.
244-
pub async fn poll_best_tip(&mut self) -> BlockSourceResult<(ChainTip, bool)> {
238+
pub async fn poll_best_tip(&mut self) -> BlockSourceResult<(ChainTip, bool)> where <L as std::ops::Deref>::Target: std::marker::Sized {
245239
let chain_tip = self.chain_poller.poll_chain_tip(self.chain_tip).await?;
246240
let blocks_connected = match chain_tip {
247241
ChainTip::Common => false,
@@ -261,8 +255,8 @@ impl<'a, P: Poll, C: Cache, L: ChainListener> SpvClient<'a, P, C, L> {
261255

262256
/// Updates the chain tip, syncing the chain listener with any connected or disconnected
263257
/// blocks. Returns whether there were any such blocks.
264-
async fn update_chain_tip(&mut self, best_chain_tip: ValidatedBlockHeader) -> bool {
265-
match self.chain_notifier.sync_listener(best_chain_tip, &self.chain_tip, &mut self.chain_poller, &mut self.chain_listener).await {
258+
async fn update_chain_tip(&mut self, best_chain_tip: ValidatedBlockHeader) -> bool where <L as std::ops::Deref>::Target: std::marker::Sized {
259+
match self.chain_notifier.sync_listener(best_chain_tip, &self.chain_tip, &mut self.chain_poller, &*self.chain_listener).await {
266260
Ok(_) => {
267261
self.chain_tip = best_chain_tip;
268262
true
@@ -315,7 +309,7 @@ impl<'a, C: Cache> ChainNotifier<'a, C> {
315309
new_header: ValidatedBlockHeader,
316310
old_header: &ValidatedBlockHeader,
317311
chain_poller: &mut P,
318-
chain_listener: &mut L,
312+
chain_listener: &L,
319313
) -> Result<(), (BlockSourceError, Option<ValidatedBlockHeader>)> {
320314
let difference = self.find_difference(new_header, old_header, chain_poller).await
321315
.map_err(|e| (e, None))?;
@@ -383,7 +377,7 @@ impl<'a, C: Cache> ChainNotifier<'a, C> {
383377
fn disconnect_blocks<L: ChainListener>(
384378
&mut self,
385379
mut disconnected_blocks: Vec<ValidatedBlockHeader>,
386-
chain_listener: &mut L,
380+
chain_listener: &L,
387381
) {
388382
for header in disconnected_blocks.drain(..) {
389383
if let Some(cached_header) = self.header_cache.block_disconnected(&header.block_hash) {
@@ -399,7 +393,7 @@ impl<'a, C: Cache> ChainNotifier<'a, C> {
399393
mut new_tip: ValidatedBlockHeader,
400394
mut connected_blocks: Vec<ValidatedBlockHeader>,
401395
chain_poller: &mut P,
402-
chain_listener: &mut L,
396+
chain_listener: &L,
403397
) -> Result<(), (BlockSourceError, Option<ValidatedBlockHeader>)> {
404398
for header in connected_blocks.drain(..).rev() {
405399
let block = chain_poller
@@ -430,7 +424,8 @@ mod spv_client_tests {
430424

431425
let poller = poll::ChainPoller::new(&mut chain, Network::Testnet);
432426
let mut cache = UnboundedCache::new();
433-
let mut client = SpvClient::new(best_tip, poller, &mut cache, NullChainListener {});
427+
let mut listener = NullChainListener {};
428+
let mut client = SpvClient::new(best_tip, poller, &mut cache, &mut listener);
434429
match client.poll_best_tip().await {
435430
Err(e) => {
436431
assert_eq!(e.kind(), BlockSourceErrorKind::Persistent);
@@ -448,7 +443,8 @@ mod spv_client_tests {
448443

449444
let poller = poll::ChainPoller::new(&mut chain, Network::Testnet);
450445
let mut cache = UnboundedCache::new();
451-
let mut client = SpvClient::new(common_tip, poller, &mut cache, NullChainListener {});
446+
let mut listener = NullChainListener {};
447+
let mut client = SpvClient::new(common_tip, poller, &mut cache, &mut listener);
452448
match client.poll_best_tip().await {
453449
Err(e) => panic!("Unexpected error: {:?}", e),
454450
Ok((chain_tip, blocks_connected)) => {
@@ -467,7 +463,8 @@ mod spv_client_tests {
467463

468464
let poller = poll::ChainPoller::new(&mut chain, Network::Testnet);
469465
let mut cache = UnboundedCache::new();
470-
let mut client = SpvClient::new(old_tip, poller, &mut cache, NullChainListener {});
466+
let mut listener = NullChainListener {};
467+
let mut client = SpvClient::new(old_tip, poller, &mut cache, &mut listener);
471468
match client.poll_best_tip().await {
472469
Err(e) => panic!("Unexpected error: {:?}", e),
473470
Ok((chain_tip, blocks_connected)) => {
@@ -486,7 +483,8 @@ mod spv_client_tests {
486483

487484
let poller = poll::ChainPoller::new(&mut chain, Network::Testnet);
488485
let mut cache = UnboundedCache::new();
489-
let mut client = SpvClient::new(old_tip, poller, &mut cache, NullChainListener {});
486+
let mut listener = NullChainListener {};
487+
let mut client = SpvClient::new(old_tip, poller, &mut cache, &mut listener);
490488
match client.poll_best_tip().await {
491489
Err(e) => panic!("Unexpected error: {:?}", e),
492490
Ok((chain_tip, blocks_connected)) => {
@@ -505,7 +503,8 @@ mod spv_client_tests {
505503

506504
let poller = poll::ChainPoller::new(&mut chain, Network::Testnet);
507505
let mut cache = UnboundedCache::new();
508-
let mut client = SpvClient::new(old_tip, poller, &mut cache, NullChainListener {});
506+
let mut listener = NullChainListener {};
507+
let mut client = SpvClient::new(old_tip, poller, &mut cache, &mut listener);
509508
match client.poll_best_tip().await {
510509
Err(e) => panic!("Unexpected error: {:?}", e),
511510
Ok((chain_tip, blocks_connected)) => {
@@ -525,7 +524,8 @@ mod spv_client_tests {
525524

526525
let poller = poll::ChainPoller::new(&mut chain, Network::Testnet);
527526
let mut cache = UnboundedCache::new();
528-
let mut client = SpvClient::new(best_tip, poller, &mut cache, NullChainListener {});
527+
let mut listener = NullChainListener {};
528+
let mut client = SpvClient::new(best_tip, poller, &mut cache, &mut listener);
529529
match client.poll_best_tip().await {
530530
Err(e) => panic!("Unexpected error: {:?}", e),
531531
Ok((chain_tip, blocks_connected)) => {

Diff for: lightning/src/chain/chainmonitor.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@
2929
//! [`ChannelMonitor`]: ../channelmonitor/struct.ChannelMonitor.html
3030
//! [`MonitorEvent`]: ../channelmonitor/enum.MonitorEvent.html
3131
32-
use bitcoin::blockdata::block::BlockHeader;
32+
use bitcoin::blockdata::block::{Block, BlockHeader};
3333

3434
use chain;
35+
use chain::ChainListener;
3536
use chain::Filter;
3637
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
3738
use chain::channelmonitor;
@@ -140,6 +141,26 @@ where C::Target: chain::Filter,
140141
}
141142
}
142143

144+
impl<ChannelSigner: Sign, C: Deref + Send + Sync, T: Deref + Send + Sync, F: Deref + Send + Sync, L: Deref + Send + Sync, P: Deref + Send + Sync>
145+
ChainListener for ChainMonitor<ChannelSigner, C, T, F, L, P>
146+
where
147+
ChannelSigner: Sign,
148+
C::Target: chain::Filter,
149+
T::Target: BroadcasterInterface,
150+
F::Target: FeeEstimator,
151+
L::Target: Logger,
152+
P::Target: channelmonitor::Persist<ChannelSigner>,
153+
{
154+
fn block_connected(&self, block: &Block, height: u32) {
155+
let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
156+
ChainMonitor::block_connected(self, &block.header, &txdata, height);
157+
}
158+
159+
fn block_disconnected(&self, header: &BlockHeader, height: u32) {
160+
ChainMonitor::block_disconnected(self, header, height);
161+
}
162+
}
163+
143164
impl<ChannelSigner: Sign, C: Deref + Sync + Send, T: Deref + Sync + Send, F: Deref + Sync + Send, L: Deref + Sync + Send, P: Deref + Sync + Send>
144165
chain::Watch<ChannelSigner> for ChainMonitor<ChannelSigner, C, T, F, L, P>
145166
where C::Target: chain::Filter,

Diff for: lightning/src/chain/channelmonitor.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
//!
2323
//! [`chain::Watch`]: ../trait.Watch.html
2424
25-
use bitcoin::blockdata::block::BlockHeader;
25+
use bitcoin::blockdata::block::{Block, BlockHeader};
2626
use bitcoin::blockdata::transaction::{TxOut,Transaction};
2727
use bitcoin::blockdata::transaction::OutPoint as BitcoinOutPoint;
2828
use bitcoin::blockdata::script::{Script, Builder};
@@ -41,6 +41,7 @@ use ln::chan_utils;
4141
use ln::chan_utils::{CounterpartyCommitmentSecrets, HTLCOutputInCommitment, HTLCType, ChannelTransactionParameters, HolderCommitmentTransaction};
4242
use ln::channelmanager::{HTLCSource, PaymentPreimage, PaymentHash};
4343
use ln::onchaintx::{OnchainTxHandler, InputDescriptors};
44+
use chain::ChainListener;
4445
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
4546
use chain::transaction::{OutPoint, TransactionData};
4647
use chain::keysinterface::{SpendableOutputDescriptor, StaticPaymentOutputDescriptor, DelayedPaymentOutputDescriptor, Sign, KeysInterface};
@@ -49,6 +50,7 @@ use util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, U48};
4950
use util::byte_utils;
5051
use util::events::Event;
5152

53+
use std::cell::RefCell;
5254
use std::collections::{HashMap, HashSet, hash_map};
5355
use std::{cmp, mem};
5456
use std::ops::Deref;
@@ -2297,6 +2299,22 @@ pub trait Persist<ChannelSigner: Sign>: Send + Sync {
22972299
fn update_persisted_channel(&self, id: OutPoint, update: &ChannelMonitorUpdate, data: &ChannelMonitor<ChannelSigner>) -> Result<(), ChannelMonitorUpdateErr>;
22982300
}
22992301

2302+
impl<Signer: Sign, T: Deref, F: Deref, L: Deref> ChainListener for (RefCell<ChannelMonitor<Signer>>, T, F, L)
2303+
where
2304+
T::Target: BroadcasterInterface,
2305+
F::Target: FeeEstimator,
2306+
L::Target: Logger,
2307+
{
2308+
fn block_connected(&self, block: &Block, height: u32) {
2309+
let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
2310+
self.0.borrow_mut().block_connected(&block.header, &txdata, height, &*self.1, &*self.2, &*self.3);
2311+
}
2312+
2313+
fn block_disconnected(&self, header: &BlockHeader, height: u32) {
2314+
self.0.borrow_mut().block_disconnected(header, height, &*self.1, &*self.2, &*self.3);
2315+
}
2316+
}
2317+
23002318
const MAX_ALLOC_SIZE: usize = 64*1024;
23012319

23022320
impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>

0 commit comments

Comments
 (0)