Skip to content

Commit 5236315

Browse files
committed
test: add commit re-submit case
1 parent 301de11 commit 5236315

File tree

2 files changed

+116
-23
lines changed

2 files changed

+116
-23
lines changed

testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs

Lines changed: 99 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2832,11 +2832,10 @@ mod tests {
28322832
use stacks_common::util::hash::to_hex;
28332833
use stacks_common::util::secp256k1::Secp256k1PrivateKey;
28342834

2835+
use super::*;
28352836
use crate::tests::bitcoin_regtest::BitcoinCoreController;
28362837
use crate::Keychain;
28372838

2838-
use super::*;
2839-
28402839
#[test]
28412840
fn test_get_satoshis_per_byte() {
28422841
let dir = temp_dir();
@@ -3024,7 +3023,9 @@ mod tests {
30243023
config.burnchain.password = Some("12345".to_owned());
30253024

30263025
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3027-
btcd_controller.start_bitcoind().expect("bitcoind should be started!");
3026+
btcd_controller
3027+
.start_bitcoind()
3028+
.expect("bitcoind should be started!");
30283029

30293030
let btc_controller = BitcoinRegtestController::new(config.clone(), None);
30303031
btc_controller
@@ -3045,7 +3046,9 @@ mod tests {
30453046
config.burnchain.password = Some("12345".to_owned());
30463047

30473048
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3048-
btcd_controller.start_bitcoind().expect("bitcoind should be started!");
3049+
btcd_controller
3050+
.start_bitcoind()
3051+
.expect("bitcoind should be started!");
30493052

30503053
let btc_controller = BitcoinRegtestController::new(config.clone(), None);
30513054
btc_controller.bootstrap_chain(101);
@@ -3068,13 +3071,14 @@ mod tests {
30683071
config.burnchain.password = Some("12345".to_owned());
30693072

30703073
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3071-
btcd_controller.start_bitcoind().expect("bitcoind should be started!");
3074+
btcd_controller
3075+
.start_bitcoind()
3076+
.expect("bitcoind should be started!");
30723077

30733078
let btc_controller = BitcoinRegtestController::new(config.clone(), None);
30743079
btc_controller.bootstrap_chain(101);
30753080

3076-
let utxos =
3077-
btc_controller.get_utxos(StacksEpochId::Epoch31, &miner_pubkey, 19000, None, 0);
3081+
let utxos = btc_controller.get_utxos(StacksEpochId::Epoch31, &miner_pubkey, 19000, None, 0);
30783082

30793083
let uxto_set = utxos.expect("Shouldn't be None!");
30803084
assert_eq!(1, uxto_set.num_utxos());
@@ -3085,10 +3089,12 @@ mod tests {
30853089
}
30863090

30873091
#[test]
3088-
fn test_build_leader_block_commit_tx() {
3092+
fn test_build_leader_block_commit_tx_ok_with_new_block_commit() {
30893093
let miner_seed = vec![1, 1, 1, 1];
30903094
let keychain = Keychain::default(miner_seed.clone());
30913095
let miner_pubkey = keychain.get_pub_key();
3096+
let mut signer = keychain.generate_op_signer();
3097+
let burn_signer = keychain.get_burnchain_signer();
30923098

30933099
let mut config = Config::default();
30943100
config.burnchain.magic_bytes = "T3".as_bytes().into();
@@ -3097,22 +3103,15 @@ mod tests {
30973103
config.burnchain.password = Some("12345".to_owned());
30983104

30993105
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3100-
btcd_controller.start_bitcoind().unwrap();
3106+
btcd_controller
3107+
.start_bitcoind()
3108+
.expect("bitcoind should be started!");
31013109

31023110
let mut btc_controller = BitcoinRegtestController::new(config, None);
31033111
btc_controller.bootstrap_chain(101);
3104-
3105-
btc_controller.connect_dbs().expect("Cannot initialize dbs!");
3106-
3107-
let tip = btc_controller
3108-
.get_burnchain()
3109-
.open_burnchain_db(false)
3110-
.unwrap()
3111-
.get_canonical_chain_tip();
3112-
info!("{:?}", tip);
3113-
3114-
3115-
let mut signer = keychain.generate_op_signer();
3112+
btc_controller
3113+
.connect_dbs()
3114+
.expect("Cannot initialize dbs!");
31163115

31173116
let commit_op = LeaderBlockCommitOp {
31183117
block_header_hash: BlockHeaderHash::from_hex(
@@ -3133,7 +3132,7 @@ mod tests {
31333132
input: (Txid([0x00; 32]), 0),
31343133
burn_parent_modulus: 2, // 0x5a & 0b111
31353134

3136-
apparent_sender: BurnchainSigner("mgbpit8FvkVJ9kuXY8QSM5P7eibnhcEMBk".to_string()),
3135+
apparent_sender: burn_signer,
31373136
commit_outs: vec![
31383137
PoxAddress::Standard(StacksAddress::burn_address(false), None),
31393138
PoxAddress::Standard(StacksAddress::burn_address(false), None),
@@ -3144,7 +3143,7 @@ mod tests {
31443143

31453144
txid: Txid([0x00; 32]),
31463145
vtxindex: 0,
3147-
block_height: 2212, //FDF
3146+
block_height: 2212,
31483147
burn_header_hash: BurnchainHeaderHash([0x01; 32]),
31493148
};
31503149

@@ -3157,4 +3156,81 @@ mod tests {
31573156
assert_eq!(1, tx.input.len());
31583157
assert_eq!(4, tx.output.len());
31593158
}
3159+
3160+
#[test]
3161+
fn test_build_leader_block_commit_tx_fails_resubmitting_same_block_commit() {
3162+
let miner_seed = vec![1, 1, 1, 1];
3163+
let keychain = Keychain::default(miner_seed.clone());
3164+
let miner_pubkey = keychain.get_pub_key();
3165+
let mut signer = keychain.generate_op_signer();
3166+
let burn_signer = keychain.get_burnchain_signer();
3167+
3168+
let mut config = Config::default();
3169+
config.burnchain.magic_bytes = "T3".as_bytes().into();
3170+
config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex());
3171+
config.burnchain.username = Some("user".to_owned());
3172+
config.burnchain.password = Some("12345".to_owned());
3173+
3174+
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3175+
btcd_controller
3176+
.start_bitcoind()
3177+
.expect("bitcoind should be started!");
3178+
3179+
let mut btc_controller = BitcoinRegtestController::new(config, None);
3180+
btc_controller.bootstrap_chain(101);
3181+
btc_controller
3182+
.connect_dbs()
3183+
.expect("Cannot initialize dbs!");
3184+
3185+
let commit_op = LeaderBlockCommitOp {
3186+
block_header_hash: BlockHeaderHash::from_hex(
3187+
"e88c3d30cb59a142f83de3b27f897a43bbb0f13316911bb98a3229973dae32af",
3188+
)
3189+
.unwrap(),
3190+
new_seed: VRFSeed::from_hex(
3191+
"d5b9f21bc1f40f24e2c101ecd13c55b8619e5e03dad81de2c62a1cc1d8c1b375",
3192+
)
3193+
.unwrap(),
3194+
parent_block_ptr: 2211, // 0x000008a3
3195+
parent_vtxindex: 1, // 0x0001
3196+
key_block_ptr: 1432, // 0x00000598
3197+
key_vtxindex: 1, // 0x0001
3198+
memo: vec![11], // 0x5a >> 3
3199+
3200+
burn_fee: 0,
3201+
input: (Txid([0x00; 32]), 0),
3202+
burn_parent_modulus: 2, // 0x5a & 0b111
3203+
3204+
apparent_sender: burn_signer,
3205+
commit_outs: vec![
3206+
PoxAddress::Standard(StacksAddress::burn_address(false), None),
3207+
PoxAddress::Standard(StacksAddress::burn_address(false), None),
3208+
],
3209+
3210+
treatment: vec![],
3211+
sunset_burn: 0,
3212+
3213+
txid: Txid([0x00; 32]),
3214+
vtxindex: 0,
3215+
block_height: 2212,
3216+
burn_header_hash: BurnchainHeaderHash([0x01; 32]),
3217+
};
3218+
3219+
let _first_tx_ok = btc_controller
3220+
.build_leader_block_commit_tx(StacksEpochId::Epoch31, commit_op.clone(), &mut signer, 0)
3221+
.expect("Build leader block commit should work");
3222+
3223+
let resubmit = btc_controller.build_leader_block_commit_tx(
3224+
StacksEpochId::Epoch31,
3225+
commit_op,
3226+
&mut signer,
3227+
0,
3228+
);
3229+
3230+
assert!(resubmit.is_err());
3231+
assert_eq!(
3232+
BurnchainControllerError::IdenticalOperation,
3233+
resubmit.unwrap_err()
3234+
);
3235+
}
31603236
}

testnet/stacks-node/src/burnchains/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,23 @@ pub enum Error {
3535
SerializerError(CodecError),
3636
}
3737

38+
impl PartialEq for Error {
39+
fn eq(&self, other: &Self) -> bool {
40+
use Error::*;
41+
match (self, other) {
42+
(CoordinatorClosed, CoordinatorClosed)
43+
| (IndexerError(_), IndexerError(_))
44+
| (BurnchainError, BurnchainError)
45+
| (MaxFeeRateExceeded, MaxFeeRateExceeded)
46+
| (IdenticalOperation, IdenticalOperation)
47+
| (NoUTXOs, NoUTXOs)
48+
| (TransactionSubmissionFailed(_), TransactionSubmissionFailed(_))
49+
| (SerializerError(_), SerializerError(_)) => true,
50+
_ => false,
51+
}
52+
}
53+
}
54+
3855
pub trait BurnchainController {
3956
fn start(&mut self, target_block_height_opt: Option<u64>)
4057
-> Result<(BurnchainTip, u64), Error>;

0 commit comments

Comments
 (0)