@@ -382,10 +382,6 @@ mod tests {
382
382
use crate :: task:: IntoTask ;
383
383
use crate :: test:: common:: * ;
384
384
use crate :: verifier:: VerifierServer ;
385
- use bitcoin:: {
386
- block:: { Header , Version } ,
387
- CompactTarget , TxMerkleNode ,
388
- } ;
389
385
use bitcoin:: { hashes:: Hash , BlockHash } ;
390
386
use bitcoincore_rpc:: RpcApi ;
391
387
use borsh:: BorshDeserialize ;
@@ -430,8 +426,11 @@ mod tests {
430
426
}
431
427
}
432
428
429
+ /// Mines `block_num` amount of blocks (if not already mined) and returns
430
+ /// the first `block_num` block headers in blockchain.
433
431
async fn mine_and_get_first_n_block_headers (
434
432
rpc : ExtendedRpc ,
433
+ db : Database ,
435
434
block_num : u64 ,
436
435
) -> Vec < CircuitBlockHeader > {
437
436
let height = rpc. client . get_block_count ( ) . await . unwrap ( ) ;
@@ -445,6 +444,8 @@ mod tests {
445
444
let header = rpc. client . get_block_header ( & hash) . await . unwrap ( ) ;
446
445
447
446
headers. push ( CircuitBlockHeader :: from ( header) ) ;
447
+
448
+ let _ignore_errors = db. set_new_block ( None , hash, header, i) . await ;
448
449
}
449
450
450
451
headers
@@ -561,7 +562,7 @@ mod tests {
561
562
// Prove genesis block and get it's receipt.
562
563
let receipt = prover. prove_block_headers ( None , vec ! [ ] ) . unwrap ( ) ;
563
564
564
- let block_headers = mine_and_get_first_n_block_headers ( rpc, 3 ) . await ;
565
+ let block_headers = mine_and_get_first_n_block_headers ( rpc, prover . db . clone ( ) , 3 ) . await ;
565
566
let receipt = prover
566
567
. prove_block_headers ( Some ( receipt) , block_headers[ 0 ..2 ] . to_vec ( ) )
567
568
. unwrap ( ) ;
@@ -574,66 +575,76 @@ mod tests {
574
575
575
576
#[ tokio:: test]
576
577
#[ serial_test:: serial]
577
- async fn save_and_get_proof ( ) {
578
+ async fn check_for_new_blocks_and_prove ( ) {
578
579
let mut config = create_test_config_with_thread_name ( ) . await ;
579
580
let regtest = create_regtest_rpc ( & mut config) . await ;
580
581
let rpc = regtest. rpc ( ) . clone ( ) ;
581
- let prover = HeaderChainProver :: new ( & config, rpc. clone_inner ( ) . await . unwrap ( ) )
582
- . await
583
- . unwrap ( ) ;
584
582
let db = Database :: new ( & config) . await . unwrap ( ) ;
585
583
586
- let prover_client = HeaderChainProverClient :: new ( db) . await . unwrap ( ) ;
587
- let block_headers = mine_and_get_first_n_block_headers ( rpc, 3 ) . await ;
584
+ let prover = HeaderChainProver :: new ( & config, rpc. clone ( ) ) . await . unwrap ( ) ;
585
+ // let prover_client: HeaderChainProverClient =
586
+ // HeaderChainProverClient::new(db.clone()).await.unwrap();
588
587
589
- // Prove genesis block.
590
- let receipt = prover. prove_block_headers ( None , vec ! [ ] ) . unwrap ( ) ;
591
- let hash =
592
- BlockHash :: from_raw_hash ( Hash :: from_slice ( & block_headers[ 1 ] . prev_block_hash ) . unwrap ( ) ) ;
593
- let header: Header = block_headers[ 0 ] . clone ( ) . into ( ) ;
594
- let _ = prover. db . set_new_block ( None , hash, header, 0 ) . await ; // TODO: Unwrapping this causes errors.
595
- prover
596
- . db
597
- . set_block_proof ( None , hash, receipt. clone ( ) )
598
- . await
599
- . unwrap ( ) ;
600
- let database_receipt = prover_client. get_header_chain_proof ( hash) . await . unwrap ( ) ;
601
- assert_eq ! ( receipt. journal, database_receipt. journal) ;
602
- assert_eq ! ( receipt. metadata, database_receipt. metadata) ;
588
+ let number_of_blocks_to_prove = 5 ;
589
+ let _block_headers =
590
+ mine_and_get_first_n_block_headers ( rpc. clone ( ) , db. clone ( ) , number_of_blocks_to_prove)
591
+ . await ;
603
592
604
- // Prove second block.
605
- let receipt = prover
606
- . prove_block_headers ( Some ( receipt) , block_headers[ 0 ..2 ] . to_vec ( ) )
607
- . unwrap ( ) ;
608
- let hash =
609
- BlockHash :: from_raw_hash ( Hash :: from_slice ( & block_headers[ 2 ] . prev_block_hash ) . unwrap ( ) ) ;
610
- let header = Header {
611
- version : Version :: from_consensus ( block_headers[ 1 ] . version ) ,
612
- prev_blockhash : BlockHash :: from_raw_hash ( Hash :: from_byte_array (
613
- block_headers[ 1 ] . prev_block_hash ,
614
- ) ) ,
615
- merkle_root : TxMerkleNode :: from_raw_hash ( Hash :: from_byte_array (
616
- block_headers[ 1 ] . merkle_root ,
617
- ) ) ,
618
- time : block_headers[ 1 ] . time ,
619
- bits : CompactTarget :: from_consensus ( block_headers[ 1 ] . bits ) ,
620
- nonce : block_headers[ 1 ] . nonce ,
621
- } ;
622
- prover
623
- . db
624
- . set_new_block ( None , hash, header, 0 )
593
+ // Prove blocks after the first one. Because the first one has
594
+ // an assumption that is provided from the bridge config.
595
+ let hash = rpc. client . get_block_hash ( 0 ) . await . unwrap ( ) ;
596
+ let mut previous_proof = db
597
+ . get_block_proof_by_hash ( None , hash)
625
598
. await
599
+ . unwrap ( )
626
600
. unwrap ( ) ;
601
+ for i in 1 ..number_of_blocks_to_prove {
602
+ tracing:: error!( "Proving block wit {:?}" , previous_proof) ;
603
+ let non_proven_block = prover
604
+ . check_for_new_unproven_blocks ( )
605
+ . await
606
+ . unwrap ( )
607
+ . unwrap ( ) ;
608
+ assert_eq ! ( non_proven_block. 2 , i as u32 ) ;
627
609
628
- prover
629
- . db
630
- . set_block_proof ( None , hash, receipt. clone ( ) )
631
- . await
632
- . unwrap ( ) ;
633
- let database_receipt2 = prover_client. get_header_chain_proof ( hash) . await . unwrap ( ) ;
634
- assert_eq ! ( receipt. journal, database_receipt2. journal) ;
635
- assert_eq ! ( receipt. metadata, database_receipt2. metadata) ;
636
- assert_ne ! ( receipt. journal, database_receipt. journal) ;
610
+ // let previous_block_hash = rpc.client.get_block_hash(i - 1).await.unwrap();
611
+ let current_block_hash = rpc. client . get_block_hash ( i) . await . unwrap ( ) ;
612
+ let current_block_header = rpc
613
+ . client
614
+ . get_block_header ( & current_block_hash)
615
+ . await
616
+ . unwrap ( ) ;
617
+ // let previous_proof = prover_client
618
+ // .get_header_chain_proof(previous_block_hash)
619
+ // .await
620
+ // .unwrap();
621
+ // tracing::error!(
622
+ // "Previous proof: wirth hash {:?}",
623
+ // // previous_proof,
624
+ // previous_block_hash
625
+ // );
626
+
627
+ let receipt = prover
628
+ . prove_block (
629
+ current_block_hash,
630
+ current_block_header,
631
+ i. try_into ( ) . unwrap ( ) ,
632
+ previous_proof,
633
+ )
634
+ . await
635
+ . unwrap ( ) ;
636
+
637
+ let db_receipt = db
638
+ . get_block_proof_by_hash ( None , current_block_hash)
639
+ . await
640
+ . unwrap ( )
641
+ . unwrap ( ) ;
642
+
643
+ assert_eq ! ( receipt. journal, db_receipt. journal) ;
644
+ assert_eq ! ( receipt. metadata, db_receipt. metadata) ;
645
+
646
+ previous_proof = receipt;
647
+ }
637
648
}
638
649
639
650
#[ tokio:: test]
@@ -683,6 +694,7 @@ mod tests {
683
694
684
695
// Save initial blocks, because VerifierServer won't.
685
696
let count = rpc. client . get_block_count ( ) . await . unwrap ( ) ;
697
+ tracing:: info!( "Block count: {}" , count) ;
686
698
for i in 1 ..count {
687
699
let hash = rpc. client . get_block_hash ( i) . await . unwrap ( ) ;
688
700
let block = rpc. client . get_block ( & hash) . await . unwrap ( ) ;
@@ -695,8 +707,9 @@ mod tests {
695
707
let verifier = VerifierServer :: < MockCitreaClient > :: new ( config)
696
708
. await
697
709
. unwrap ( ) ;
710
+ rpc. mine_blocks ( 10 ) . await . unwrap ( ) ;
698
711
699
- let height = 1 ;
712
+ let height = rpc . client . get_block_count ( ) . await . unwrap ( ) - 7 ;
700
713
let hash = rpc. client . get_block_hash ( height) . await . unwrap ( ) ;
701
714
702
715
poll_until_condition (
0 commit comments