Skip to content

Commit acf678f

Browse files
authored
Merge branch 'develop' into feat/signature-count-endpoint
2 parents 318fca2 + 529d6c5 commit acf678f

File tree

7 files changed

+997
-112
lines changed

7 files changed

+997
-112
lines changed

stackslib/src/chainstate/nakamoto/coordinator/tests.rs

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,36 @@ impl<'a> TestPeer<'a> {
538538
miner_setup: F,
539539
after_block: G,
540540
) -> NakamotoBlock
541+
where
542+
F: FnMut(&mut NakamotoBlockBuilder),
543+
G: FnMut(&mut NakamotoBlock) -> bool,
544+
{
545+
let nakamoto_tip = {
546+
let chainstate = &mut self.stacks_node.as_mut().unwrap().chainstate;
547+
let sort_db = self.sortdb.as_mut().unwrap();
548+
NakamotoChainState::get_canonical_block_header(chainstate.db(), sort_db)
549+
.unwrap()
550+
.unwrap()
551+
};
552+
self.mine_single_block_tenure_at_tip(
553+
&nakamoto_tip.index_block_hash(),
554+
sender_key,
555+
tenure_change_tx,
556+
coinbase_tx,
557+
miner_setup,
558+
after_block,
559+
)
560+
}
561+
562+
pub fn mine_single_block_tenure_at_tip<F, G>(
563+
&mut self,
564+
nakamoto_tip: &StacksBlockId,
565+
sender_key: &StacksPrivateKey,
566+
tenure_change_tx: &StacksTransaction,
567+
coinbase_tx: &StacksTransaction,
568+
miner_setup: F,
569+
after_block: G,
570+
) -> NakamotoBlock
541571
where
542572
F: FnMut(&mut NakamotoBlockBuilder),
543573
G: FnMut(&mut NakamotoBlock) -> bool,
@@ -547,6 +577,8 @@ impl<'a> TestPeer<'a> {
547577
let recipient_addr =
548578
StacksAddress::from_string("ST2YM3J4KQK09V670TD6ZZ1XYNYCNGCWCVTASN5VM").unwrap();
549579

580+
let sender_acct = self.get_account(nakamoto_tip, &sender_addr.to_account_principal());
581+
550582
// do a stx transfer in each block to a given recipient
551583
let mut blocks_and_sizes = self.make_nakamoto_tenure_and(
552584
tenure_change_tx.clone(),
@@ -555,12 +587,11 @@ impl<'a> TestPeer<'a> {
555587
miner_setup,
556588
|_miner, chainstate, sortdb, blocks_so_far| {
557589
if blocks_so_far.len() < 1 {
558-
let account = get_account(chainstate, sortdb, &sender_addr);
559590
let stx_transfer = make_token_transfer(
560591
chainstate,
561592
sortdb,
562593
&sender_key,
563-
account.nonce,
594+
sender_acct.nonce,
564595
100,
565596
1,
566597
&recipient_addr,
@@ -607,12 +638,33 @@ impl<'a> TestPeer<'a> {
607638
tenure_change.tenure_consensus_hash = consensus_hash.clone();
608639
tenure_change.burn_view_consensus_hash = consensus_hash.clone();
609640

641+
let nakamoto_tip =
642+
if let Some(nakamoto_parent_tenure) = self.nakamoto_parent_tenure_opt.as_ref() {
643+
nakamoto_parent_tenure.last().as_ref().unwrap().block_id()
644+
} else {
645+
let tip = {
646+
let chainstate = &mut self.stacks_node.as_mut().unwrap().chainstate;
647+
let sort_db = self.sortdb.as_mut().unwrap();
648+
NakamotoChainState::get_canonical_block_header(chainstate.db(), sort_db)
649+
.unwrap()
650+
.unwrap()
651+
};
652+
tip.index_block_hash()
653+
};
654+
655+
let miner_addr = self.miner.origin_address().unwrap();
656+
let miner_acct = self.get_account(&nakamoto_tip, &miner_addr.to_account_principal());
657+
610658
let tenure_change_tx = self
611659
.miner
612-
.make_nakamoto_tenure_change(tenure_change.clone());
613-
let coinbase_tx = self.miner.make_nakamoto_coinbase(None, vrf_proof);
660+
.make_nakamoto_tenure_change_with_nonce(tenure_change.clone(), miner_acct.nonce);
661+
662+
let coinbase_tx =
663+
self.miner
664+
.make_nakamoto_coinbase_with_nonce(None, vrf_proof, miner_acct.nonce + 1);
614665

615-
let block = self.mine_single_block_tenure(
666+
let block = self.mine_single_block_tenure_at_tip(
667+
&nakamoto_tip,
616668
sender_key,
617669
&tenure_change_tx,
618670
&coinbase_tx,

stackslib/src/chainstate/nakamoto/mod.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ use crate::net::Error as net_error;
110110
use crate::util_lib::boot;
111111
use crate::util_lib::boot::boot_code_id;
112112
use crate::util_lib::db::{
113-
query_int, query_row, query_row_panic, query_rows, sqlite_open, tx_begin_immediate, u64_to_sql,
114-
DBConn, Error as DBError, FromRow,
113+
query_int, query_row, query_row_columns, query_row_panic, query_rows, sqlite_open,
114+
tx_begin_immediate, u64_to_sql, DBConn, Error as DBError, FromRow,
115115
};
116116
use crate::{chainstate, monitoring};
117117

@@ -2500,6 +2500,26 @@ impl NakamotoChainState {
25002500
Ok(None)
25012501
}
25022502

2503+
/// Load the parent block ID of a Nakamoto block
2504+
pub fn get_nakamoto_parent_block_id(
2505+
chainstate_conn: &Connection,
2506+
index_block_hash: &StacksBlockId,
2507+
) -> Result<Option<StacksBlockId>, ChainstateError> {
2508+
let sql = "SELECT parent_block_id FROM nakamoto_block_headers WHERE index_block_hash = ?1";
2509+
let mut result = query_row_columns(
2510+
chainstate_conn,
2511+
sql,
2512+
&[&index_block_hash],
2513+
"parent_block_id",
2514+
)?;
2515+
if result.len() > 1 {
2516+
// even though `(consensus_hash,block_hash)` is the primary key, these are hashed to
2517+
// produce `index_block_hash`. So, `index_block_hash` is also unique w.h.p.
2518+
unreachable!("FATAL: multiple instances of index_block_hash");
2519+
}
2520+
Ok(result.pop())
2521+
}
2522+
25032523
/// Load a Nakamoto header
25042524
pub fn get_block_header_nakamoto(
25052525
chainstate_conn: &Connection,

0 commit comments

Comments
 (0)