Skip to content

Conversation

@evanlinjin
Copy link
Member

@evanlinjin evanlinjin commented Jan 24, 2026

Description

Add mine_block to bdk_testenv::Env with custom timestamp and coinbase address. This allows us to test timelocked transactions.

Changelog notice

Added
- `mine_block` method to `bdk_testenv::Env` with custom `MineParams`. Blocks can be mined with no transactions, contain custom timestamp and custom coinbase address.
- `min_time_for_next_block` and `get_block_template` helper methods.

Checklists

All Submissions:

New Features:

  • I've added tests for the new feature
  • I've added docs for the new feature

@evanlinjin evanlinjin force-pushed the feature/testenv-mine-with-timestamp branch 2 times, most recently from 46db014 to b91363e Compare January 24, 2026 12:49
@oleonardolima
Copy link
Collaborator

@evanlinjin I'd suggest you start working on this on top of #1826, as we're migrating to corepc library/API.

@evanlinjin evanlinjin force-pushed the feature/testenv-mine-with-timestamp branch from b91363e to 70bca59 Compare January 24, 2026 13:30
@evanlinjin evanlinjin self-assigned this Jan 25, 2026
@evanlinjin evanlinjin force-pushed the feature/testenv-mine-with-timestamp branch from 70bca59 to 8a31d1f Compare January 25, 2026 09:48
@evanlinjin
Copy link
Member Author

@evanlinjin I'd suggest you start working on this on top of #1826, as we're migrating to corepc library/API.

Good point. I'll do so once that PR is merged. I would like to test this against bdk-tx right now and that's using the old bdk_testenv (for testing MTP).

@evanlinjin evanlinjin force-pushed the feature/testenv-mine-with-timestamp branch 5 times, most recently from f776d50 to 9d7f859 Compare January 28, 2026 14:57
@evanlinjin evanlinjin marked this pull request as ready for review January 28, 2026 14:58
@oleonardolima oleonardolima self-requested a review January 31, 2026 02:50
@oleonardolima oleonardolima moved this to Needs Review in BDK Chain Jan 31, 2026
@oleonardolima oleonardolima added this to the Chain 0.24.0 milestone Jan 31, 2026
Copy link
Collaborator

@oleonardolima oleonardolima left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utACK 9d7f859

Overall looks good. I left a few comments that might help with removing some decoding done here, didn't tried the changes yet though.

@evanlinjin evanlinjin force-pushed the feature/testenv-mine-with-timestamp branch from 9d7f859 to 2d3b817 Compare February 4, 2026 15:16
Comment on lines 201 to 204
bdk_chain::bitcoin::script::Builder::new()
.push_int(bt.height as i64)
.push_opcode(bdk_chain::bitcoin::opcodes::OP_0)
.into_script()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: shouldn't this one also have the coinbase_aux values ?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this whole coinbase_scriptsig codeblock could be reworked, maybe even be extracted to a helper fn.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Woops, I over-relied on Claude here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@oleonardolima Fixed it. Let me know what you think.

…dress

Refactor block mining in `TestEnv` to use `getblocktemplate` RPC properly:

- Add `MineParams` struct to configure mining (empty blocks, custom
  timestamp, custom coinbase address)
- Add `mine_block()` method that builds blocks from the template with
  proper BIP34 coinbase scriptSig, witness commitment, and merkle root
- Add `min_time_for_next_block()` and `get_block_template()` helpers
- Refactor `mine_empty_block()` to use the new `mine_block()` API
- Include mempool transactions when `empty: false`
@evanlinjin evanlinjin force-pushed the feature/testenv-mine-with-timestamp branch from 2d3b817 to 9620a7d Compare February 6, 2026 06:44
Comment on lines +179 to +182
/// Get the minimum valid timestamp for the next block.
pub fn min_time_for_next_block(&self) -> anyhow::Result<u32> {
Ok(self.get_block_template()?.min_time)
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: currently it's only being used on the tests, is it really needed ? I mean, the same can be achieved directly calling the getblocktemplate.

Comment on lines +204 to +210
let coinbase_scriptsig = {
let mut script = build_coinbase_scriptsig(&bt, false);
// Ensure scriptSig is at least 2 bytes (pad with OP_0 if needed)
if script.len() < 2 {
script = build_coinbase_scriptsig(&bt, true);
};
script
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: it's only being used here, so the padding could be handled directly, but it's not a blocker though.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you mean?

Comment on lines +213 to +247
let coinbase_outputs = if params.empty {
let tx_fees: Amount = bt
.transactions
.iter()
.map(|tx| tx.fee.to_unsigned().expect("fee must be positive"))
.sum();
let value = bt
.coinbase_value
.to_unsigned()
.expect("coinbase_value must be positive")
- tx_fees;
vec![TxOut {
value,
script_pubkey: params.address_or_anyone_can_spend(),
}]
} else {
core::iter::once(TxOut {
value: bt
.coinbase_value
.to_unsigned()
.expect("coinbase_value must be positive"),
script_pubkey: params.address_or_anyone_can_spend(),
})
.chain(
bt.default_witness_commitment
.as_ref()
.map(|s| -> Result<_, HexToBytesError> {
Ok(TxOut {
value: Amount::ZERO,
script_pubkey: ScriptBuf::from_hex(s)?,
})
})
.transpose()?,
)
.collect()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: was this created by claude, or there's an specific reason you need this ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which part are you referring to exactly? It's handy to have the ability to mine empty blocks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Needs Review

Development

Successfully merging this pull request may close these issues.

2 participants