@@ -16,7 +16,7 @@ use bitcoin::hash_types::{BlockHash, Txid};
16
16
17
17
use chain:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdate , ChannelMonitorUpdateErr , MonitorEvent } ;
18
18
use chain:: keysinterface:: Sign ;
19
- use chain:: transaction:: OutPoint ;
19
+ use chain:: transaction:: { OutPoint , TransactionData } ;
20
20
21
21
pub mod chaininterface;
22
22
pub mod chainmonitor;
@@ -45,10 +45,13 @@ pub trait Access: Send + Sync {
45
45
fn get_utxo ( & self , genesis_hash : & BlockHash , short_channel_id : u64 ) -> Result < TxOut , AccessError > ;
46
46
}
47
47
48
- /// The `Listen` trait is used to be notified of when blocks have been connected or disconnected
49
- /// from the chain.
48
+ /// The `Listen` trait is used to notify when blocks have been connected or disconnected from the
49
+ /// chain.
50
50
///
51
- /// Useful when needing to replay chain data upon startup or as new chain events occur.
51
+ /// Useful when needing to replay chain data upon startup or as new chain events occur. Clients
52
+ /// sourcing chain data using a block-oriented API should prefer this interface over [`Confirm`].
53
+ /// Such clients fetch the entire header chain whereas clients using [`Confirm`] only fetch headers
54
+ /// when needed.
52
55
pub trait Listen {
53
56
/// Notifies the listener that a block was added at the given height.
54
57
fn block_connected ( & self , block : & Block , height : u32 ) ;
@@ -57,6 +60,86 @@ pub trait Listen {
57
60
fn block_disconnected ( & self , header : & BlockHeader , height : u32 ) ;
58
61
}
59
62
63
+ /// The `Confirm` trait is used to notify when transactions have been confirmed on chain or
64
+ /// unconfirmed during a chain reorganization.
65
+ ///
66
+ /// Clients sourcing chain data using a transaction-oriented API should prefer this interface over
67
+ /// [`Listen`]. For instance, an Electrum client may implement [`Filter`] by subscribing to activity
68
+ /// related to registered transactions and outputs. Upon notification, it would pass along the
69
+ /// matching transactions using this interface.
70
+ ///
71
+ /// # Use
72
+ ///
73
+ /// The intended use is as follows:
74
+ /// - Call [`transactions_confirmed`] to process any on-chain activity of interest.
75
+ /// - Call [`transaction_unconfirmed`] to process any transaction returned by [`get_relevant_txids`]
76
+ /// that has been reorganized out of the chain.
77
+ /// - Call [`best_block_updated`] whenever a new chain tip becomes available.
78
+ ///
79
+ /// # Order
80
+ ///
81
+ /// Clients must call these methods in chain order. Specifically:
82
+ /// - Transactions confirmed in a block must be given before transactions confirmed in a later
83
+ /// block.
84
+ /// - Dependent transactions within the same block must be given in topological order, possibly in
85
+ /// separate calls.
86
+ /// - Unconfirmed transactions must be given after the original confirmations and before any
87
+ /// reconfirmation.
88
+ ///
89
+ /// See individual method documentation for further details.
90
+ ///
91
+ /// [`transactions_confirmed`]: Self::transactions_confirmed
92
+ /// [`transaction_unconfirmed`]: Self::transaction_unconfirmed
93
+ /// [`best_block_updated`]: Self::best_block_updated
94
+ /// [`get_relevant_txids`]: Self::get_relevant_txids
95
+ pub trait Confirm {
96
+ /// Processes transactions confirmed in a block with a given header and height.
97
+ ///
98
+ /// Should be called for any transactions registered by [`Filter::register_tx`] or any
99
+ /// transactions spending an output registered by [`Filter::register_output`]. Such transactions
100
+ /// appearing in the same block do not need to be included in the same call; instead, multiple
101
+ /// calls with additional transactions may be made so long as they are made in [chain order].
102
+ ///
103
+ /// May be called before or after [`best_block_updated`] for the corresponding block. However,
104
+ /// in the event of a chain reorganization, it must not be called with a `header` that is no
105
+ /// longer in the chain as of the last call to [`best_block_updated`].
106
+ ///
107
+ /// [chain order]: Self#order
108
+ /// [`best_block_updated`]: Self::best_block_updated
109
+ fn transactions_confirmed ( & self , header : & BlockHeader , txdata : & TransactionData , height : u32 ) ;
110
+
111
+ /// Processes a transaction that is no longer confirmed as result of a chain reorganization.
112
+ ///
113
+ /// Should be called for any transaction returned by [`get_relevant_txids`] if it has been
114
+ /// reorganized out of the best chain. Once called, the given transaction should not be returned
115
+ /// by [`get_relevant_txids`] unless it has been reconfirmed via [`transactions_confirmed`].
116
+ ///
117
+ /// [`get_relevant_txids`]: Self::get_relevant_txids
118
+ /// [`transactions_confirmed`]: Self::transactions_confirmed
119
+ fn transaction_unconfirmed ( & self , txid : & Txid ) ;
120
+
121
+ /// Processes an update to the best header connected at the given height.
122
+ ///
123
+ /// Should be called when a new header is available but may be skipped for intermediary blocks
124
+ /// if they become available at the same time.
125
+ fn best_block_updated ( & self , header : & BlockHeader , height : u32 ) ;
126
+
127
+ /// Returns transactions that should be monitored for reorganization out of the chain.
128
+ ///
129
+ /// Should include any transactions passed to [`transactions_confirmed`] that have insufficient
130
+ /// confirmations to be safe from a chain reorganization. Should not include any transactions
131
+ /// passed to [`transaction_unconfirmed`] unless later reconfirmed.
132
+ ///
133
+ /// May be called to determine the subset of transactions that must still be monitored for
134
+ /// reorganization. Will be idempotent between calls but may change as a result of calls to the
135
+ /// other interface methods. Thus, this is useful to determine which transactions may need to be
136
+ /// given to [`transaction_unconfirmed`].
137
+ ///
138
+ /// [`transactions_confirmed`]: Self::transactions_confirmed
139
+ /// [`transaction_unconfirmed`]: Self::transaction_unconfirmed
140
+ fn get_relevant_txids ( & self ) -> Vec < Txid > ;
141
+ }
142
+
60
143
/// The `Watch` trait defines behavior for watching on-chain activity pertaining to channels as
61
144
/// blocks are connected and disconnected.
62
145
///
0 commit comments