Skip to content

Commit ced4577

Browse files
committed
Merge branch 'fix/5230' of https://github.com/stacks-network/stacks-blockchain into fix/5230
2 parents ed09847 + 197e8a0 commit ced4577

File tree

2 files changed

+167
-5
lines changed

2 files changed

+167
-5
lines changed

.github/workflows/bitcoin-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ jobs:
114114
- tests::signer::v0::partial_tenure_fork
115115
- tests::signer::v0::mine_2_nakamoto_reward_cycles
116116
- tests::signer::v0::signer_set_rollover
117-
- tests::nakamoto_integrations::stack_stx_burn_op_integration_test
117+
- tests::nakamoto_integrations::burn_ops_integration_test
118118
- tests::nakamoto_integrations::check_block_heights
119119
- tests::nakamoto_integrations::clarity_burn_state
120120
- tests::nakamoto_integrations::check_block_times

testnet/stacks-node/src/tests/nakamoto_integrations.rs

Lines changed: 166 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ use rand::RngCore;
3434
use stacks::burnchains::{MagicBytes, Txid};
3535
use stacks::chainstate::burn::db::sortdb::SortitionDB;
3636
use stacks::chainstate::burn::operations::{
37-
BlockstackOperationType, PreStxOp, StackStxOp, VoteForAggregateKeyOp,
37+
BlockstackOperationType, DelegateStxOp, PreStxOp, StackStxOp, TransferStxOp,
38+
VoteForAggregateKeyOp,
3839
};
3940
use stacks::chainstate::coordinator::comm::CoordinatorChannels;
4041
use stacks::chainstate::coordinator::OnChainRewardSetProvider;
@@ -4012,7 +4013,17 @@ fn follower_bootup_across_multiple_cycles() {
40124013

40134014
#[test]
40144015
#[ignore]
4015-
fn stack_stx_burn_op_integration_test() {
4016+
/// Test out various burn operations being processed in Nakamoto.
4017+
///
4018+
/// There are 4 burn ops submitted:
4019+
///
4020+
/// - stx-transfer
4021+
/// - delegate-stx
4022+
/// - stack-stx
4023+
///
4024+
/// Additionally, a stack-stx without a signer key is submitted, which should
4025+
/// not be processed in Nakamoto.
4026+
fn burn_ops_integration_test() {
40164027
if env::var("BITCOIND_TEST") != Ok("1".into()) {
40174028
return;
40184029
}
@@ -4027,10 +4038,26 @@ fn stack_stx_burn_op_integration_test() {
40274038
let signer_sk_2 = Secp256k1PrivateKey::new();
40284039
let signer_addr_2 = tests::to_addr(&signer_sk_2);
40294040

4041+
let stacker_sk_1 = Secp256k1PrivateKey::new();
4042+
let stacker_addr_1 = tests::to_addr(&stacker_sk_1);
4043+
4044+
let stacker_sk_2 = Secp256k1PrivateKey::new();
4045+
let stacker_addr_2 = tests::to_addr(&stacker_sk_2);
4046+
40304047
let mut signers = TestSigners::new(vec![signer_sk_1.clone()]);
40314048

40324049
let stacker_sk = setup_stacker(&mut naka_conf);
40334050

4051+
// Add the initial balances to the other accounts
4052+
naka_conf.add_initial_balance(
4053+
PrincipalData::from(stacker_addr_1.clone()).to_string(),
4054+
1000000,
4055+
);
4056+
naka_conf.add_initial_balance(
4057+
PrincipalData::from(stacker_addr_2.clone()).to_string(),
4058+
1000000,
4059+
);
4060+
40344061
test_observer::spawn();
40354062
let observer_port = test_observer::EVENT_OBSERVER_PORT;
40364063
naka_conf.events_observers.insert(EventObserverConfig {
@@ -4135,7 +4162,49 @@ fn stack_stx_burn_op_integration_test() {
41354162
.is_ok(),
41364163
"Pre-stx operation should submit successfully"
41374164
);
4138-
info!("Submitted 2 pre-stx ops at block {block_height}, mining a few blocks...");
4165+
4166+
let mut miner_signer_3 = Keychain::default(naka_conf.node.seed.clone()).generate_op_signer();
4167+
info!("Submitting third pre-stx op");
4168+
let pre_stx_op_3 = PreStxOp {
4169+
output: stacker_addr_1.clone(),
4170+
txid: Txid([0u8; 32]),
4171+
vtxindex: 0,
4172+
block_height: 0,
4173+
burn_header_hash: BurnchainHeaderHash([0u8; 32]),
4174+
};
4175+
assert!(
4176+
btc_regtest_controller
4177+
.submit_operation(
4178+
StacksEpochId::Epoch30,
4179+
BlockstackOperationType::PreStx(pre_stx_op_3),
4180+
&mut miner_signer_3,
4181+
1
4182+
)
4183+
.is_ok(),
4184+
"Pre-stx operation should submit successfully"
4185+
);
4186+
4187+
info!("Submitting fourth pre-stx op");
4188+
let mut miner_signer_4 = Keychain::default(naka_conf.node.seed.clone()).generate_op_signer();
4189+
let pre_stx_op_4 = PreStxOp {
4190+
output: stacker_addr_2.clone(),
4191+
txid: Txid([0u8; 32]),
4192+
vtxindex: 0,
4193+
block_height: 0,
4194+
burn_header_hash: BurnchainHeaderHash([0u8; 32]),
4195+
};
4196+
assert!(
4197+
btc_regtest_controller
4198+
.submit_operation(
4199+
StacksEpochId::Epoch30,
4200+
BlockstackOperationType::PreStx(pre_stx_op_4),
4201+
&mut miner_signer_4,
4202+
1
4203+
)
4204+
.is_ok(),
4205+
"Pre-stx operation should submit successfully"
4206+
);
4207+
info!("Submitted 4 pre-stx ops at block {block_height}, mining a few blocks...");
41394208

41404209
// Mine until the next prepare phase
41414210
let block_height = btc_regtest_controller.get_headers_height();
@@ -4216,6 +4285,8 @@ fn stack_stx_burn_op_integration_test() {
42164285

42174286
let mut signer_burnop_signer_1 = BurnchainOpSigner::new(signer_sk_1.clone(), false);
42184287
let mut signer_burnop_signer_2 = BurnchainOpSigner::new(signer_sk_2.clone(), false);
4288+
let mut stacker_burnop_signer_1 = BurnchainOpSigner::new(stacker_sk_1.clone(), false);
4289+
let mut stacker_burnop_signer_2 = BurnchainOpSigner::new(stacker_sk_2.clone(), false);
42194290

42204291
info!(
42214292
"Before stack-stx op, signer 1 total: {}",
@@ -4247,6 +4318,55 @@ fn stack_stx_burn_op_integration_test() {
42474318
info!("Signer 1 addr: {}", signer_addr_1.to_b58());
42484319
info!("Signer 2 addr: {}", signer_addr_2.to_b58());
42494320

4321+
info!("Submitting transfer STX op");
4322+
let transfer_stx_op = TransferStxOp {
4323+
sender: stacker_addr_1.clone(),
4324+
recipient: stacker_addr_2.clone(),
4325+
transfered_ustx: 10000,
4326+
memo: vec![],
4327+
txid: Txid([0u8; 32]),
4328+
vtxindex: 0,
4329+
block_height: 0,
4330+
burn_header_hash: BurnchainHeaderHash([0u8; 32]),
4331+
};
4332+
assert!(
4333+
btc_regtest_controller
4334+
.submit_operation(
4335+
StacksEpochId::Epoch30,
4336+
BlockstackOperationType::TransferStx(transfer_stx_op),
4337+
&mut stacker_burnop_signer_1,
4338+
1
4339+
)
4340+
.is_ok(),
4341+
"Transfer STX operation should submit successfully"
4342+
);
4343+
4344+
info!("Submitting delegate STX op");
4345+
let del_stx_op = DelegateStxOp {
4346+
sender: stacker_addr_2.clone(),
4347+
delegate_to: stacker_addr_1.clone(),
4348+
reward_addr: None,
4349+
delegated_ustx: 100_000,
4350+
// to be filled in
4351+
txid: Txid([0u8; 32]),
4352+
vtxindex: 0,
4353+
block_height: 0,
4354+
burn_header_hash: BurnchainHeaderHash([0u8; 32]),
4355+
until_burn_height: None,
4356+
};
4357+
4358+
assert!(
4359+
btc_regtest_controller
4360+
.submit_operation(
4361+
StacksEpochId::Epoch30,
4362+
BlockstackOperationType::DelegateStx(del_stx_op),
4363+
&mut stacker_burnop_signer_2,
4364+
1
4365+
)
4366+
.is_ok(),
4367+
"Delegate STX operation should submit successfully"
4368+
);
4369+
42504370
let pox_info = get_pox_info(&http_origin).unwrap();
42514371
let min_stx = pox_info.next_cycle.min_threshold_ustx;
42524372

@@ -4318,6 +4438,8 @@ fn stack_stx_burn_op_integration_test() {
43184438
}
43194439

43204440
let mut stack_stx_found = false;
4441+
let mut transfer_stx_found = false;
4442+
let mut delegate_stx_found = false;
43214443
let mut stack_stx_burn_op_tx_count = 0;
43224444
let blocks = test_observer::get_blocks();
43234445
info!("stack event observer num blocks: {:?}", blocks.len());
@@ -4332,6 +4454,45 @@ fn stack_stx_burn_op_integration_test() {
43324454
if raw_tx == "0x00" {
43334455
info!("Found a burn op: {:?}", tx);
43344456
let burnchain_op = tx.get("burnchain_op").unwrap().as_object().unwrap();
4457+
if burnchain_op.contains_key("transfer_stx") {
4458+
let transfer_stx_obj = burnchain_op.get("transfer_stx").unwrap();
4459+
let sender_obj = transfer_stx_obj.get("sender").unwrap();
4460+
let sender = sender_obj.get("address").unwrap().as_str().unwrap();
4461+
let recipient_obj = transfer_stx_obj.get("recipient").unwrap();
4462+
let recipient = recipient_obj.get("address").unwrap().as_str().unwrap();
4463+
let transfered_ustx = transfer_stx_obj
4464+
.get("transfered_ustx")
4465+
.unwrap()
4466+
.as_u64()
4467+
.unwrap();
4468+
assert_eq!(sender, stacker_addr_1.to_string());
4469+
assert_eq!(recipient, stacker_addr_2.to_string());
4470+
assert_eq!(transfered_ustx, 10000);
4471+
info!(
4472+
"Transfer STX op: sender: {}, recipient: {}, transfered_ustx: {}",
4473+
sender, recipient, transfered_ustx
4474+
);
4475+
transfer_stx_found = true;
4476+
continue;
4477+
}
4478+
if burnchain_op.contains_key("delegate_stx") {
4479+
info!("Got delegate STX op: {:?}", burnchain_op);
4480+
let delegate_stx_obj = burnchain_op.get("delegate_stx").unwrap();
4481+
let sender_obj = delegate_stx_obj.get("sender").unwrap();
4482+
let sender = sender_obj.get("address").unwrap().as_str().unwrap();
4483+
let delegate_to_obj = delegate_stx_obj.get("delegate_to").unwrap();
4484+
let delegate_to = delegate_to_obj.get("address").unwrap().as_str().unwrap();
4485+
let delegated_ustx = delegate_stx_obj
4486+
.get("delegated_ustx")
4487+
.unwrap()
4488+
.as_u64()
4489+
.unwrap();
4490+
assert_eq!(sender, stacker_addr_2.to_string());
4491+
assert_eq!(delegate_to, stacker_addr_1.to_string());
4492+
assert_eq!(delegated_ustx, 100_000);
4493+
delegate_stx_found = true;
4494+
continue;
4495+
}
43354496
if !burnchain_op.contains_key("stack_stx") {
43364497
warn!("Got unexpected burnchain op: {:?}", burnchain_op);
43374498
panic!("unexpected btc transaction type");
@@ -4378,7 +4539,8 @@ fn stack_stx_burn_op_integration_test() {
43784539
stack_stx_burn_op_tx_count, 1,
43794540
"Stack-stx tx without a signer_key shouldn't have been submitted"
43804541
);
4381-
4542+
assert!(transfer_stx_found, "Expected transfer STX op");
4543+
assert!(delegate_stx_found, "Expected delegate STX op");
43824544
let sortdb = btc_regtest_controller.sortdb_mut();
43834545
let sortdb_conn = sortdb.conn();
43844546
let tip = SortitionDB::get_canonical_burn_chain_tip(sortdb_conn).unwrap();

0 commit comments

Comments
 (0)