Skip to content

Commit b0a743e

Browse files
committed
test: Add check_for_new_blocks_and_prove test.
1 parent 94094e3 commit b0a743e

File tree

2 files changed

+99
-58
lines changed

2 files changed

+99
-58
lines changed

core/src/database/header_chain_prover.rs

+30-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl Database {
5151
FROM header_chain_proofs h1
5252
JOIN header_chain_proofs h2 ON h1.prev_block_hash = h2.block_hash
5353
WHERE h2.proof IS NOT NULL
54-
ORDER BY h1.height
54+
ORDER BY h1.height DESC
5555
LIMIT 1;",
5656
);
5757

@@ -279,9 +279,37 @@ mod tests {
279279
.await
280280
.unwrap();
281281

282-
// This time, `get_non_proven_block` should return second block's details.
282+
// This time, `get_non_proven_block` should return third block's details.
283283
let res = db.get_non_proven_block(None).await.unwrap();
284284
assert_eq!(res.0, block_hash2);
285285
assert_eq!(res.2 as u64, height2);
286+
287+
// Save fourth block without a proof.
288+
let block = block::Block {
289+
header: Header {
290+
version: Version::TWO,
291+
prev_blockhash: block_hash1,
292+
merkle_root: TxMerkleNode::all_zeros(),
293+
time: 0x1F,
294+
bits: CompactTarget::default(),
295+
nonce: 0x45 + 4,
296+
},
297+
txdata: vec![],
298+
};
299+
let block_hash3 = block.block_hash();
300+
let height3 = base_height + 3;
301+
db.set_new_block(None, block_hash3, block.header, height3)
302+
.await
303+
.unwrap();
304+
305+
// Set third block's proof.
306+
db.set_block_proof(None, block_hash2, receipt.clone())
307+
.await
308+
.unwrap();
309+
310+
// This time, `get_non_proven_block` should return fourth block's details.
311+
let res = db.get_non_proven_block(None).await.unwrap();
312+
assert_eq!(res.0, block_hash3);
313+
assert_eq!(res.2 as u64, height3);
286314
}
287315
}

core/src/header_chain_prover.rs

+69-56
Original file line numberDiff line numberDiff line change
@@ -382,10 +382,6 @@ mod tests {
382382
use crate::task::IntoTask;
383383
use crate::test::common::*;
384384
use crate::verifier::VerifierServer;
385-
use bitcoin::{
386-
block::{Header, Version},
387-
CompactTarget, TxMerkleNode,
388-
};
389385
use bitcoin::{hashes::Hash, BlockHash};
390386
use bitcoincore_rpc::RpcApi;
391387
use borsh::BorshDeserialize;
@@ -430,8 +426,11 @@ mod tests {
430426
}
431427
}
432428

429+
/// Mines `block_num` amount of blocks (if not already mined) and returns
430+
/// the first `block_num` block headers in blockchain.
433431
async fn mine_and_get_first_n_block_headers(
434432
rpc: ExtendedRpc,
433+
db: Database,
435434
block_num: u64,
436435
) -> Vec<CircuitBlockHeader> {
437436
let height = rpc.client.get_block_count().await.unwrap();
@@ -445,6 +444,8 @@ mod tests {
445444
let header = rpc.client.get_block_header(&hash).await.unwrap();
446445

447446
headers.push(CircuitBlockHeader::from(header));
447+
448+
let _ignore_errors = db.set_new_block(None, hash, header, i).await;
448449
}
449450

450451
headers
@@ -561,7 +562,7 @@ mod tests {
561562
// Prove genesis block and get it's receipt.
562563
let receipt = prover.prove_block_headers(None, vec![]).unwrap();
563564

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;
565566
let receipt = prover
566567
.prove_block_headers(Some(receipt), block_headers[0..2].to_vec())
567568
.unwrap();
@@ -574,66 +575,76 @@ mod tests {
574575

575576
#[tokio::test]
576577
#[serial_test::serial]
577-
async fn save_and_get_proof() {
578+
async fn check_for_new_blocks_and_prove() {
578579
let mut config = create_test_config_with_thread_name().await;
579580
let regtest = create_regtest_rpc(&mut config).await;
580581
let rpc = regtest.rpc().clone();
581-
let prover = HeaderChainProver::new(&config, rpc.clone_inner().await.unwrap())
582-
.await
583-
.unwrap();
584582
let db = Database::new(&config).await.unwrap();
585583

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();
588587

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;
603592

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)
625598
.await
599+
.unwrap()
626600
.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);
627609

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+
}
637648
}
638649

639650
#[tokio::test]
@@ -683,6 +694,7 @@ mod tests {
683694

684695
// Save initial blocks, because VerifierServer won't.
685696
let count = rpc.client.get_block_count().await.unwrap();
697+
tracing::info!("Block count: {}", count);
686698
for i in 1..count {
687699
let hash = rpc.client.get_block_hash(i).await.unwrap();
688700
let block = rpc.client.get_block(&hash).await.unwrap();
@@ -695,8 +707,9 @@ mod tests {
695707
let verifier = VerifierServer::<MockCitreaClient>::new(config)
696708
.await
697709
.unwrap();
710+
rpc.mine_blocks(10).await.unwrap();
698711

699-
let height = 1;
712+
let height = rpc.client.get_block_count().await.unwrap() - 7;
700713
let hash = rpc.client.get_block_hash(height).await.unwrap();
701714

702715
poll_until_condition(

0 commit comments

Comments
 (0)