11
11
//! properly with a signer implementation that asynchronously derives signatures.
12
12
13
13
use crate :: events:: { MessageSendEvent , MessageSendEventsProvider } ;
14
- use crate :: ln:: msgs:: ChannelMessageHandler ;
15
-
16
14
use crate :: ln:: functional_test_utils:: * ;
15
+ use crate :: ln:: msgs:: ChannelMessageHandler ;
16
+ use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
17
17
18
18
#[ test]
19
19
fn test_async_commitment_signature_for_funding_created ( ) {
@@ -24,7 +24,7 @@ fn test_async_commitment_signature_for_funding_created() {
24
24
let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
25
25
26
26
nodes[ 0 ] . node . create_channel ( nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 10001 , 42 , None ) . unwrap ( ) ;
27
-
27
+
28
28
// nodes[0] --- open_channel --> nodes[1]
29
29
let mut open_chan_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendOpenChannel , nodes[ 1 ] . node. get_our_node_id( ) ) ;
30
30
nodes[ 1 ] . node . handle_open_channel ( & nodes[ 0 ] . node . get_our_node_id ( ) , & open_chan_msg) ;
@@ -130,3 +130,86 @@ fn test_async_commitment_signature_for_funding_signed() {
130
130
check_added_monitors ( & nodes[ 0 ] , 1 ) ;
131
131
expect_channel_pending_event ( & nodes[ 0 ] , & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
132
132
}
133
+
134
+ #[ test]
135
+ fn test_async_commitment_signature_for_commitment_signed ( ) {
136
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
137
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
138
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
139
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
140
+
141
+ nodes[ 0 ] . node . create_channel ( nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 10001 , 42 , None ) . unwrap ( ) ;
142
+
143
+ // nodes[0] --- open_channel --> nodes[1]
144
+ let mut open_chan_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendOpenChannel , nodes[ 1 ] . node. get_our_node_id( ) ) ;
145
+ nodes[ 1 ] . node . handle_open_channel ( & nodes[ 0 ] . node . get_our_node_id ( ) , & open_chan_msg) ;
146
+
147
+ // nodes[0] <-- accept_channel --- nodes[1]
148
+ nodes[ 0 ] . node . handle_accept_channel ( & nodes[ 1 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendAcceptChannel , nodes[ 0 ] . node. get_our_node_id( ) ) ) ;
149
+
150
+ // nodes[0] --- funding_created --> nodes[1]
151
+ let ( temporary_channel_id, tx, _) = create_funding_transaction ( & nodes[ 0 ] , & nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 42 ) ;
152
+
153
+ nodes[ 0 ] . node . funding_transaction_generated ( & temporary_channel_id, & nodes[ 1 ] . node . get_our_node_id ( ) , tx. clone ( ) ) . unwrap ( ) ;
154
+ check_added_monitors ( & nodes[ 0 ] , 0 ) ;
155
+
156
+ let mut funding_created_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendFundingCreated , nodes[ 1 ] . node. get_our_node_id( ) ) ;
157
+ nodes[ 1 ] . node . handle_funding_created ( & nodes[ 0 ] . node . get_our_node_id ( ) , & funding_created_msg) ;
158
+ check_added_monitors ( & nodes[ 1 ] , 1 ) ;
159
+
160
+ // nodes[0] <-- funding_signed --- nodes[1]
161
+ let funding_signed_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendFundingSigned , nodes[ 0 ] . node. get_our_node_id( ) ) ;
162
+ nodes[ 0 ] . node . handle_funding_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & funding_signed_msg) ;
163
+ check_added_monitors ( & nodes[ 0 ] , 1 ) ;
164
+
165
+ let chan_id = expect_channel_pending_event ( & nodes[ 0 ] , & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
166
+ expect_channel_pending_event ( & nodes[ 1 ] , & nodes[ 0 ] . node . get_our_node_id ( ) ) ;
167
+
168
+ assert_eq ! ( nodes[ 0 ] . tx_broadcaster. txn_broadcasted. lock( ) . unwrap( ) . len( ) , 1 ) ;
169
+ assert_eq ! ( nodes[ 0 ] . tx_broadcaster. txn_broadcasted. lock( ) . unwrap( ) [ 0 ] , tx) ;
170
+
171
+ let ( channel_ready, _) = create_chan_between_nodes_with_value_confirm ( & nodes[ 0 ] , & nodes[ 1 ] , & tx) ;
172
+ let ( announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b ( & nodes[ 0 ] , & nodes[ 1 ] , & channel_ready) ;
173
+ update_nodes_with_chan_announce ( & nodes, 0 , 1 , & announcement, & as_update, & bs_update) ;
174
+
175
+ // Send a payment.
176
+ let src = & nodes[ 0 ] ;
177
+ let dst = & nodes[ 1 ] ;
178
+ let ( route, our_payment_hash, _our_payment_preimage, our_payment_secret) = get_route_and_payment_hash ! ( src, dst, 8000000 ) ;
179
+ src. node . send_payment_with_route ( & route, our_payment_hash,
180
+ RecipientOnionFields :: secret_only ( our_payment_secret) , PaymentId ( our_payment_hash. 0 ) ) . unwrap ( ) ;
181
+ check_added_monitors ! ( src, 1 ) ;
182
+
183
+ // Pass the payment along the route.
184
+ let payment_event = {
185
+ let mut events = src. node . get_and_clear_pending_msg_events ( ) ;
186
+ assert_eq ! ( events. len( ) , 1 ) ;
187
+ SendEvent :: from_event ( events. remove ( 0 ) )
188
+ } ;
189
+ assert_eq ! ( payment_event. node_id, dst. node. get_our_node_id( ) ) ;
190
+ assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
191
+
192
+ dst. node . handle_update_add_htlc ( & src. node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
193
+
194
+ // Mark dst's signer as unavailable and handle src's commitment_signed: while dst won't yet have a
195
+ // `commitment_signed` of its own to offer, it should publish a `revoke_and_ack`.
196
+ dst. set_channel_signer_available ( & src. node . get_our_node_id ( ) , & chan_id, false ) ;
197
+ dst. node . handle_commitment_signed ( & src. node . get_our_node_id ( ) , & payment_event. commitment_msg ) ;
198
+ check_added_monitors ( dst, 1 ) ;
199
+
200
+ get_event_msg ! ( dst, MessageSendEvent :: SendRevokeAndACK , src. node. get_our_node_id( ) ) ;
201
+
202
+ // Mark dst's signer as available and retry: we now expect to see dst's `commitment_signed`.
203
+ dst. set_channel_signer_available ( & src. node . get_our_node_id ( ) , & chan_id, true ) ;
204
+ dst. node . signer_unblocked ( Some ( ( src. node . get_our_node_id ( ) , chan_id) ) ) ;
205
+
206
+ let events = dst. node . get_and_clear_pending_msg_events ( ) ;
207
+ let n = events. len ( ) ;
208
+ assert_eq ! ( n, 1 , "expected one message, got {n}" ) ;
209
+ if let MessageSendEvent :: UpdateHTLCs { ref node_id, ref updates } = events[ 0 ] {
210
+ assert_eq ! ( node_id, & src. node. get_our_node_id( ) ) ;
211
+ } else {
212
+ panic ! ( "expected UpdateHTLCs message, not {:?}" , events[ 0 ] ) ;
213
+ } ;
214
+ }
215
+
0 commit comments