@@ -24,6 +24,15 @@ use crate::sign::{ChannelSigner, HTLCDescriptor};
24
24
/// policies in order to be secure. Please refer to the [VLS Policy
25
25
/// Controls](https://gitlab.com/lightning-signer/validating-lightning-signer/-/blob/main/docs/policy-controls.md)
26
26
/// for an example of such policies.
27
+ ///
28
+ /// Like [`ChannelSigner`], many of the methods allow errors to be returned to support async
29
+ /// signing. In such cases, the signing operation can be replayed by calling
30
+ /// [`ChannelManager::signer_unblocked`] or [`ChainMonitor::signer_unblocked`] (see individual
31
+ /// method documentation for which method should be called) once the result is ready, at which
32
+ /// point the channel operation will resume.
33
+ ///
34
+ /// [`ChannelManager::signer_unblocked`]: crate::ln::channelmanager::ChannelManager::signer_unblocked
35
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
27
36
pub trait EcdsaChannelSigner : ChannelSigner {
28
37
/// Create a signature for a counterparty's commitment transaction and associated HTLC transactions.
29
38
///
@@ -39,8 +48,12 @@ pub trait EcdsaChannelSigner: ChannelSigner {
39
48
///
40
49
/// Note that all the relevant preimages will be provided, but there may also be additional
41
50
/// irrelevant or duplicate preimages.
42
- //
43
- // TODO: Document the things someone using this interface should enforce before signing.
51
+ ///
52
+ /// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
53
+ /// signature and should be retried later. Once the signer is ready to provide a signature after
54
+ /// previously returning an `Err`, [`ChannelManager::signer_unblocked`] must be called.
55
+ ///
56
+ /// [`ChannelManager::signer_unblocked`]: crate::ln::channelmanager::ChannelManager::signer_unblocked
44
57
fn sign_counterparty_commitment (
45
58
& self , commitment_tx : & CommitmentTransaction , inbound_htlc_preimages : Vec < PaymentPreimage > ,
46
59
outbound_htlc_preimages : Vec < PaymentPreimage > , secp_ctx : & Secp256k1 < secp256k1:: All > ,
@@ -58,18 +71,19 @@ pub trait EcdsaChannelSigner: ChannelSigner {
58
71
/// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
59
72
/// signature and should be retried later. Once the signer is ready to provide a signature after
60
73
/// previously returning an `Err`, [`ChannelMonitor::signer_unblocked`] must be called on its
61
- /// monitor.
74
+ /// monitor or [`ChainMonitor::signer_unblocked`] called to attempt unblocking all monitors .
62
75
///
63
76
/// [`ChannelMonitor::signer_unblocked`]: crate::chain::channelmonitor::ChannelMonitor::signer_unblocked
64
- //
65
- // TODO: Document the things someone using this interface should enforce before signing.
77
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
66
78
fn sign_holder_commitment (
67
79
& self , commitment_tx : & HolderCommitmentTransaction , secp_ctx : & Secp256k1 < secp256k1:: All > ,
68
80
) -> Result < Signature , ( ) > ;
69
81
/// Same as [`sign_holder_commitment`], but exists only for tests to get access to holder
70
82
/// commitment transactions which will be broadcasted later, after the channel has moved on to a
71
83
/// newer state. Thus, needs its own method as [`sign_holder_commitment`] may enforce that we
72
84
/// only ever get called once.
85
+ ///
86
+ /// This method is *not* async as it is intended only for testing purposes.
73
87
#[ cfg( any( test, feature = "unsafe_revoked_tx_signing" ) ) ]
74
88
fn unsafe_sign_holder_commitment (
75
89
& self , commitment_tx : & HolderCommitmentTransaction , secp_ctx : & Secp256k1 < secp256k1:: All > ,
@@ -92,9 +106,10 @@ pub trait EcdsaChannelSigner: ChannelSigner {
92
106
/// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
93
107
/// signature and should be retried later. Once the signer is ready to provide a signature after
94
108
/// previously returning an `Err`, [`ChannelMonitor::signer_unblocked`] must be called on its
95
- /// monitor.
109
+ /// monitor or [`ChainMonitor::signer_unblocked`] called to attempt unblocking all monitors .
96
110
///
97
111
/// [`ChannelMonitor::signer_unblocked`]: crate::chain::channelmonitor::ChannelMonitor::signer_unblocked
112
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
98
113
fn sign_justice_revoked_output (
99
114
& self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey ,
100
115
secp_ctx : & Secp256k1 < secp256k1:: All > ,
@@ -121,9 +136,10 @@ pub trait EcdsaChannelSigner: ChannelSigner {
121
136
/// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
122
137
/// signature and should be retried later. Once the signer is ready to provide a signature after
123
138
/// previously returning an `Err`, [`ChannelMonitor::signer_unblocked`] must be called on its
124
- /// monitor.
139
+ /// monitor or [`ChainMonitor::signer_unblocked`] called to attempt unblocking all monitors .
125
140
///
126
141
/// [`ChannelMonitor::signer_unblocked`]: crate::chain::channelmonitor::ChannelMonitor::signer_unblocked
142
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
127
143
fn sign_justice_revoked_htlc (
128
144
& self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey ,
129
145
htlc : & HTLCOutputInCommitment , secp_ctx : & Secp256k1 < secp256k1:: All > ,
@@ -139,11 +155,12 @@ pub trait EcdsaChannelSigner: ChannelSigner {
139
155
/// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
140
156
/// signature and should be retried later. Once the signer is ready to provide a signature after
141
157
/// previously returning an `Err`, [`ChannelMonitor::signer_unblocked`] must be called on its
142
- /// monitor.
158
+ /// monitor or [`ChainMonitor::signer_unblocked`] called to attempt unblocking all monitors .
143
159
///
144
160
/// [`EcdsaSighashType::All`]: bitcoin::sighash::EcdsaSighashType::All
145
161
/// [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
146
162
/// [`ChannelMonitor::signer_unblocked`]: crate::chain::channelmonitor::ChannelMonitor::signer_unblocked
163
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
147
164
fn sign_holder_htlc_transaction (
148
165
& self , htlc_tx : & Transaction , input : usize , htlc_descriptor : & HTLCDescriptor ,
149
166
secp_ctx : & Secp256k1 < secp256k1:: All > ,
@@ -169,9 +186,10 @@ pub trait EcdsaChannelSigner: ChannelSigner {
169
186
/// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
170
187
/// signature and should be retried later. Once the signer is ready to provide a signature after
171
188
/// previously returning an `Err`, [`ChannelMonitor::signer_unblocked`] must be called on its
172
- /// monitor.
189
+ /// monitor or [`ChainMonitor::signer_unblocked`] called to attempt unblocking all monitors .
173
190
///
174
191
/// [`ChannelMonitor::signer_unblocked`]: crate::chain::channelmonitor::ChannelMonitor::signer_unblocked
192
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
175
193
fn sign_counterparty_htlc_transaction (
176
194
& self , htlc_tx : & Transaction , input : usize , amount : u64 , per_commitment_point : & PublicKey ,
177
195
htlc : & HTLCOutputInCommitment , secp_ctx : & Secp256k1 < secp256k1:: All > ,
@@ -180,6 +198,12 @@ pub trait EcdsaChannelSigner: ChannelSigner {
180
198
///
181
199
/// Note that, due to rounding, there may be one "missing" satoshi, and either party may have
182
200
/// chosen to forgo their output as dust.
201
+ ///
202
+ /// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
203
+ /// signature and should be retried later. Once the signer is ready to provide a signature after
204
+ /// previously returning an `Err`, [`ChannelManager::signer_unblocked`] must be called.
205
+ ///
206
+ /// [`ChannelManager::signer_unblocked`]: crate::ln::channelmanager::ChannelManager::signer_unblocked
183
207
fn sign_closing_transaction (
184
208
& self , closing_tx : & ClosingTransaction , secp_ctx : & Secp256k1 < secp256k1:: All > ,
185
209
) -> Result < Signature , ( ) > ;
@@ -189,9 +213,10 @@ pub trait EcdsaChannelSigner: ChannelSigner {
189
213
/// An `Err` can be returned to signal that the signer is unavailable/cannot produce a valid
190
214
/// signature and should be retried later. Once the signer is ready to provide a signature after
191
215
/// previously returning an `Err`, [`ChannelMonitor::signer_unblocked`] must be called on its
192
- /// monitor.
216
+ /// monitor or [`ChainMonitor::signer_unblocked`] called to attempt unblocking all monitors .
193
217
///
194
218
/// [`ChannelMonitor::signer_unblocked`]: crate::chain::channelmonitor::ChannelMonitor::signer_unblocked
219
+ /// [`ChainMonitor::signer_unblocked`]: crate::chain::chainmonitor::ChainMonitor::signer_unblocked
195
220
fn sign_holder_anchor_input (
196
221
& self , anchor_tx : & Transaction , input : usize , secp_ctx : & Secp256k1 < secp256k1:: All > ,
197
222
) -> Result < Signature , ( ) > ;
@@ -201,9 +226,9 @@ pub trait EcdsaChannelSigner: ChannelSigner {
201
226
/// Channel announcements also require a signature from each node's network key. Our node
202
227
/// signature is computed through [`NodeSigner::sign_gossip_message`].
203
228
///
204
- /// Note that if this fails or is rejected, the channel will not be publicly announced and
205
- /// our counterparty may (though likely will not) close the channel on us for violating the
206
- /// protocol.
229
+ /// This method is *not* asynchronous, if this fails or is rejected, the channel will not be
230
+ /// publicly announced and our counterparty may (though likely will not) close the channel on
231
+ /// us for violating the protocol.
207
232
///
208
233
/// [`NodeSigner::sign_gossip_message`]: crate::sign::NodeSigner::sign_gossip_message
209
234
fn sign_channel_announcement_with_funding_key (
@@ -219,6 +244,9 @@ pub trait EcdsaChannelSigner: ChannelSigner {
219
244
/// spending the previous funding transaction's output
220
245
///
221
246
/// `input_value`: The value of the previous funding transaction output.
247
+ ///
248
+ /// THis method is *not* asynchronous. If an `Err` is returned, the channel will be immediately
249
+ /// closed.
222
250
fn sign_splicing_funding_input (
223
251
& self , tx : & Transaction , input_index : usize , input_value : u64 ,
224
252
secp_ctx : & Secp256k1 < secp256k1:: All > ,
0 commit comments