@@ -18,7 +18,7 @@ use chain::keysinterface;
18
18
use ln:: features:: { ChannelFeatures , InitFeatures } ;
19
19
use ln:: msgs;
20
20
use ln:: msgs:: OptionalField ;
21
- use util:: enforcing_trait_impls:: EnforcingChannelKeys ;
21
+ use util:: enforcing_trait_impls:: { EnforcingChannelKeys , INITIAL_REVOKED_COMMITMENT_NUMBER } ;
22
22
use util:: events;
23
23
use util:: logger:: { Logger , Level , Record } ;
24
24
use util:: ser:: { Readable , ReadableArgs , Writer , Writeable } ;
@@ -35,7 +35,7 @@ use bitcoin::secp256k1::{SecretKey, PublicKey, Secp256k1, Signature};
35
35
use regex;
36
36
37
37
use std:: time:: Duration ;
38
- use std:: sync:: Mutex ;
38
+ use std:: sync:: { Mutex , Arc } ;
39
39
use std:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
40
40
use std:: { cmp, mem} ;
41
41
use std:: collections:: { HashMap , HashSet } ;
@@ -402,6 +402,7 @@ pub struct TestKeysInterface {
402
402
backing : keysinterface:: KeysManager ,
403
403
pub override_session_priv : Mutex < Option < [ u8 ; 32 ] > > ,
404
404
pub override_channel_id_priv : Mutex < Option < [ u8 ; 32 ] > > ,
405
+ revoked_commitments : Mutex < HashMap < [ u8 ; 32 ] , Arc < Mutex < u64 > > > > ,
405
406
}
406
407
407
408
impl keysinterface:: KeysInterface for TestKeysInterface {
@@ -411,7 +412,9 @@ impl keysinterface::KeysInterface for TestKeysInterface {
411
412
fn get_destination_script ( & self ) -> Script { self . backing . get_destination_script ( ) }
412
413
fn get_shutdown_pubkey ( & self ) -> PublicKey { self . backing . get_shutdown_pubkey ( ) }
413
414
fn get_channel_keys ( & self , inbound : bool , channel_value_satoshis : u64 ) -> EnforcingChannelKeys {
414
- EnforcingChannelKeys :: new ( self . backing . get_channel_keys ( inbound, channel_value_satoshis) )
415
+ let keys = self . backing . get_channel_keys ( inbound, channel_value_satoshis) ;
416
+ let revoked_commitment = self . make_revoked_commitment_cell ( keys. commitment_seed ) ;
417
+ EnforcingChannelKeys :: new_with_revoked ( keys, revoked_commitment)
415
418
}
416
419
417
420
fn get_secure_random_bytes ( & self ) -> [ u8 ; 32 ] {
@@ -429,22 +432,41 @@ impl keysinterface::KeysInterface for TestKeysInterface {
429
432
self . backing . get_secure_random_bytes ( )
430
433
}
431
434
432
- fn read_chan_signer ( & self , reader : & [ u8 ] ) -> Result < Self :: ChanKeySigner , msgs:: DecodeError > {
433
- EnforcingChannelKeys :: read ( & mut std:: io:: Cursor :: new ( reader) )
435
+ fn read_chan_signer ( & self , buffer : & [ u8 ] ) -> Result < Self :: ChanKeySigner , msgs:: DecodeError > {
436
+ let mut reader = std:: io:: Cursor :: new ( buffer) ;
437
+
438
+ let inner: InMemoryChannelKeys = Readable :: read ( & mut reader) ?;
439
+ let revoked_commitment = self . make_revoked_commitment_cell ( inner. commitment_seed ) ;
440
+
441
+ {
442
+ let result = revoked_commitment. lock ( ) . unwrap ( ) ;
443
+ println ! ( "XXX read {} {}" , inner. commitment_seed[ 0 ] , result) ;
444
+ }
445
+ let obscure_and_last = Readable :: read ( & mut reader) ?;
446
+
447
+ Ok ( EnforcingChannelKeys {
448
+ inner,
449
+ commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( obscure_and_last) ) ,
450
+ revoked_commitment,
451
+ } )
434
452
}
435
453
}
436
454
455
+
437
456
impl TestKeysInterface {
438
457
pub fn new ( seed : & [ u8 ; 32 ] , network : Network ) -> Self {
439
458
let now = Duration :: from_secs ( genesis_block ( network) . header . time as u64 ) ;
440
459
Self {
441
460
backing : keysinterface:: KeysManager :: new ( seed, network, now. as_secs ( ) , now. subsec_nanos ( ) ) ,
442
461
override_session_priv : Mutex :: new ( None ) ,
443
462
override_channel_id_priv : Mutex :: new ( None ) ,
463
+ revoked_commitments : Mutex :: new ( HashMap :: new ( ) ) ,
444
464
}
445
465
}
446
466
pub fn derive_channel_keys ( & self , channel_value_satoshis : u64 , user_id_1 : u64 , user_id_2 : u64 ) -> EnforcingChannelKeys {
447
- EnforcingChannelKeys :: new ( self . backing . derive_channel_keys ( channel_value_satoshis, user_id_1, user_id_2) )
467
+ let keys = self . backing . derive_channel_keys ( channel_value_satoshis, user_id_1, user_id_2) ;
468
+ let revoked_commitment = self . make_revoked_commitment_cell ( keys. commitment_seed ) ;
469
+ EnforcingChannelKeys :: new_with_revoked ( keys, revoked_commitment)
448
470
}
449
471
}
450
472
@@ -486,3 +508,29 @@ impl chain::Filter for TestChainSource {
486
508
self . watched_outputs . lock ( ) . unwrap ( ) . insert ( ( * outpoint, script_pubkey. clone ( ) ) ) ;
487
509
}
488
510
}
511
+
512
+ impl TestKeysInterface {
513
+ fn make_revoked_commitment_cell ( & self , commitment_seed : [ u8 ; 32 ] ) -> Arc < Mutex < u64 > > {
514
+ let mut revoked_commitments = self . revoked_commitments . lock ( ) . unwrap ( ) ;
515
+ if !revoked_commitments. contains_key ( & commitment_seed) {
516
+ revoked_commitments. insert ( commitment_seed, Arc :: new ( Mutex :: new ( INITIAL_REVOKED_COMMITMENT_NUMBER ) ) ) ;
517
+ }
518
+ println ! ( "XXX create {}" , commitment_seed[ 0 ] ) ;
519
+ let cell = revoked_commitments. get ( & commitment_seed) . unwrap ( ) ;
520
+ Arc :: clone ( cell)
521
+ }
522
+ }
523
+
524
+ #[ test]
525
+ fn test_mutex ( ) {
526
+ let x = Arc :: new ( Mutex :: new ( 123 ) ) ;
527
+ let y = Arc :: clone ( & x) ;
528
+ {
529
+ let mut rx = x. lock ( ) . unwrap ( ) ;
530
+ * rx = 124 ;
531
+ }
532
+ {
533
+ let ry = y. lock ( ) . unwrap ( ) ;
534
+ println ! ( "{}" , * ry) ;
535
+ }
536
+ }
0 commit comments