@@ -168,10 +168,15 @@ impl chain::Watch<TestChannelSigner> for TestChainMonitor {
168
168
}
169
169
}
170
170
171
+ struct SignerState {
172
+ enforcement : Arc < Mutex < EnforcementState > > ,
173
+ unavailable : Arc < Mutex < u32 > > ,
174
+ }
175
+
171
176
struct KeyProvider {
172
177
node_secret : SecretKey ,
173
178
rand_bytes_id : atomic:: AtomicU32 ,
174
- enforcement_states : Mutex < HashMap < [ u8 ; 32 ] , Arc < Mutex < EnforcementState > > > > ,
179
+ enforcement_states : Mutex < HashMap < [ u8 ; 32 ] , SignerState > > ,
175
180
}
176
181
177
182
impl EntropySource for KeyProvider {
@@ -253,22 +258,19 @@ impl SignerProvider for KeyProvider {
253
258
channel_keys_id,
254
259
channel_keys_id,
255
260
) ;
256
- let revoked_commitment = self . make_enforcement_state_cell ( keys. commitment_seed ) ;
257
- TestChannelSigner :: new_with_revoked ( keys, revoked_commitment, false )
261
+ let mut revoked_commitments = self . enforcement_states . lock ( ) . unwrap ( ) ;
262
+ let new_state = revoked_commitments. entry ( keys. commitment_seed )
263
+ . or_insert ( SignerState {
264
+ enforcement : Arc :: new ( Mutex :: new ( EnforcementState :: new ( ) ) ) ,
265
+ unavailable : Arc :: new ( Mutex :: new ( 0 ) ) ,
266
+ } ) ;
267
+ let mut ret = TestChannelSigner :: new_with_revoked ( keys, Arc :: clone ( & new_state. enforcement ) , false ) ;
268
+ ret. unavailable = Arc :: clone ( & new_state. unavailable ) ;
269
+ ret
258
270
}
259
271
260
- fn read_chan_signer ( & self , buffer : & [ u8 ] ) -> Result < Self :: Signer , DecodeError > {
261
- let mut reader = std:: io:: Cursor :: new ( buffer) ;
262
-
263
- let inner: InMemorySigner = ReadableArgs :: read ( & mut reader, self ) ?;
264
- let state = self . make_enforcement_state_cell ( inner. commitment_seed ) ;
265
-
266
- Ok ( TestChannelSigner {
267
- inner,
268
- state,
269
- disable_revocation_policy_check : false ,
270
- unavailable : Arc :: new ( Mutex :: new ( 0 ) ) ,
271
- } )
272
+ fn read_chan_signer ( & self , _buffer : & [ u8 ] ) -> Result < Self :: Signer , DecodeError > {
273
+ unreachable ! ( ) ;
272
274
}
273
275
274
276
fn get_destination_script ( & self ) -> Result < Script , ( ) > {
@@ -286,17 +288,6 @@ impl SignerProvider for KeyProvider {
286
288
}
287
289
}
288
290
289
- impl KeyProvider {
290
- fn make_enforcement_state_cell ( & self , commitment_seed : [ u8 ; 32 ] ) -> Arc < Mutex < EnforcementState > > {
291
- let mut revoked_commitments = self . enforcement_states . lock ( ) . unwrap ( ) ;
292
- if !revoked_commitments. contains_key ( & commitment_seed) {
293
- revoked_commitments. insert ( commitment_seed, Arc :: new ( Mutex :: new ( EnforcementState :: new ( ) ) ) ) ;
294
- }
295
- let cell = revoked_commitments. get ( & commitment_seed) . unwrap ( ) ;
296
- Arc :: clone ( cell)
297
- }
298
- }
299
-
300
291
#[ inline]
301
292
fn check_api_err ( api_err : APIError , sendable_bounds_violated : bool ) {
302
293
match api_err {
@@ -1259,6 +1250,51 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1259
1250
} ,
1260
1251
0x89 => { fee_est_c. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 2 ] . maybe_update_chan_fees ( ) ; } ,
1261
1252
1253
+ 0xa0 => {
1254
+ let signer_states = keys_manager_a. enforcement_states . lock ( ) . unwrap ( ) ;
1255
+ assert_eq ! ( signer_states. len( ) , 1 ) ;
1256
+ * signer_states. values ( ) . next ( ) . unwrap ( ) . unavailable . lock ( ) . unwrap ( ) = u32:: max_value ( ) ;
1257
+ }
1258
+ 0xa1 => {
1259
+ let signer_states = keys_manager_a. enforcement_states . lock ( ) . unwrap ( ) ;
1260
+ assert_eq ! ( signer_states. len( ) , 1 ) ;
1261
+ * signer_states. values ( ) . next ( ) . unwrap ( ) . unavailable . lock ( ) . unwrap ( ) = 0 ;
1262
+ nodes[ 0 ] . signer_unblocked ( None ) ;
1263
+ }
1264
+ /*0xa2 => {
1265
+ let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1266
+ assert_eq!(signer_states.len(), 1);
1267
+ *signer_states.values().next().unwrap().unavailable.lock().unwrap() = true;
1268
+ }
1269
+ 0xa3 => {
1270
+ let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1271
+ assert_eq!(signer_states.len(), 1);
1272
+ *signer_states.values().next().unwrap().unavailable.lock().unwrap() = false;
1273
+ nodes[0].signer_unblocked(None);
1274
+ }
1275
+ 0xa4 => {
1276
+ let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1277
+ assert_eq!(signer_states.len(), 1);
1278
+ *signer_states.values().next().unwrap().unavailable.lock().unwrap() = true;
1279
+ }
1280
+ 0xa5 => {
1281
+ let signer_states = keys_manager_a.enforcement_states.lock().unwrap();
1282
+ assert_eq!(signer_states.len(), 1);
1283
+ *signer_states.values().next().unwrap().unavailable.lock().unwrap() = false;
1284
+ nodes[0].signer_unblocked(None);
1285
+ }*/
1286
+ 0xa6 => {
1287
+ let signer_states = keys_manager_c. enforcement_states . lock ( ) . unwrap ( ) ;
1288
+ assert_eq ! ( signer_states. len( ) , 1 ) ;
1289
+ * signer_states. values ( ) . next ( ) . unwrap ( ) . unavailable . lock ( ) . unwrap ( ) = u32:: max_value ( ) ;
1290
+ }
1291
+ 0xa7 => {
1292
+ let signer_states = keys_manager_c. enforcement_states . lock ( ) . unwrap ( ) ;
1293
+ assert_eq ! ( signer_states. len( ) , 1 ) ;
1294
+ * signer_states. values ( ) . next ( ) . unwrap ( ) . unavailable . lock ( ) . unwrap ( ) = 0 ;
1295
+ nodes[ 2 ] . signer_unblocked ( None ) ;
1296
+ }
1297
+
1262
1298
0xff => {
1263
1299
// Test that no channel is in a stuck state where neither party can send funds even
1264
1300
// after we resolve all pending events.
@@ -1268,6 +1304,19 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1268
1304
* monitor_b. persister . update_ret . lock ( ) . unwrap ( ) = ChannelMonitorUpdateStatus :: Completed ;
1269
1305
* monitor_c. persister . update_ret . lock ( ) . unwrap ( ) = ChannelMonitorUpdateStatus :: Completed ;
1270
1306
1307
+ for signer_state in keys_manager_a. enforcement_states . lock ( ) . unwrap ( ) . values ( ) {
1308
+ * signer_state. unavailable . lock ( ) . unwrap ( ) = 0 ;
1309
+ }
1310
+ for signer_state in keys_manager_b. enforcement_states . lock ( ) . unwrap ( ) . values ( ) {
1311
+ * signer_state. unavailable . lock ( ) . unwrap ( ) = 0 ;
1312
+ }
1313
+ for signer_state in keys_manager_c. enforcement_states . lock ( ) . unwrap ( ) . values ( ) {
1314
+ * signer_state. unavailable . lock ( ) . unwrap ( ) = 0 ;
1315
+ }
1316
+ nodes[ 0 ] . signer_unblocked ( None ) ;
1317
+ nodes[ 1 ] . signer_unblocked ( None ) ;
1318
+ nodes[ 2 ] . signer_unblocked ( None ) ;
1319
+
1271
1320
if let Some ( ( id, _) ) = monitor_a. latest_monitors . lock ( ) . unwrap ( ) . get ( & chan_1_funding) {
1272
1321
monitor_a. chain_monitor . force_channel_monitor_updated ( chan_1_funding, * id) ;
1273
1322
nodes[ 0 ] . process_monitor_events ( ) ;
0 commit comments