@@ -375,6 +375,112 @@ def wait_for_instantlock(self, txid, node):
375
375
sleep (0.1 )
376
376
return locked
377
377
378
+ def wait_for_sporks_same (self , timeout = 30 ):
379
+ st = time ()
380
+ while time () < st + timeout :
381
+ if self .check_sporks_same ():
382
+ return
383
+ sleep (0.5 )
384
+ raise AssertionError ("wait_for_sporks_same timed out" )
385
+
386
+ def check_sporks_same (self ):
387
+ sporks = self .nodes [0 ].spork ('show' )
388
+ for node in self .nodes [1 :]:
389
+ sporks2 = node .spork ('show' )
390
+ if sporks != sporks2 :
391
+ return False
392
+ return True
393
+
394
+ def wait_for_quorum_phase (self , phase , check_received_messages , check_received_messages_count , timeout = 5 ):
395
+ t = time ()
396
+ while time () - t < timeout :
397
+ all_ok = True
398
+ for mn in self .mninfo :
399
+ s = mn .node .quorum ("dkgstatus" )["session" ]["llmq_10" ]
400
+ if "phase" not in s :
401
+ all_ok = False
402
+ break
403
+ if s ["phase" ] != phase :
404
+ all_ok = False
405
+ break
406
+ if check_received_messages is not None :
407
+ if s ["receivedContributions" ] < check_received_messages_count :
408
+ all_ok = False
409
+ break
410
+ if all_ok :
411
+ break
412
+ sleep (0.1 )
413
+
414
+ def wait_for_quorum_commitment (self , timeout = 5 ):
415
+ t = time ()
416
+ while time () - t < timeout :
417
+ all_ok = True
418
+ for node in self .nodes :
419
+ s = node .quorum ("dkgstatus" )["session" ]["llmq_10" ]
420
+ if not s ["receivedFinalCommitment" ]:
421
+ all_ok = False
422
+ break
423
+ if all_ok :
424
+ break
425
+ sleep (0.1 )
426
+
427
+ def mine_quorum (self , expected_valid_count = 10 ):
428
+ quorums = self .nodes [0 ].quorum ("list" )
429
+
430
+ # move forward to next DKG
431
+ skip_count = 24 - (self .nodes [0 ].getblockcount () % 24 )
432
+ if skip_count != 0 :
433
+ set_mocktime (get_mocktime () + 1 )
434
+ set_node_times (self .nodes , get_mocktime ())
435
+ self .nodes [0 ].generate (skip_count )
436
+
437
+ # Make sure all reached phase 1 (init)
438
+ self .wait_for_quorum_phase (1 , None , 0 )
439
+ set_mocktime (get_mocktime () + 1 )
440
+ set_node_times (self .nodes , get_mocktime ())
441
+ self .nodes [0 ].generate (2 )
442
+
443
+ # Make sure all reached phase 2 (contribute) and received all contributions
444
+ self .wait_for_quorum_phase (2 , "receivedContributions" , expected_valid_count )
445
+ set_mocktime (get_mocktime () + 1 )
446
+ set_node_times (self .nodes , get_mocktime ())
447
+ self .nodes [0 ].generate (2 )
448
+
449
+ # Make sure all reached phase 3 (complain) and received all complaints
450
+ self .wait_for_quorum_phase (3 , "receivedComplaints" if expected_valid_count != 0 else None , expected_valid_count )
451
+ set_mocktime (get_mocktime () + 1 )
452
+ set_node_times (self .nodes , get_mocktime ())
453
+ self .nodes [0 ].generate (2 )
454
+
455
+ # Make sure all reached phase 4 (justify)
456
+ self .wait_for_quorum_phase (4 , None , 0 )
457
+ set_mocktime (get_mocktime () + 1 )
458
+ set_node_times (self .nodes , get_mocktime ())
459
+ self .nodes [0 ].generate (2 )
460
+
461
+ # Make sure all reached phase 5 (commit)
462
+ self .wait_for_quorum_phase (5 , "receivedPrematureCommitments" , expected_valid_count )
463
+ set_mocktime (get_mocktime () + 1 )
464
+ set_node_times (self .nodes , get_mocktime ())
465
+ self .nodes [0 ].generate (2 )
466
+
467
+ # Make sure all reached phase 6 (mining)
468
+ self .wait_for_quorum_phase (6 , None , 0 )
469
+
470
+ # Wait for final commitment
471
+ self .wait_for_quorum_commitment ()
472
+
473
+ # mine the final commitment
474
+ set_mocktime (get_mocktime () + 1 )
475
+ set_node_times (self .nodes , get_mocktime ())
476
+ self .nodes [0 ].generate (1 )
477
+ while quorums == self .nodes [0 ].quorum ("list" ):
478
+ sleep (2 )
479
+ set_mocktime (get_mocktime () + 1 )
480
+ set_node_times (self .nodes , get_mocktime ())
481
+ self .nodes [0 ].generate (1 )
482
+
483
+
378
484
379
485
# Test framework for doing p2p comparison testing, which sets up some bitcoind
380
486
# binaries:
0 commit comments