@@ -38,7 +38,7 @@ use lightning::chain::keysinterface::{KeysInterface, InMemoryChannelKeys};
38
38
use lightning:: ln:: channelmanager:: { ChannelManager , PaymentHash , PaymentPreimage , PaymentSecret , PaymentSendFailure , ChannelManagerReadArgs } ;
39
39
use lightning:: ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
40
40
use lightning:: ln:: msgs:: { CommitmentUpdate , ChannelMessageHandler , DecodeError , ErrorAction , UpdateAddHTLC , Init } ;
41
- use lightning:: util:: enforcing_trait_impls:: EnforcingChannelKeys ;
41
+ use lightning:: util:: enforcing_trait_impls:: { EnforcingChannelKeys , INITIAL_REVOKED_COMMITMENT_NUMBER } ;
42
42
use lightning:: util:: errors:: APIError ;
43
43
use lightning:: util:: events;
44
44
use lightning:: util:: logger:: Logger ;
@@ -146,6 +146,7 @@ impl chain::Watch for TestChainMonitor {
146
146
struct KeyProvider {
147
147
node_id : u8 ,
148
148
rand_bytes_id : atomic:: AtomicU8 ,
149
+ revoked_commitments : Mutex < HashMap < [ u8 ; 32 ] , Arc < Mutex < u64 > > > > ,
149
150
}
150
151
impl KeysInterface for KeyProvider {
151
152
type ChanKeySigner = EnforcingChannelKeys ;
@@ -168,26 +169,51 @@ impl KeysInterface for KeyProvider {
168
169
169
170
fn get_channel_keys ( & self , _inbound : bool , channel_value_satoshis : u64 ) -> EnforcingChannelKeys {
170
171
let secp_ctx = Secp256k1 :: signing_only ( ) ;
171
- EnforcingChannelKeys :: new ( InMemoryChannelKeys :: new (
172
+ let id = self . rand_bytes_id . fetch_add ( 1 , atomic:: Ordering :: Relaxed ) ;
173
+ let keys = InMemoryChannelKeys :: new (
172
174
& secp_ctx,
173
175
SecretKey :: from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , self . node_id ] ) . unwrap ( ) ,
174
176
SecretKey :: from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 , self . node_id ] ) . unwrap ( ) ,
175
177
SecretKey :: from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 , self . node_id ] ) . unwrap ( ) ,
176
178
SecretKey :: from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 , self . node_id ] ) . unwrap ( ) ,
177
179
SecretKey :: from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , self . node_id ] ) . unwrap ( ) ,
178
- [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 9 , self . node_id ] ,
180
+ [ id , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 9 , self . node_id ] ,
179
181
channel_value_satoshis,
180
182
( 0 , 0 ) ,
181
- ) )
183
+ ) ;
184
+ let revoked_commitment = self . make_revoked_commitment_cell ( keys. commitment_seed ) ;
185
+ EnforcingChannelKeys :: new_with_revoked ( keys, revoked_commitment)
182
186
}
183
187
184
188
fn get_secure_random_bytes ( & self ) -> [ u8 ; 32 ] {
185
189
let id = self . rand_bytes_id . fetch_add ( 1 , atomic:: Ordering :: Relaxed ) ;
186
190
[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , id, 11 , self . node_id ]
187
191
}
188
192
189
- fn read_chan_signer ( & self , data : & [ u8 ] ) -> Result < EnforcingChannelKeys , DecodeError > {
190
- EnforcingChannelKeys :: read ( & mut std:: io:: Cursor :: new ( data) )
193
+ fn read_chan_signer ( & self , buffer : & [ u8 ] ) -> Result < Self :: ChanKeySigner , DecodeError > {
194
+ let mut reader = std:: io:: Cursor :: new ( buffer) ;
195
+
196
+ let inner: InMemoryChannelKeys = Readable :: read ( & mut reader) ?;
197
+ let revoked_commitment = self . make_revoked_commitment_cell ( inner. commitment_seed ) ;
198
+
199
+ let obscure_and_last = Readable :: read ( & mut reader) ?;
200
+
201
+ Ok ( EnforcingChannelKeys {
202
+ inner,
203
+ commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( obscure_and_last) ) ,
204
+ revoked_commitment,
205
+ } )
206
+ }
207
+ }
208
+
209
+ impl KeyProvider {
210
+ fn make_revoked_commitment_cell ( & self , commitment_seed : [ u8 ; 32 ] ) -> Arc < Mutex < u64 > > {
211
+ let mut revoked_commitments = self . revoked_commitments . lock ( ) . unwrap ( ) ;
212
+ if !revoked_commitments. contains_key ( & commitment_seed) {
213
+ revoked_commitments. insert ( commitment_seed, Arc :: new ( Mutex :: new ( INITIAL_REVOKED_COMMITMENT_NUMBER ) ) ) ;
214
+ }
215
+ let cell = revoked_commitments. get ( & commitment_seed) . unwrap ( ) ;
216
+ Arc :: clone ( cell)
191
217
}
192
218
}
193
219
@@ -288,22 +314,22 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
288
314
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) , out. clone( ) ) ) ;
289
315
let monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , fee_est. clone( ) , Arc :: new( TestPersister { } ) ) ) ;
290
316
291
- let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, rand_bytes_id: atomic:: AtomicU8 :: new( 0 ) } ) ;
317
+ let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, rand_bytes_id: atomic:: AtomicU8 :: new( 0 ) , revoked_commitments : Mutex :: new ( HashMap :: new ( ) ) } ) ;
292
318
let mut config = UserConfig :: default ( ) ;
293
319
config. channel_options. fee_proportional_millionths = 0 ;
294
320
config. channel_options. announced_channel = true ;
295
321
config. peer_channel_config_limits. min_dust_limit_satoshis = 0 ;
296
322
( ChannelManager :: new( Network :: Bitcoin , fee_est. clone( ) , monitor. clone( ) , broadcast. clone( ) , Arc :: clone( & logger) , keys_manager. clone( ) , config, 0 ) ,
297
- monitor)
323
+ monitor, keys_manager )
298
324
} }
299
325
}
300
326
301
327
macro_rules! reload_node {
302
- ( $ser: expr, $node_id: expr, $old_monitors: expr) => { {
328
+ ( $ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr) => { {
329
+ let keys_manager = Arc :: clone( & $keys_manager) ;
303
330
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) , out. clone( ) ) ) ;
304
331
let chain_monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , fee_est. clone( ) , Arc :: new( TestPersister { } ) ) ) ;
305
332
306
- let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, rand_bytes_id: atomic:: AtomicU8 :: new( 0 ) } ) ;
307
333
let mut config = UserConfig :: default ( ) ;
308
334
config. channel_options. fee_proportional_millionths = 0 ;
309
335
config. channel_options. announced_channel = true ;
@@ -440,9 +466,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
440
466
441
467
// 3 nodes is enough to hit all the possible cases, notably unknown-source-unknown-dest
442
468
// forwarding.
443
- let ( node_a, mut monitor_a) = make_node ! ( 0 ) ;
444
- let ( node_b, mut monitor_b) = make_node ! ( 1 ) ;
445
- let ( node_c, mut monitor_c) = make_node ! ( 2 ) ;
469
+ let ( node_a, mut monitor_a, keys_manager_a ) = make_node ! ( 0 ) ;
470
+ let ( node_b, mut monitor_b, keys_manager_b ) = make_node ! ( 1 ) ;
471
+ let ( node_c, mut monitor_c, keys_manager_c ) = make_node ! ( 2 ) ;
446
472
447
473
let mut nodes = [ node_a, node_b, node_c] ;
448
474
@@ -793,7 +819,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
793
819
chan_a_disconnected = true ;
794
820
drain_msg_events_on_disconnect ! ( 0 ) ;
795
821
}
796
- let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a) ;
822
+ let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a, keys_manager_a ) ;
797
823
nodes[ 0 ] = new_node_a;
798
824
monitor_a = new_monitor_a;
799
825
} ,
@@ -810,7 +836,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
810
836
nodes[ 2 ] . get_and_clear_pending_msg_events ( ) ;
811
837
bc_events. clear ( ) ;
812
838
}
813
- let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b) ;
839
+ let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b, keys_manager_b ) ;
814
840
nodes[ 1 ] = new_node_b;
815
841
monitor_b = new_monitor_b;
816
842
} ,
@@ -820,7 +846,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
820
846
chan_b_disconnected = true ;
821
847
drain_msg_events_on_disconnect ! ( 2 ) ;
822
848
}
823
- let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c) ;
849
+ let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c, keys_manager_c ) ;
824
850
nodes[ 2 ] = new_node_c;
825
851
monitor_c = new_monitor_c;
826
852
} ,
0 commit comments