Skip to content

Commit 435e06f

Browse files
committed
test: add commit re-submit case
1 parent ce2965f commit 435e06f

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
@@ -2843,11 +2843,10 @@ mod tests {
28432843
use stacks_common::util::hash::to_hex;
28442844
use stacks_common::util::secp256k1::Secp256k1PrivateKey;
28452845

2846+
use super::*;
28462847
use crate::tests::bitcoin_regtest::BitcoinCoreController;
28472848
use crate::Keychain;
28482849

2849-
use super::*;
2850-
28512850
#[test]
28522851
fn test_get_satoshis_per_byte() {
28532852
let dir = temp_dir();
@@ -3035,7 +3034,9 @@ mod tests {
30353034
config.burnchain.password = Some("12345".to_owned());
30363035

30373036
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3038-
btcd_controller.start_bitcoind().expect("bitcoind should be started!");
3037+
btcd_controller
3038+
.start_bitcoind()
3039+
.expect("bitcoind should be started!");
30393040

30403041
let btc_controller = BitcoinRegtestController::new(config.clone(), None);
30413042
btc_controller
@@ -3056,7 +3057,9 @@ mod tests {
30563057
config.burnchain.password = Some("12345".to_owned());
30573058

30583059
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3059-
btcd_controller.start_bitcoind().expect("bitcoind should be started!");
3060+
btcd_controller
3061+
.start_bitcoind()
3062+
.expect("bitcoind should be started!");
30603063

30613064
let btc_controller = BitcoinRegtestController::new(config.clone(), None);
30623065
btc_controller.bootstrap_chain(101);
@@ -3079,13 +3082,14 @@ mod tests {
30793082
config.burnchain.password = Some("12345".to_owned());
30803083

30813084
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3082-
btcd_controller.start_bitcoind().expect("bitcoind should be started!");
3085+
btcd_controller
3086+
.start_bitcoind()
3087+
.expect("bitcoind should be started!");
30833088

30843089
let btc_controller = BitcoinRegtestController::new(config.clone(), None);
30853090
btc_controller.bootstrap_chain(101);
30863091

3087-
let utxos =
3088-
btc_controller.get_utxos(StacksEpochId::Epoch31, &miner_pubkey, 19000, None, 0);
3092+
let utxos = btc_controller.get_utxos(StacksEpochId::Epoch31, &miner_pubkey, 19000, None, 0);
30893093

30903094
let uxto_set = utxos.expect("Shouldn't be None!");
30913095
assert_eq!(1, uxto_set.num_utxos());
@@ -3096,10 +3100,12 @@ mod tests {
30963100
}
30973101

30983102
#[test]
3099-
fn test_build_leader_block_commit_tx() {
3103+
fn test_build_leader_block_commit_tx_ok_with_new_block_commit() {
31003104
let miner_seed = vec![1, 1, 1, 1];
31013105
let keychain = Keychain::default(miner_seed.clone());
31023106
let miner_pubkey = keychain.get_pub_key();
3107+
let mut signer = keychain.generate_op_signer();
3108+
let burn_signer = keychain.get_burnchain_signer();
31033109

31043110
let mut config = Config::default();
31053111
config.burnchain.magic_bytes = "T3".as_bytes().into();
@@ -3108,22 +3114,15 @@ mod tests {
31083114
config.burnchain.password = Some("12345".to_owned());
31093115

31103116
let mut btcd_controller = BitcoinCoreController::new(config.clone());
3111-
btcd_controller.start_bitcoind().unwrap();
3117+
btcd_controller
3118+
.start_bitcoind()
3119+
.expect("bitcoind should be started!");
31123120

31133121
let mut btc_controller = BitcoinRegtestController::new(config, None);
31143122
btc_controller.bootstrap_chain(101);
3115-
3116-
btc_controller.connect_dbs().expect("Cannot initialize dbs!");
3117-
3118-
let tip = btc_controller
3119-
.get_burnchain()
3120-
.open_burnchain_db(false)
3121-
.unwrap()
3122-
.get_canonical_chain_tip();
3123-
info!("{:?}", tip);
3124-
3125-
3126-
let mut signer = keychain.generate_op_signer();
3123+
btc_controller
3124+
.connect_dbs()
3125+
.expect("Cannot initialize dbs!");
31273126

31283127
let commit_op = LeaderBlockCommitOp {
31293128
block_header_hash: BlockHeaderHash::from_hex(
@@ -3144,7 +3143,7 @@ mod tests {
31443143
input: (Txid([0x00; 32]), 0),
31453144
burn_parent_modulus: 2, // 0x5a & 0b111
31463145

3147-
apparent_sender: BurnchainSigner("mgbpit8FvkVJ9kuXY8QSM5P7eibnhcEMBk".to_string()),
3146+
apparent_sender: burn_signer,
31483147
commit_outs: vec![
31493148
PoxAddress::Standard(StacksAddress::burn_address(false), None),
31503149
PoxAddress::Standard(StacksAddress::burn_address(false), None),
@@ -3155,7 +3154,7 @@ mod tests {
31553154

31563155
txid: Txid([0x00; 32]),
31573156
vtxindex: 0,
3158-
block_height: 2212, //FDF
3157+
block_height: 2212,
31593158
burn_header_hash: BurnchainHeaderHash([0x01; 32]),
31603159
};
31613160

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

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)