@@ -31,6 +31,7 @@ use stacks_common::types::chainstate::{BlockHeaderHash, BurnchainHeaderHash, Sta
31
31
use stacks_common:: types:: sqlite:: NO_PARAMS ;
32
32
use stacks_common:: util:: get_epoch_time_ms;
33
33
use stacks_common:: util:: hash:: Hash160 ;
34
+ use stacks_common:: util:: secp256k1:: Secp256k1PublicKey ;
34
35
use stacks_common:: util:: vrf:: VRFProof ;
35
36
36
37
use crate :: burnchains:: db:: BurnchainDB ;
@@ -462,8 +463,7 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
462
463
let try_mine_opts = drain_try_mine_opts ( & mut argv, 1 ) ;
463
464
464
465
let print_help_and_exit = || {
465
- let n = & argv[ 0 ] ;
466
- eprintln ! ( "Usage: {n} [options...] <data-dir>" ) ;
466
+ eprintln ! ( "Usage: {n} [options...] <data-dir>" , n = & argv[ 0 ] ) ;
467
467
eprintln ! ( "" ) ;
468
468
eprintln ! ( "Options:" ) ;
469
469
eprintln ! ( " --min-fee <u64>: Minimum fee for miner to include transaction" ) ;
@@ -485,7 +485,7 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
485
485
let min_fee = try_mine_opts. min_fee . unwrap_or ( 0 ) ;
486
486
let max_time = try_mine_opts. max_time . unwrap_or ( u64:: MAX ) ;
487
487
let _max_blocks = try_mine_opts. max_blocks . unwrap_or ( 1 ) ;
488
- let _reset_tenure = try_mine_opts. reset_tenure . unwrap_or ( false ) ;
488
+ let reset_tenure = try_mine_opts. reset_tenure . unwrap_or ( false ) ;
489
489
490
490
let start = Instant :: now ( ) ;
491
491
@@ -525,17 +525,24 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
525
525
NakamotoChainState :: get_canonical_block_header ( chainstate. db ( ) , & sort_db)
526
526
. unwrap_or_else ( |e| panic ! ( "Error looking up chain tip: {e}" ) )
527
527
. expect ( "No chain tip found" ) ;
528
+ let parent_consensus_hash = parent_stacks_header. consensus_hash ;
529
+ let parent_block_id = parent_stacks_header. index_block_hash ( ) ;
528
530
529
531
let burn_dbconn = sort_db. index_handle ( & chain_tip. sortition_id ) ;
530
532
531
533
let mut settings = BlockBuilderSettings :: limited ( ) ;
532
534
settings. max_miner_time_ms = max_time;
533
535
536
+ // In case we need to submit transactions
537
+ let miner_privk = StacksPrivateKey :: new ( ) ;
538
+ let miner_pubkey = Secp256k1PublicKey :: from_private ( & miner_privk) ;
539
+ let miner_pubkey_hash = Hash160 :: from_node_public_key ( & miner_pubkey) ;
540
+ let miner_nonce = 0 ;
541
+
534
542
let result = match & parent_stacks_header. anchored_header {
535
543
StacksBlockHeaderTypes :: Epoch2 ( ..) => {
536
- let sk = StacksPrivateKey :: new ( ) ;
537
- let mut tx_auth = TransactionAuth :: from_p2pkh ( & sk) . unwrap ( ) ;
538
- tx_auth. set_origin_nonce ( 0 ) ;
544
+ let mut tx_auth = TransactionAuth :: from_p2pkh ( & miner_privk) . unwrap ( ) ;
545
+ tx_auth. set_origin_nonce ( miner_nonce) ;
539
546
540
547
let mut coinbase_tx = StacksTransaction :: new (
541
548
TransactionVersion :: Mainnet ,
@@ -546,7 +553,7 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
546
553
coinbase_tx. chain_id = conf. burnchain . chain_id ;
547
554
coinbase_tx. anchor_mode = TransactionAnchorMode :: OnChainOnly ;
548
555
let mut tx_signer = StacksTransactionSigner :: new ( & coinbase_tx) ;
549
- tx_signer. sign_origin ( & sk ) . unwrap ( ) ;
556
+ tx_signer. sign_origin ( & miner_privk ) . unwrap ( ) ;
550
557
let coinbase_tx = tx_signer. get_tx ( ) . unwrap ( ) ;
551
558
552
559
StacksBlockBuilder :: build_anchored_block (
@@ -570,6 +577,49 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
570
577
. map ( |( block, cost, size) | ( block. block_hash ( ) , block. txs , cost, size) )
571
578
}
572
579
StacksBlockHeaderTypes :: Nakamoto ( ..) => {
580
+ let tenure_info = if reset_tenure {
581
+ let num_blocks_so_far = NakamotoChainState :: get_nakamoto_tenure_length (
582
+ chainstate. db ( ) ,
583
+ & parent_block_id,
584
+ )
585
+ . unwrap_or_else ( |e| panic ! ( "Error getting tenure length: {e}" ) ) ;
586
+ let payload = TenureChangePayload {
587
+ tenure_consensus_hash : parent_consensus_hash,
588
+ prev_tenure_consensus_hash : parent_consensus_hash,
589
+ burn_view_consensus_hash : parent_consensus_hash,
590
+ previous_tenure_end : parent_block_id,
591
+ previous_tenure_blocks : num_blocks_so_far,
592
+ cause : TenureChangeCause :: Extended ,
593
+ pubkey_hash : miner_pubkey_hash,
594
+ } ;
595
+ let tenure_change_tx_payload = TransactionPayload :: TenureChange ( payload) ;
596
+
597
+ let mut tx_auth = TransactionAuth :: from_p2pkh ( & miner_privk) . unwrap ( ) ;
598
+ tx_auth. set_origin_nonce ( miner_nonce) ;
599
+
600
+ let version = if conf. is_mainnet ( ) {
601
+ TransactionVersion :: Mainnet
602
+ } else {
603
+ TransactionVersion :: Testnet
604
+ } ;
605
+
606
+ let mut tx = StacksTransaction :: new ( version, tx_auth, tenure_change_tx_payload) ;
607
+
608
+ tx. chain_id = conf. burnchain . chain_id ;
609
+ tx. anchor_mode = TransactionAnchorMode :: OnChainOnly ;
610
+ let mut tx_signer = StacksTransactionSigner :: new ( & tx) ;
611
+ tx_signer
612
+ . sign_origin ( & miner_privk)
613
+ . unwrap_or_else ( |e| panic ! ( "Failed to sign transaction: {e}" ) ) ;
614
+
615
+ let tenure_change_tx = Some ( tx_signer. get_tx ( ) . expect ( "Failed to get tx" ) ) ;
616
+ NakamotoTenureInfo {
617
+ coinbase_tx : None ,
618
+ tenure_change_tx,
619
+ }
620
+ } else {
621
+ NakamotoTenureInfo :: default ( )
622
+ } ;
573
623
NakamotoBlockBuilder :: build_nakamoto_block (
574
624
& chainstate,
575
625
& burn_dbconn,
@@ -579,7 +629,7 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
579
629
& parent_stacks_header. consensus_hash ,
580
630
// the burn so far on the burnchain (i.e. from the last burnchain block)
581
631
chain_tip. total_burn ,
582
- NakamotoTenureInfo :: default ( ) ,
632
+ tenure_info ,
583
633
settings,
584
634
None ,
585
635
0 ,
@@ -590,10 +640,8 @@ pub fn command_try_mine(mut argv: Vec<String>, opts: &StacksInspectOpts) {
590
640
591
641
let elapsed = start. elapsed ( ) ;
592
642
let summary = format ! (
593
- "block @ height = {h} off of {pid } ({pch }/{pbh}) in {t}ms. Min-fee: {min_fee}, Max-time: {max_time}" ,
643
+ "block @ height = {h} off of {parent_block_id } ({parent_consensus_hash }/{pbh}) in {t}ms. Min-fee: {min_fee}, Max-time: {max_time}" ,
594
644
h=parent_stacks_header. stacks_block_height + 1 ,
595
- pid=& parent_stacks_header. index_block_hash( ) ,
596
- pch=& parent_stacks_header. consensus_hash,
597
645
pbh=& parent_stacks_header. anchored_header. block_hash( ) ,
598
646
t=elapsed. as_millis( ) ,
599
647
) ;
0 commit comments